如何创建逗号分隔列表作为宏或命令的参数?

如何创建逗号分隔列表作为宏或命令的参数?

在下面的 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}}

相关内容