有限次地重新定义一个变量

有限次地重新定义一个变量

有没有办法有限次地重新定义变量?这是我正在寻找的MWE:

\documentclass[11pt]{article}
\newcommand{\A}{..}
\newcommand{\B}{../\A{}}
% \renewcommand{\A}{\B{}}    % Breaks the build
\newcommand{\SUCCESS}{Success!}
\begin{document}
\section{Test}
\A
\B
\SS
\end{document}

当我取消注释第 4 行时,出现一条错误消息“TeX 容量超出,抱歉 [输入堆栈大小=5000]。[\A]”。

我希望以一种简单的方式完成此操作,无需软件包。如果我删除 \B 定义中的花括号并重新定义 \A,构建就会挂起并且似乎永远无法完成。

我感谢任何帮助/建议。

答案1

如果您的目的是将扩展为的../内容添加到前面\A,那么答案是etoolbox

\documentclass{article}
\usepackage{etoolbox}

\newcommand{\A}{..whatever..}

\begin{document}

\A %% prints ..whatever..

\preto{\A}{../}

\A %% prints ../..whatever..

\end{document}

没有的话etoolbox,标准方式是

\toks0={../}
\toks2=\expandafter{\A}
\edef\A{\the\toks0 \the\toks2 }

如果你这样做

\newcommand{\A}{..}
\newcommand{\B}{../\A}
\renewcommand{\A}{\B}

解释如下。当您最终调用 时\A,TeX 会将其替换为\B,后者又会被 替换../\A。现在../被处理并且宏扩展从 重新开始\A。无限循环。

答案2

这是方法,但我不知道它应该做什么。

\documentclass{article}


\newcommand{\A}{..}
\let\oldA\A
\newcommand{\B}{../\oldA{}}
\renewcommand{\A}{\B{}}    % Now DOESN'T break the build
\newcommand{\SUCCESS}{Success!}


\begin{document}
\section{Test}
\A
\B
\SUCCESS

\end{document}

解决办法是,在命令的帮助下保留命令的旧定义\let,并用它来代替原来的,这样重新定义的命令(\A)就不会调用自身。

相关内容