我正在尝试创建一个类似于 \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}