我正在尝试结合给定的参数调用特定命令。这个想法是为了简化繁琐且(半)重复的命令。
举个例子:
\newcommand{\HelloA}{具体内容}
\newcommand{\HelloB}{其他具体内容}
\newcommand{\HelloC}{一些额外的具体内容}
...
\newcommand{\HelloZ}{一些非常奇怪的东西}
\newcommand{\SomeCommand}[1][2][3]{\Hello#1 \Hello#2 \Hello#3}
使用最后一个命令,我想通过赋予它“名称”或完成命令所需的字符来调用我的“\Hello[...]”命令。-> 我想写:
\SomeCommand{A}{C}{Z}
-> 并且它将执行我的 \HelloA、\HelloB 和 \HelloZ 命令
非常感谢您的帮助!
答案1
我会用财产清单来做这件事。
您可以在示例中根据任意名称定义属性列表Hello
并填充它。
然后您可以根据需要提取项目。
\documentclass{article}
\ExplSyntaxOn
\NewDocumentCommand{\makelist}{mm}
{% #1 = list name
% #2 = key-value pairs
\prop_new:c { g_simsalabim_list_#1_prop }
\prop_gset_from_keyval:cn { g_simsalabim_list_#1_prop } { #2 }
}
\NewDocumentCommand{\getfromlist}{+O{~}mm}
{% #1 = optional separator, default a space
% #2 = list name
% #3 = list of keys
\simsalabim_list_get:nnn { #1 } { #2 } { #3 }
}
\seq_new:N \l__simsalabim_list_get_seq
\cs_new_protected:Nn \simsalabim_list_get:nnn
{
% clear the temporary sequence
\seq_clear:N \l__simsalabim_list_get_seq
% populate it by cycling over the last argument
\clist_map_inline:nn { #3 }
{
\seq_put_right:Nx \l__simsalabim_list_get_seq
{
\prop_item:cn { g_simsalabim_list_#2_prop } { ##1 }
}
}
% output the items with the desired separator
\seq_use:Nn \l__simsalabim_list_get_seq { #1 }
}
\ExplSyntaxOff
\makelist{Hello}{
A=something specific,
B=something else specific,
C=something extra specific,
Z=something super weird
}
\begin{document}
With spaces: \getfromlist{Hello}{A,C,Z}
Paragraphs
\getfromlist[\par]{Hello}{Z,B,A}
\end{document}
注意:如果项目包含逗号或字符=
,则必须使用如下所示的括号
X={math, $a=b$},
如果您需要添加到列表(或替换值),您可以执行以下操作。
\documentclass{article}
\ExplSyntaxOn
\NewDocumentCommand{\makelist}{mm}
{% #1 = list name
% #2 = key-value pairs
\prop_new:c { g_simsalabim_list_#1_prop }
\prop_gset_from_keyval:cn { g_simsalabim_list_#1_prop } { #2 }
}
\NewDocumentCommand{\addtolist}{mm}
{% #1 = list name
% #2 = key-value pairs
\prop_gput_from_keyval:cn { g_simsalabim_list_#1_prop } { #2 }
}
\NewDocumentCommand{\getfromlist}{+O{~}mm}
{% #1 = optional separator, default a space
% #2 = list name
% #3 = list of keys
\simsalabim_list_get:nnn { #1 } { #2 } { #3 }
}
\seq_new:N \l__simsalabim_list_get_seq
\cs_new_protected:Nn \simsalabim_list_get:nnn
{
\seq_clear:N \l__simsalabim_list_get_seq
\clist_map_inline:nn { #3 }
{
\seq_put_right:Nx \l__simsalabim_list_get_seq
{
\prop_item:cn { g_simsalabim_list_#2_prop } { ##1 }
}
}
\seq_use:Nn \l__simsalabim_list_get_seq { #1 }
}
\ExplSyntaxOff
\makelist{Hello}{
A=something specific,
B=something else specific,
C=something extra specific,
Z=something super weird
}
\addtolist{Hello}{
X={math, $a=b$},
Y=whatever,
}
\begin{document}
With spaces: \getfromlist{Hello}{A,C,Z,X}
Paragraphs
\getfromlist[\par]{Hello}{Z,B,A,Y}
\end{document}
答案2
如果你的 LaTeX 安装是最新的(2022-06-01
版本),你可以这样做
\newcommand{\SomeCommand}[3]{\UseName{Hello#1} \UseName{Hello#2} \UseName{Hello#3}}