如何在 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
参数处理。
我有一个 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
参数处理。