在类文件中添加到宏

在类文件中添加到宏

我正在尝试创建一个类似于 \author 在 article 类中的工作方式的命令(我不明白这是如何在 article.cls 中实现的)。该函数必须接受两个参数,并在使用 \addToContainer 命令时扩展 \container 变量。这是我的尝试:

\documentclass{test}

\addToContainer{First Arg 1}{First Arg 2}
\addToContainer{Second Arg 1}{Second Arg 2}
\title{Test article}

\begin{document}
The container contains the following: 

\printContainer
\end{document}

使用以下类文件

\ProvidesClass{test}

\LoadClass{article}

\let\containerSep\@empty%
\def\container{}%
\def\@addToContainer[#1]#2{\g@addto@macro\container{%
      \containerSep#1:~#2\def\containerSep{\unskip,\hspace{1em}}}}% 

\newcommand{\printContainer}{%
\container
}

预期输出应为

在此处输入图片描述

答案1

这与实现方式无关\author。文档中的 的扩展\maketitle使用了预定义的宏\@author,会导致错误。当您写入\author{Name}之前\maketitle,TeX 会将其扩展为\def\@author{Name},并且调用\maketitle不会出现任何错误,但会打印作者的姓名。

话虽如此,以下是您想要的可能实现。我更喜欢使用标记列表以避免扩展问题。我没有先将分隔符定义为空,然后再\addToContainer重新定义它,而是让它\addToContainer在第一次调用时重新定义自己。

\documentclass{article}

\makeatletter

\newtoks\@container
\def\container{\the\@container}

\def\addToContainer#1#2{%
   \@bsphack
   \@container{\ignorespaces#1\unskip:~\ignorespaces#2\unskip}%
   \def\addToContainer##1##2{%
      \@bsphack
      \@container\expandafter{\the\@container,\hspace{1em}\ignorespaces##1\unskip:~\ignorespaces##2\unskip}%
      \@esphack
   }%
   \@esphack
}

\makeatother

\begin{document}

\parindent=0pt
\parskip=\bigskipamount

This should be empty: (\container)

\addToContainer{Call 1 Arg 1}{Call 1 Arg 2}
(\container)

% see that spaces are ignored
\addToContainer{ Call 2 Arg 1 }{ Call 2 Arg 2 }
(\container)

\addToContainer{Call 3 Arg 1}{Call 3 Arg 2}
(\container)

% the \@bsphack and \@esphack ensure that no space is introduced in the output
See \addToContainer{Foo}{Bar} this\\
(\container)

\end{document}

在此处输入图片描述

相关内容