我正在尝试定义一种简单的方法来处理大学论文模板中的关键字。它们用于论文的不同部分,具有不同的符号,所以我决定将它们保存在不同的宏中。我过去也做过类似的事情来保存考官的姓名。
逐个定义它们时效果很好,例如:
\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}