You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何为Quarto书籍全局定义LaTeX宏?

在Quarto中跨HTML/PDF文档统一使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.20 06:55:01