将一个宏名称的一部分作为参数传递给另一个宏?

将一个宏名称的一部分作为参数传递给另一个宏?

我将其glossaries-extra用于词汇表。例如,有些键user1…6可用于提供术语的特殊形式(替代复数、不规则动词等)。这对于英语来说可能就足够了,因为英语中大多数名词只有一种单数形式和一种复数形式,形容词和动词几乎不会改变。

然而,德语有很多不同的形式:名词有四种格(主格、属格、与格和宾格),单数和复数都有,即 8 种不同的形式。现在,如果你有一个由形容词修饰的名词组成的术语,你需要考虑 24 种而不是 8 种形式,因为德语形容词的变格可能会有所不同,这取决于它们前面是带有定冠词(英语中的“the”),还是不定冠词(英语中的“a”/“an”),或者根本没有冠词。

因此,我定义了 22 个新键(24 个减去标准单数和复数形式),如下所示:

% Genitive, no article
\glsaddkey*{gen}{\glsentrylong{\glslabel}}
               {\glsentrygen}{\Glsentrygen}
               {\glsgen}
               {\Glsgen}
               {\GLSgen}

% Genitive, definite article
\glsaddkey*{gendef}{\glsgen{\glslabel}}
               {\glsentrygendef}{\Glsentrygendef}
               {\glsgendef}
               {\Glsgendef}
               {\GLSgendef}

每个键定义都会创建新的命令(例如\glsgen\GLSgendef)。将这些键添加到我的词汇表后,我总是可以为正确的情况选择正确的命令。

现在,我已定义了几个用于特殊用途的宏,例如引用担任编辑的机构的缩写(因此一部分链接到词汇表,而另一部分链接到参考书目)。一个简单的示例可能是这个宏,它输出缩写的长形式,后跟包含短形式和附加文本的括号:

\newcommand{\glsappendto}[2]{%
  \glsxtrlong{#1} (\glsxtrshort{#1}; #2)%
}

在文本中,我希望以正确的语法形式使用这些宏,例如\glsgen{#1} (\glsxtrshort{1}; #2}当我需要普通属格时,或者glsgendef{#1} …当我需要定冠词后的属格形式时。但是,我不想为每个需要的宏定义 20 多个新版本(\glsappendtogen\glsappendtogendef等等),这些宏仅在调用的第一个命令上有所不同。

是否可以将宏名的一部分作为参数传递,以便glsappendto将其用作命令?我的意思是

\newcommand{\glasppendto}[3]{%
 \gls#1{#2} (\glsxtrshort{#2}; #3}%
}

然后可以使用如下命令来调用它:

\glsappendto{gen}{label}{additional text}
\glsappendto{gendef}{label}{different additional text}

答案1

回答原始问题(除了其他问题):

可以使用参数生成宏调用或者使用调用名内的其他宏(参考 OP 的示例)

\newcommand{\glasppendto}[3]{%
 \csname gls#1\endcsname{#2} (\glsxtrshort{#2}; #3}%
}

或者更普遍地

\csname foo\endcsname和 一样\foo

如果\foobar扩展为myprettymacroname\csname \foo\endcsname与 相同\myprettymacroname

相关内容