使用 mathml 转换器将粗体数学字符转换为 moodle

Bold math characters into moodle with mathml converter

当我的 .Rmd 文件中有 $$\mathbf{x}$$,并且将 exams2moodle 与 pandoc-mathml 转换器一起使用时,xml 文件包含一个“”字符,需要在 moodle 导入测验问题之前替换为“x”字符(因为 moodle 会报错说文件不是没有 BOM 的 UTF-8。)

我想知道最实用的解决方法是什么?这是一个错误吗?谢谢!

最简单的例子:这里是minimal_example.Rmd

Question
========

Stare hard at the variable.
$$\mathbf{x}$$
What is its value?


Solution
========

If you think hard enough, you will know it is 12.

Meta-information
================
extype: num
exsolution: 12
exname: minimal_example
extol: 0

这是minimal_example.r

library("exams")
exams2moodle("minimal_example.Rmd", converter="pandoc-mathml")

并且...这是生成的 .xml 文件的片段。

...
<questiontext format="html">
<text><![CDATA[<p>
<p>Stare hard at the variable. <math display="block" xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mstyle mathvariant="bold"><mi></mi></mstyle><annotation encoding="application/x-tex">\mathbf{x}</annotation></semantics></math> What is its value?</p>
</p>]]></text>
</questiontext>
...

如果我尝试将 XML 导入我学校的 moodle,我会收到 dmlwriteexeption 错误。如果我用“x”替换“”,XML 导入正常。

我相当确定我的 moodlequiz.xml 文件不包含 BOM。

$ file moodlequiz.xml 
moodlequiz.xml: XML 1.0 document, UTF-8 Unicode text, with very long lines
$ hexdump -n 3 -C moodlequiz.xml 
00000000  3c 3f 78                                          |<?x|
00000003

我认为这个问题已经解决了。希望没有其他人有这个问题,我将对我自己的文件使用建议的解决方法之一。谢谢!

TL;DR

exams2moodle(..., converter = "pandoc-mathml") 似乎可以正常工作并生成 UTF-8 编码的 XML 文件 moodlequiz.xml。您这边的问题似乎是由 XML 文件中的 BOM(字节顺序标记)引起的。我不清楚这是通过 exams2moodle() 还是通过您这边的编辑介绍的。

您可以手动删除 BOM,也可以使用 exams2moodle(..., converter = "pandoc-mathml-ascii") 完全避免 UTF-8 编码。后者至少需要软件包的 2.4-0 版本,在撰写本文时,它是 R-Forge.

的开发版本

复制

感谢您提供可重现的示例。我 运行 你的示例代码 - 在 UTF-8 语言环境的 Linux 机器 运行 和 Windows 10 机器上 - 并且可以确认我得到完全相同的 XML 包含 UTF-8 编码粗体 x: 的代码。但是,我可以毫无问题地将它导入我的 Moodle 系统。

问题的可能来源

所以我查看了 Moodle 错误消息的内容。 Moodle 不接受以 BOM(字节顺序标记)开头的 UTF-8 编码文件。一些系统在文件的开头使用 BOM 来声明文件的编码方式。参见:

我在上面提到的两个系统上生产的moodlequiz.xml没有BOM。所以我怀疑你的 R 安装程序生成了一个带有 BOM 的文件,或者 BOM 是稍后插入的,例如,在使用编辑器打开 XML 文件之后。上面的 Moodle 文档提供了一些关于如何检测和删除 BOM 的信息。希望这可以让您最终调试问题。如果 BOM 是由 exams2moodle() 生成的(例如与您的编辑相反)并且您知道如何避免这种情况,请告诉我。

备选方案

原则上可以用相应的 HTML 实体替换 UTF-8 编码的字符。例如,在这种特殊情况下,我们有一个带有 Unicode U+1D431 的“MATHEMATICAL BOLD SMALL X”(参见 https://www.w3.org/Math/characters/bold.html)。因此,我们也可以将其表示为 &#x1D431;(十六进制)或 &#119857;(十进制)。然后 XML 文件可以是 ASCII 格式,同时仍然导致 HTML.

中的相同输出

虽然 pandoc 通常设计为在整个过程中使用 UTF-8,但它也支持某些转换中的(十六进制)十进制转义,请参阅 https://pandoc.org/MANUAL.html#option--ascii。幸运的是,可以将 --mathml--ascii 选项结合使用。 R/exams 如何将选项传递给我刚刚修复的 rmarkdown::pandoc_convert() 函数只有一个小错误。因此,您至少需要 exams 的 2.4-0 版(撰写本文时的开发版本),然后可以执行以下操作:

exams2moodle(..., converter = "pandoc-mathml-ascii")

以 ASCII 而不是 UTF-8 生成 moodlequiz.xml。要从 R-Forge 安装 R/exams 的开发版本,您可以执行以下操作:

install.packages("exams", repos = "http://R-Forge.R-project.org")