环境装饰器

环境装饰器

我正在寻找一种方法来为 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}

也可以正常工作,但对于具有可选参数的其他环境,这可能会失败。在这种情况下,需要\LetLtxMacrofrom包,这意味着另一个包。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}

相关内容