是否可以定义一个包以便它在整个环境中自动运行 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}