有没有办法有限次地重新定义变量?这是我正在寻找的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
)就不会调用自身。