在 Latex 中结合参数调用特定命令

在 Latex 中结合参数调用特定命令

我正在尝试结合给定的参数调用特定命令。这个想法是为了简化繁琐且(半)重复的命令。

举个例子:

\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}}

相关内容