\renewcommand 的递归使用:如何使其工作?

\renewcommand 的递归使用:如何使其工作?

我正在尝试定义一个命令,该命令能够存储部分内容并在创建新部分时累积它。我目前的尝试如下:

\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}

在此处输入图片描述

相关内容