使用Mathml转换器将数学字符粗体化为情感 TL; DR 复制问题的可能根源替代解决方案

问题描述

当我的.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")

而且...这是生成的.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导入学校的内容中,则会收到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 moodlequiz.xml而不是UTF-8。要从R-Forge安装R / exams的开发版本,您可以执行以下操作:

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