避免在 \renewenvironment 中使用递归

避免在 \renewenvironment 中使用递归

我正在尝试重新定义一个环境,以便在之后添加一个命令,\begin而不必在任何地方手动添加该命令。

例如,我想用\begin{figure}我之前定义的函数\begin{figure}\foo替换每个实例:\foo

\newcommand{foo}{This is foobar}

如果我简单地这样做:

\renewenvironment{figure}{\begin{figure}\foo}{\end{figure}}

然后这将创建一个递归定义figure这个答案建议在使用时使用中间命令来解决递归问题\renewcommand

但是使用时如何解决递归问题\renewenvironment

答案1

修补现有环境或命令几乎是一门黑魔法。必须详细了解环境或命令的工作原理。

即使保存新定义的环境的副本\figure也不会像原始环境那样工作,特别是对于可选参数而言。

放置每次要执行的代码的最佳位置figure\@floatboxreset

然而,由于您只想对 执行此操作figure,因此还有很多事情要做。

\makeatletter
\g@addto@macro\@floatboxreset{\londonrob@floatcode{\@captype}}
\newcommand\londonrob@floatcode[1]{\@nameuse{londonrob@#1code}}
\newcommand\londonrob@figurecode{WHATEVER}
% similarly for \londonrob@tablecode if needed
\makeatother

完整示例

\documentclass{article}

\usepackage{lipsum}

\makeatletter
\g@addto@macro\@floatboxreset{\londonrob@floatcode{\@captype}}
\newcommand\londonrob@floatcode[1]{\@nameuse{londonrob@#1code}}
\newcommand\londonrob@figurecode{WHATEVER}
% similarly for \londonrob@tablecode if needed
\makeatother

\begin{document}

\lipsum[2]

\begin{figure}[htp]

Something else

\caption{A caption}

\end{figure}

\lipsum[3]

\end{document}

当然,WHATEVER您需要添加想要执行的代码。

在此处输入图片描述

答案2

如果您需要向figure环境中添加一些内容,可以尝试以下操作:

\def\foo{This is foobar}
\def\addto#1#2{\expandafter\def\expandafter#1\expandafter{#1#2}}
\addto\figure{\foo}

相关内容