在下面的 MWE 中,我尝试创建一个接收参数的命令(但我也尝试使用宏)#1
。在这种情况下,我尝试创建一个逗号分隔的列表。但是,如下图所示,当我通过 调用它时,参数似乎只是\x
列表的一个元素\printKW
,就好像逗号不是真正的逗号一样。如何创建一个存储逗号分隔列表的命令(或宏)以及如何通过另一个命令(或宏)调用它?谢谢你!
\documentclass{article}
\usepackage{pgf, tikz}
\setlength{\parskip}{0.5cm}
\newcommand\KeyWords[1]{\def\@KeyWords{#1}}
\newcommand\printKW{\@KeyWords}
\newcommand{\kwmacro}{Letter, Word, Phrase, Paragraph, Page, Book, Library}
\KeyWords{Letter, Word, Phrase, Paragraph, Page, Book, Library}
\begin{document}
\textbf{Comprehensive knowledge storage follows the evolutionary sequence given by}
\foreach \x [count=\n] in \kwmacro {(\n) \x, }
\textbf{while the access to it follows the reverse order.}
\textbf{Keywords:}
\foreach \x [count=\n] in \printKW {\n.~\x. }
\end{document}
答案1
PGF foreach 循环中的宏仅展开一次,但\printKW
需要两步才能展开到列表。可以通过修补内部宏来修复 foreach 循环的所有实例。这里我介绍了一种检查宏是否可展开的方法,如果可以,则f
对其进行完全展开(expl3 类型)。
您还需要\makeatletter ... \makeatother
围绕您的定义,否则您将覆盖其定义,\@
这可能会导致以后出现神秘的错误。
\documentclass{article}
\usepackage{tikz}
\makeatletter
\def\pgfutil@ifexpandable#1{%
\expandafter\ifx\noexpand#1#1%
\expandafter\pgfutil@firstoftwo
\else
\expandafter\pgfutil@secondoftwo
\fi
}
\def\pgffor@macro@list#1{%
\pgfutil@ifexpandable#1%
{\expandafter\pgffor@normal@list\expandafter{\romannumeral-`0#1}}%
{\expandafter\pgffor@normal@list\expandafter{#1}}}
\makeatother
\setlength{\parskip}{0.5cm}
\makeatletter
\newcommand\KeyWords[1]{\def\@KeyWords{#1}}
\newcommand\printKW{\@KeyWords}
\makeatother
\newcommand{\kwmacro}{Letter, Word, Phrase, Paragraph, Page, Book, Library}
\KeyWords{Letter, Word, Phrase, Paragraph, Page, Book, Library}
\begin{document}
\textbf{Comprehensive knowledge storage follows the evolutionary sequence given by}
\foreach \x [count=\n] in \kwmacro {(\n) \x, }
\textbf{while the access to it follows the reverse order.}
\textbf{Keywords:}
\foreach \x [count=\n] in \printKW {\n.~\x. }
\end{document}
也许甚至有必要放弃可扩展性检查,而直接使用
\def\pgffor@macro@list#1{%
\expandafter\pgffor@normal@list\expandafter{\romannumeral-`0#1}}