1

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

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

最小示例:这是 minimum_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

这是 minimum_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

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

4

1 回答 1

1

TL;博士

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

您可以手动删除 BOM,也可以使用exams2moodle(..., converter = "pandoc-mathml-ascii"). 后者至少需要软件包的 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选项结合使用。rmarkdown::pandoc_convert()R/exams 如何将选项传递给我刚刚修复的函数只有一个小错误。因此,您至少需要 2.4-0exams版本(撰写本文时的开发版本),然后可以执行以下操作:

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

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

install.packages("exams", repos = "http://R-Forge.R-project.org")
于 2020-08-13T13:07:57.457 回答