问题描述
当我的.Rmd文件中有$$ \ mathbf {x} $$,并在pandoc-mathml转换器中使用testss2moodle时,xml文件包含一个“?”字符,需要将其替换为“ x” ”(“ moodle”前的字符将导入测验问题(因为“ 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-@R_358_4045@ion
================
extype: num
exsolution: 12
exname: minimal_example
extol: 0
这是minimal_example.r
library("exams")
exams2moodle("minimal_example.Rmd",converter="pandoc-mathml")
...
<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导入学校的内容中,则会收到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表来声明文件的编码方式。参见:
- Moodle文档:https://docs.moodle.org/39/en/UTF-8_and_BOM
- 具有一般信息的维基百科:https://en.wikipedia.org/wiki/Byte_order_mark
我在上述两个系统上生产的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)。因此,我们也可以将其表示为𝐱
(十六进制)或𝐱
(十进制)。这样,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 moodlequiz.xml
而不是UTF-8。要从R-Forge安装R / exams的开发版本,您可以执行以下操作:
install.packages("exams",repos = "http://R-Forge.R-project.org")