![\renewcommand 的递归使用:如何使其工作?](https://linux22.com/image/324098/%5Crenewcommand%20%E7%9A%84%E9%80%92%E5%BD%92%E4%BD%BF%E7%94%A8%EF%BC%9A%E5%A6%82%E4%BD%95%E4%BD%BF%E5%85%B6%E5%B7%A5%E4%BD%9C%EF%BC%9F.png)
我正在尝试定义一个命令,该命令能够存储部分内容并在创建新部分时累积它。我目前的尝试如下:
\documentclass{article}
\newcommand{\storedContent}{}
\newcommand{\mySection}[1]{
\section*{#1}
\renewcommand{\storedContent}{#1}
}
\begin{document}
\mySection{one}
\mySection{\storedContent~two}
% \mySection{\storedContent~three}
\end{document}
实际上,我希望它显示:
一
一二
一二三
然而,它只能工作到一一二。当\mySection
第三次调用时,LaTeX 抛出错误:
TeX 容量超出,抱歉 [输入堆栈大小=5000]
我怀疑这是因为,当\renewcommand{\storedContent}{#1}
第二次应用时,它会对自身进行递归操作。可能必须扩展的参数\renewcommand
才能首先检索前一个的内容\storedContent
,但我就是不知道该怎么做……
答案1
您可以添加商品前正在做\section
:
\documentclass{article}
\usepackage{etoolbox}
\newcommand{\storedContent}{}
\newcommand{\mySection}[1]{%
\ifdefempty{\storedContent}
{\gappto\storedContent{#1}}
{\gappto\storedContent{~#1}}%
\section*{\storedContent}
}
\begin{document}
\mySection{one}
\mySection{two}
\mySection{three}
\end{document}
使用etoolbox
只是为了方便;没有包也可以做同样的事情。
答案2
一种方法是这样的(还有其他方法)。逗号只是为了告诉你,在第二次、第三次出现时,你可以做与第一次不同的事。
\documentclass{article}
\newcommand{\storedContent}{}
\makeatletter
\let\storedContent\@empty
\newcommand{\mySection}[1]{%
\section*{#1}
\ifx\storedContent\@empty
\g@addto@macro\storedContent{#1}%
\else
\g@addto@macro\storedContent{, #1}%
\fi
}
\makeatother
\begin{document}
\mySection{one}
\mySection{two}
\mySection{three}
\storedContent
\end{document}