在文档环境中自动运行 LaTeX3 函数

在文档环境中自动运行 LaTeX3 函数

是否可以定义一个包以便它在整个环境中自动运行 LaTeX3 函数document

如果我定义类似以下的函数:

\cs_new:Npn \demo #1 {
    % Do something.
}

我通常必须将其包装在文本周围,如下所示:

\demo{Some example text.}

是否可以指示该\demo函数影响整个document环境?

答案1

这个问题并不特定于 LaTeX3,因为它是一个更普遍的问题,关于 TeX 如何抓取参数以及 LaTeX 随后提供的包装器。

抓取表单中的参数\demo{Some text}意味着 TeX 必须在处理之前读取所有内容。同时,解析有一个简单的规则:计算括号并读取直到它们平衡。对于环境,情况有所不同:TeX 会不是需要一次性抓取所有环境,因此内存使用量会少很多。(即使使用现代 TeX,抓取整个文档也可能太多了。)因此,环境的开始和结束的工作方式并不直接依赖于“计算开始/结束对”。

可以将整个 LaTeX 环境作为参数:以下包environ将其包装成一个包。但是,我不会使用它来对整个文档应用某些更改。相反,我会使用我们在字体切换命令中看到的方法,其中每个命令都带有一个参数(例如 \emph) 伴随着一个以“持续”意义适用的句子(例如 \itshape)。

答案2

正如约瑟夫所说,对于大型文档来说,这可能不是一个好主意。

但是,正如我在评论中提到的,你可以使用包裹environ收集\BODY文档的从\AtBeginDocument到 的\AtEndDocument。然后,\BODY可以将其传递给所需的宏。

\ApplyToEntireDocument下面应用简单地应用于\textcolor{red}{}整个文档的宏。

在此处输入图片描述

如果可能的话,最好在环境中应用所需的更改,而不是调用另一个宏。

代码:

\documentclass{article} 
\usepackage{etoolbox}
\usepackage{xcolor}
\usepackage{environ}

\newcommand{\ApplyToEntireDocument}[1]{\textcolor{red}{#1}}

\NewEnviron{CollectBody}{%
    \ApplyToEntireDocument{\BODY}%
}%

\AtBeginDocument{\CollectBody}
\AtEndDocument{\endCollectBody}


\begin{document}
This is the start of the document.

Here is a well know equation:
\[
    E = mc^2
\]

And another paragraph.
\end{document}

相关内容