我正在尝试重新定义一个环境,以便在之后添加一个命令,\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}