我正在寻找一种方法来为 LaTeX 环境编写一个“装饰器”(用 Python 术语来说)或“包装器”:一种提供附加行为并保存符号的方法。例如,在每次\begin{quote}
执行之前,都会添加一个代码\hrule
。
我可以使用以下单个命令来完成此操作\let
:
\let\oldCommand\commandIWantToDecorate
\def\commandIWantToDecorate#1{<addition code>\oldCommand{#1}}
这将执行<addition code>
而不需要改变整个文档中的命令。
有没有类似的方法来装饰整个环境?也许 LaTeX 会创建一些我可以使用的内部宏?
更新型多巴胺问题我可以重新定义一个命令来包含它自己吗?不能解决我的问题,因为我感兴趣的是重新定义环境,而不是单独的宏。
包裹etoolbox
部分解决了问题,谢谢@samcarter!
但是出于“教育”的原因,我感兴趣的是,是否有一种方法可以在不使用附加软件包的情况下,仅使用(La)TeX 预构建命令来进行装饰?
答案1
LaTeX 内核提供了\g@addto@macro
适用于环境启动命令的命令,即对于环境,quote
启动宏是\quote
,等等\g@addto@macro\quote{foo}
。
除了需要进行的特定添加之外,不需要任何额外的包,但这取决于 OP 的个人选择,但一般来说,“任何东西”都可以放入\g@addto@macro\quote{...}
。
\let\oldquote\quote
\renewcommand{\quote}{fooaddition\oldquote}
也可以正常工作,但对于具有可选参数的其他环境,这可能会失败。在这种情况下,需要\LetLtxMacro
from包,这意味着另一个包。letltxmacro
\documentclass{book}
\makeatletter
\g@addto@macro\quote{\hrule
\medskip
\textit{be careful}
\medskip
Now the real stuff begins\dots
}
\makeatother
\begin{document}
\begin{quote}
test
\end{quote}
\end{document}
答案2
查看etoolbox
包,特别是它的\AtBeginEnvironment
命令。这允许您在环境的开头添加附加代码。
\documentclass{book}
\usepackage{etoolbox}
\AtBeginEnvironment{quote}{\hrule}
\begin{document}
\begin{quote}
test
\end{quote}
\end{document}