如何为Quarto书籍全局定义LaTeX宏?
[最新编辑见文末]
我正在制作一本可同时渲染为HTML和PDF格式的Quarto书籍,HTML由多个独立的qmd文件对应多页面构成。需要在整本书中使用通过\newcommand定义的一组LaTeX宏,LaTeX由MathJax渲染。
我尝试了三种不同方法:
方法A:在每个
qmd文件开头插入宏定义。这种方式下宏能正常显示,但存在两个缺点:每个qmd文件中重复大量宏定义,且XeTeX会报命令已定义的错误。方法B:将宏定义在单独的
macros.qmd文件中,然后在其他qmd文件开头插入以下代码调用该公共文件:{{< include macros.qmd >}}此方法在HTML中能正确生成宏,但XeTeX仍会报命令已定义错误——将
\newcommand替换为\providecommand可解决该问题。方法C:在
_quarto.yml文件中使用include-in-body:或类似选项调用macros.qmd文件,例如:format: html: include-in-body: macros.qmd或
format: html: include-in-body: - text: {{< include macros.qmd >}}但渲染器似乎未加载这些宏定义(XeTeX也无法识别它们)。
我想知道是否存在一种同时适用于HTML和XeTeX、且能避免作者端文本冗余(如重复定义或调用外部文件)的简单解决方案。我认为许多使用Quarto撰写数学/物理内容的作者都会遇到这个问题。
2024年4月编辑
在Quarto 1.4.549版本中,对我有效的唯一解决方案是上述的方法B:我将宏定义在一个或多个单独的macros.qmd文件中,然后在页面开头使用{{< include macros.qmd >}}调用它们。这样可以一次性调用所有常用宏,但需要在每个页面重新调用。
macros.qmd文件开头有::: {.hidden}标记。需要注意的是,\newcommand宏必须在数学环境$$...$$外部声明才能生效;反之,\DeclarePairedDelimiters和\DeclareMathOperator必须在数学环境$$...$$内部声明才能生效。
以下是我的一个macros.qmd文件的简化示例:
::: {.hidden} \newcommand*{\e}{\mathrm{e}} \renewcommand{\P}{\mathrm{P}} $$ \DeclarePairedDelimiters{\set}{\{}{\}} \DeclareMathOperator*{\argmax}{argmax} $$ \definecolor{quarto-callout-note-color}{HTML}{4477AA} :::
希望这能有所帮助。也许在Quarto的更新版本中情况已有所变化,我目前已不再使用它。当涉及大量数学内容时,LaTeX & PDF仍是最佳选择。
内容的提问来源于stack exchange,提问作者pglpm

