如何将 r-exams 问题中的小数分隔符更改为逗号?
How do I change the decimal separator in r-exams question to comma?
我试图在使用“r-exams/sweave”创建的问题中显示逗号作为小数点分隔符。但是,我无法加载 siunitx 包或进行任何其他允许此更改的配置。我打算使用函数 exams2moodle 将问题导出到 moodle。
通过 LaTeX 包
LaTeX 包如 siunitx
或 icomma
只能在通过 LaTeX 生成输出时使用(例如,exams2pdf
等)。但是,当 LaTeX 代码转换为 HTML(例如 exams2moodle
)时,我不知道将带小数点的数字转换为十进制逗号的通用解决方案。
通过 options(OutDec = ",")
在 R
然而,相对简单的是在 R 中设置 options(OutDec = ",")
。只要满足以下条件就可以工作:
- 所有相关数字要么在文本中用逗号 hard-coded,要么分别用
r ...
或 \Sexpr{...}
动态生成,
- 保证
num
习题中的exsolution
仍然使用小数点
例如,考虑 schoice
练习 deriv2。它满足以上两项:1.所有数字都是从 R 动态插入的,2.它不是 num
练习。
library("exams")
options(OutDec = ",")
exams2html("deriv2.Rmd")
同样适用于练习的 Rnw 版本。
如果练习应该 总是 生成带逗号的数字,您还可以在练习文件开头的第一个代码块中包含 options(OutDec = ",")
并且在末尾的代码块中恢复为 options(OutDec = ".")
。
使用num
练习deriv也是可以的。但是为了确保第 2 项。您需要在 exsolution
中写入 fmt(res, decimal.mark = ".")
而不是仅 fmt(res)
,或者在添加 meta-information 之前恢复为 options(OutDec = ".")
。
通过 fmt(..., decimal.mark = "{,}")
在 R
上述方法的一个小缺点是,注意细节的观众可能会注意到在 LaTeX 数学模式 $...$
中,逗号后插入了一个小的 space。有关示例,请参见上面的屏幕截图。
如果要避免这种情况,则需要使用{,}
作为小数点分隔符。不幸的是,options(OutDec)
不支持这个,因为它需要是长度为 1 的字符串。另外,OutDec
可能不够,因为数学模式中的数字需要 {,}
,而纯文本中的数字需要只是 ,
.
在这种情况下,最简单的解决方案是将 options(OutDec)
保留为系统默认值。相反,在数学模式中使用 fmt(..., decimal.mark = "{,}")
作为数字,在纯文本中使用 fmt(..., decimal.mark = ",")
。为了减少打字,您还可以添加两个方便的功能,比如:
cfmt <- function(x, ...) fmt(x, ..., decimal.mark = ",")
mfmt <- function(x, ...) fmt(x, ..., decimal.mark = "{,}")
如果您想自己处理任何舍入,您还可以使用函数 base::format(..., decimal.mark = ...)
,而不是构建在 exams::fmt()
函数上。
要求
请注意,将 decimal.mark
传递给 fmt()
至少需要 R/exams 的 2.4-0 版本。在撰写本文时,这是 R-Forge 提供的当前开发版本,但很快将发布到 CRAN。
我试图在使用“r-exams/sweave”创建的问题中显示逗号作为小数点分隔符。但是,我无法加载 siunitx 包或进行任何其他允许此更改的配置。我打算使用函数 exams2moodle 将问题导出到 moodle。
通过 LaTeX 包
LaTeX 包如 siunitx
或 icomma
只能在通过 LaTeX 生成输出时使用(例如,exams2pdf
等)。但是,当 LaTeX 代码转换为 HTML(例如 exams2moodle
)时,我不知道将带小数点的数字转换为十进制逗号的通用解决方案。
通过 options(OutDec = ",")
在 R
然而,相对简单的是在 R 中设置 options(OutDec = ",")
。只要满足以下条件就可以工作:
- 所有相关数字要么在文本中用逗号 hard-coded,要么分别用
r ...
或\Sexpr{...}
动态生成, - 保证
num
习题中的exsolution
仍然使用小数点
例如,考虑 schoice
练习 deriv2。它满足以上两项:1.所有数字都是从 R 动态插入的,2.它不是 num
练习。
library("exams")
options(OutDec = ",")
exams2html("deriv2.Rmd")
同样适用于练习的 Rnw 版本。
如果练习应该 总是 生成带逗号的数字,您还可以在练习文件开头的第一个代码块中包含 options(OutDec = ",")
并且在末尾的代码块中恢复为 options(OutDec = ".")
。
使用num
练习deriv也是可以的。但是为了确保第 2 项。您需要在 exsolution
中写入 fmt(res, decimal.mark = ".")
而不是仅 fmt(res)
,或者在添加 meta-information 之前恢复为 options(OutDec = ".")
。
通过 fmt(..., decimal.mark = "{,}")
在 R
上述方法的一个小缺点是,注意细节的观众可能会注意到在 LaTeX 数学模式 $...$
中,逗号后插入了一个小的 space。有关示例,请参见上面的屏幕截图。
如果要避免这种情况,则需要使用{,}
作为小数点分隔符。不幸的是,options(OutDec)
不支持这个,因为它需要是长度为 1 的字符串。另外,OutDec
可能不够,因为数学模式中的数字需要 {,}
,而纯文本中的数字需要只是 ,
.
在这种情况下,最简单的解决方案是将 options(OutDec)
保留为系统默认值。相反,在数学模式中使用 fmt(..., decimal.mark = "{,}")
作为数字,在纯文本中使用 fmt(..., decimal.mark = ",")
。为了减少打字,您还可以添加两个方便的功能,比如:
cfmt <- function(x, ...) fmt(x, ..., decimal.mark = ",")
mfmt <- function(x, ...) fmt(x, ..., decimal.mark = "{,}")
如果您想自己处理任何舍入,您还可以使用函数 base::format(..., decimal.mark = ...)
,而不是构建在 exams::fmt()
函数上。
要求
请注意,将 decimal.mark
传递给 fmt()
至少需要 R/exams 的 2.4-0 版本。在撰写本文时,这是 R-Forge 提供的当前开发版本,但很快将发布到 CRAN。