无法将简单新命令的输出用作另一个命令的输入

无法将简单新命令的输出用作另一个命令的输入

我正在尝试做一些[似乎应该]非常简单的事情,但似乎不起作用,感谢指导!简而言之,我想定义一些标签列表,以便\usetag从标记包传递给命令(https://ctan.math.illinois.edu/macros/latex/contrib/tagging/tagging.pdf)基本上取代:

\usepackage{tagging}

\usetag{topic 1, topic 2, topic 3, etc.}

\usepackage{tagging}

\newcommand{\alltaggedtopics}{topic 1, topic 2, topic 3, etc.}

\usetag{\alltaggedtopics}

然后设置更多标签组,并有类似

\usepackage{tagging}

\newcommand{\alltaggedtopics}{topic 1, topic 2, topic 3, etc.}

\newcommand{\alltaggedauthors}{author 1, author 2, author 3, etc.}

\usetag{\alltaggedtopics, \alltaggedauthors} 

但是,通过 newcommmands 执行此操作会导致 usetag 被设置为空。我确信我犯了一个非常根本的错误,非常感谢帮助我确定它是什么。

克里斯

答案1

\usetag想要查看标签列表,而不是标签容器。

由于标签应该是简单的字母数字字符串,因此使用\edef它们是安全的。解决该问题的最简单代码是expl3

\usepackage{expl3}

\ExplSyntaxOn
% get an internal version of \usetag
\cs_new_eq:NN \chris_usetag:n \usetag
% we can define a variant with x-expansion
\cs_generate_variant:Nn \chris_usetag:n { x }
% define a user level command
\cs_new_eq:NN \xusetag \chris_usetag:x
\ExplSyntaxOff

在这之后,

\xusetag{\alltaggedtopics, \alltaggedauthors} 

\usetag其工作方式与传递两个宏中包含的列表一样。

等效版本可能是

\ExplSyntaxOff
\cs_new_protected:Npn \xusetag #1 { \exp_args:Nx \usetag { #1 } }
\ExplSyntaxOff

但从概念上来说,定义一个变体更好。

经典的实现可能是

\newcommand{\xusetag}[1]{%
   \begingroup\edef\x{\endgroup\noexpand\usetag{#1}}\x
}

相关内容