如何在 LaTeX 模板中设置参数?

How to have parameters in the LaTeX template?

我有一个 LaTeX 模板,我将其与 exam2pdf 一起使用,我希望将考试日期作为参数,其值应从 R 传递。这可能吗?

是的,你可以通过两种半的方式做到这一点:

(1) 通过 header 参数

您可以设置 exams2pdf(..., header = ..., template = ...),其中 header 的内容通过替换 %% \exinput{header} 占位符插入到 template 中。因此,在编写模板时,您可以决定 header 代码在 LaTeX 代码中的确切位置,并且可以确保适当的 commands/packages 可用。然后可以通过以下方式指定 header

  • LaTeX 代码: 您可以包含 header = "\command{value}" 之类的内容。可能会有更复杂的 LaTeX 代码片段,涉及多行等。
  • 命令和值列表: 与其使用完整的 LaTeX 代码,不如使用像 header = list(command = "value") 这样的列表规范 R-like。这在内部转换为上述 LaTeX 代码。
  • 函数列表: 最后,你还可以有一个像 header = list(command = valuefun) 这样的规范,其中 valuefun 是一个 function(i) 这样你 return 一个不同的字符串用于第 i 个随机版本考试。
  • 以上所有列表: 也可以使用由未命名字符串、命名字符串和命名函数组成的列表,结合以上所有三种规范。

vignette("exams", package = "exams") 中提供了更多详细信息,其中解释了 exams2pdf() 的设计以及如何利用它。它还包括一些示例,您也可以通过 exams_skeleton(write = "exams2pdf", ...) 将这些示例复制到您的工作目录。您可以查看包中附带的 exam.tex LaTeX 模板,了解如何将日期和 ID(取决于第 i 次迭代)插入 PDF。例如:

exams2pdf("capitals.Rmd", template = "exam.tex",
  header = list(Date = "2022-02-22", ID = function(i) paste("\#", i)))

(2) 编写模板生成器

就你的问题策略而言,我猜 (1) 应该足够了。但是,如果您需要更多地控制 LaTeX 模板中的操作,那么我的建议是编写一个动态模板生成器。 exams2nops() 就是这样设置的。它需要很多可以由用户设置的参数,然后按如下方式进行:

  • 根据用户参数,相应的 nops.tex 模板被写入临时目录。
  • 然后调用exams2pdf(..., template = "/path/to/nops.tex")来使用这个自定义的临时模板。
  • 一些细节,尤其是第 i 个 ID 的计数器仍然通过 header 参数处理。