r-exams - 使用 mathml 转换器将粗体数学字符转换为 moodle
问题描述
当我的 .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
我认为这个问题已经解决。希望没有其他人有这个问题,我将为我自己的文件使用建议的解决方法之一。谢谢!
解决方案
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 来声明文件的编码方式。看:
- 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
选项结合使用。rmarkdown::pandoc_convert()
R/exams 如何将选项传递给我刚刚修复的函数只有一个小错误。因此,您至少需要 2.4-0exams
版本(撰写本文时的开发版本),然后可以执行以下操作:
exams2moodle(..., converter = "pandoc-mathml-ascii")
它产生moodlequiz.xml
ASCII 而不是 UTF-8。要从 R-Forge 安装 R/exams 的开发版本,您可以执行以下操作:
install.packages("exams", repos = "http://R-Forge.R-project.org")
推荐阅读
- ios - 如何根据内部值对 CSV 字符串进行排序?
- wordpress - WP如何在页面父更改时调用add_meta_box的回调函数
- php - Codeigniter 4 软删除仍在删除数据库记录
- batch-file - 批量复制
- jestjs - jest 可以在测试运行中包含快照,但排除对代码覆盖的贡献吗?
- firebase - 通过按后退按钮关闭应用程序时,Flutter Foreground Service 无法正常工作
- java - 区域设置在android studio Emulator中成功更改,在使用应用程序时在实际设备中没有更改
- java - RecyclerView 项目不重复,但保留其插槽中先前项目的更改
- python - 在 PyTorch 中屏蔽损失函数的最合适方法是什么
- javascript - 我有与内容安全政策相关的问题