嵌套宏定义似乎没有扩展参数

嵌套宏定义似乎没有扩展参数

我正在尝试定义一种简单的方法来处理大学论文模板中的关键字。它们用于论文的不同部分,具有不同的符号,所以我决定将它们保存在不同的宏中。我过去也做过类似的事情来保存考官的姓名。

逐个定义它们时效果很好,例如:

\myKeyword{key 1}
\myKeyword{key 2}

然后我尝试创建一个宏,在其中我可以将它们全部声明在一起,但仍然将它们分开(以便进一步使用)。但是,出于某种原因,它没有像我预期的那样工作。

以下是 MWE:

\documentclass{standalone}

\usepackage{tikz} %foreach
\usepackage{forloop} %forloop

% counters declaration
\newcounter{myKeywordCounter}
\newcounter{currentKeywordCounter}

\newcommand{\myKeyword}[1]{%
  \expandafter\newcommand\csname myKeyword\arabic{myKeywordCounter}\endcsname{#1}\relax%
  \stepcounter{myKeywordCounter}%
}%

\newcommand{\declareKeywords}[1]{%
    \foreach \argtext in {#1} {%
        \myKeyword{\argtext}%
    }%
}%

\newcommand{\printKeywords}{\textbf{Keywords}: %
    \forloop{currentKeywordCounter}{0}{\value{currentKeywordCounter} < \value{myKeywordCounter}}%
    {%
        \expandafter\csname myKeyword\arabic{currentKeywordCounter}\endcsname{}. %
    }%
}%

\begin{document}
    \declareKeywords{{key A},{key B},{key C}}
    \myKeyword{key 1}
    \myKeyword{key 2}
    \myKeyword{key 3}
    \printKeywords{}
\end{document}

仅打印键 A、B 和 C,而不打印 1、2 和 3:

在此处输入图片描述

似乎嵌套时,新的“myKeywordX”(X 是阿拉伯数字)无法扩展为 #1。我对此不太确定... 有什么想法吗?

答案1

\foreach永远不会给予等引起的分组\mykeyword0被定义,所以它不会改变。

最简单的方法是使用\global\@namedef\gdef宏以及“\argtext”的扩展值

\documentclass{article}

\usepackage{tikz} %foreach
\usepackage{forloop} %forloop

% counters declaration
\newcounter{myKeywordCounter}
\newcounter{currentKeywordCounter}

\newcommand{\myKeyword}[1]{%
  \expandafter\gdef\csname myKeyword\arabic{myKeywordCounter}\endcsname{#1}\relax%
  \stepcounter{myKeywordCounter}%
}%

\newcommand{\declareKeywords}[1]{%
    \foreach \argtext in {#1} {%
      \expandafter\myKeyword\expandafter{\argtext}%
    }%
}%

\newcommand{\printKeywords}{\textbf{Keywords}: %
    \forloop{currentKeywordCounter}{0}{\value{currentKeywordCounter} < \value{myKeywordCounter}}%
    {%
        \expandafter\csname myKeyword\arabic{currentKeywordCounter}\endcsname{}. %
    }%
}%

\begin{document}
    \declareKeywords{{key A},{key B},{key C}}
  %  \myKeyword{key 1}
  %  \myKeyword{key 2}
  %  \myKeyword{key 3}
    \printKeywords{}
\end{document}

答案2

这种分组\foreach是造成你麻烦的原因。

这是基于的不同实现expl3,其中每个\myKeyword\declareKeywords命令将项目添加到可以稍后处理的序列中。

\documentclass{article}
\usepackage{xparse}

\ExplSyntaxOn

\NewDocumentCommand{\myKeyword}{m}
 {
  \isma_keywords_add:n { #1 }
 }

\NewDocumentCommand{\declareKeywords}{m}
 {
  \clist_map_inline:nn { #1 }
   {
    \isma_keywords_add:n { ##1 }
   }
 }

\NewDocumentCommand{\printKeywords}{}
 {
  Keywords:~
  \seq_map_inline:Nn \g_isma_keywords_seq
   {
    ##1.~
   }
 }

\NewDocumentCommand{\getKeyword}{m}
 {
  \seq_item:Nn \g_isma_keywords_seq { #1 }
 }

\seq_new:N \g_isma_keywords_seq

\cs_new_protected:Nn \isma_keywords_add:n
 {
  \seq_gput_right:Nn \g_isma_keywords_seq { #1 }
 }

\ExplSyntaxOff

\begin{document}

\declareKeywords{key A,key B,key C}

\myKeyword{key 1}
\myKeyword{key 2}
\myKeyword{key 3}

\printKeywords

\getKeyword{2}

\getKeyword{4}

\end{document}

在此处输入图片描述

相关内容