有没有办法批量创建 \newcommands?

有没有办法批量创建 \newcommands?

在我的文档开头,我倾向于列出一长串我定义的宏,如下所示

\newcommand{\Cat}{\textup{Cat}}

\newcommand{\Dog}{\textup{Dog}}

\newcommand{\Grape}{\textup{Grape}}

...

等等。有没有办法可以将其压缩成单个命令,给出一个单词列表以转换为宏,例如类似以下假代码的东西?

list = {Cat,Dog,Grape, ... }

for all elements e of the list, \newcommand{\e}{\textup{e}} 

答案1

\ExplSyntaxOn

\NewDocumentCommand{\massdefine}{m}
 {
  \clist_map_inline:nn { #1 }
   {
    \cs_new_protected:cpn { ##1 } { \textup{##1} }
   }
 }

\ExplSyntaxOff

\massdefine{Cat,Dog,Grape}

该函数\clist_map_inline:nn对给定列表中的项目进行循环;在每个循环中,项目用 表示#1(这里是##1因为我们处于定义中)。\cs_new_protected:cpn在执行命令定义之前,第一个参数会转换为控制序列名称。

假设,为了在文档中获得更好的证据,你想定义\CAT等等,你可以修改为

\ExplSyntaxOn

\NewDocumentCommand{\massdefine}{m}
 {
  \clist_map_inline:nn { #1 }
   {
    \cs_new_protected:cpn { \str_uppercase:n { ##1 } } { \textup{##1} }
   }
 }

\ExplSyntaxOff

\massdefine{Cat,Dog,Grape}

那就这样\CAT\textup{Cat}

另一方面,

\newcommand{\KW}[1]{\textup{#1}}

并使用

\KW{Cat}

从长远来看可能更好。


回答评论中的后续问题:

\documentclass{article}

\ExplSyntaxOn

\NewDocumentCommand{\massdefine}{m}
 {
  \clist_map_inline:nn { #1 }
   {
    \cs_new_protected:cpx { ##1 } { \exp_not:N \textup { \tl_range:nnn { ##1 } { 1 } { -2 } } }
   }
 }

\ExplSyntaxOff

\massdefine{Cat,Dog,Grape}

\begin{document}

A \Cat

A \Dog

A \Grape

\end{document}

最后一个字母在定义时被吞噬,使用\cs_new_protected:cpx它来扩展内容,因此\tl_range:nnn可以完成它的工作;第二个参数是起点,第三个参数是终点,-2表示倒数第二项(从末尾开始第二个)。

在此处输入图片描述

对于这些关键词的复杂处理,请定义您自己的格式化程序。

\documentclass{article}

\NewDocumentCommand{\genericformatter}{m}{%
  \textbf{\textup{#1}}%
}

\ExplSyntaxOn

\NewDocumentCommand{\massdefine}{m}
 {
  \clist_map_inline:nn { #1 }
   {
    \cs_new_protected:cpx { ##1 } { \genericformatter { \tl_range:nnn { ##1 } { 1 } { -2 } } }
   }
 }

\ExplSyntaxOff

\massdefine{Cat,Dog,Grape}

\begin{document}

A \Cat

A \Dog

A \Grape

\itshape A \Cat

\end{document}

在此处输入图片描述

答案2

使用\clist_map_inline:nnfromexpl3可以轻松做到这一点:

\documentclass{article}

\ExplSyntaxOn
\clist_map_inline:nn { Cat, Dog, Umbrella }
  {
    \exp_args:Nc \newcommand {#1} { \textup {#1} }
  }
\ExplSyntaxOff

\begin{document}
\textit{\Cat\ and \Dog}.
\end{document}

但我更喜欢使用一些标记来代替@PhelypeOleinik推荐

答案3

它听起来很像缩写词或词汇表,即缩写命令。或关键词。

根据符号的长度,如果短版本/长版本比率方法可以节省打字时间,则可以使用属性列表。

b 代表熊

平均能量损失

\documentclass{article}
\usepackage{xparse}
\ExplSyntaxOn

\NewDocumentCommand { \kwloadaprop } { +m } { 

    \prop_gset_from_keyval:Nn 
            \g_tmpa_prop
            { #1 }
}



\NewDocumentCommand { \KW } { m }
 {
            \tl_clear:N \l_tmpa_tl
            
                    \prop_get:NnNTF
                            \g_tmpa_prop
                            { #1 }
                            \l_tmpa_tl
                            { 
                           >>
                            \text_uppercase:n { \tl_use:N \l_tmpa_tl }
                           <<                           
                             }
                            { #1 ~ not ~ found }


 }

\ExplSyntaxOff

\kwloadaprop{
cat=cat
,dog=dog
,grape=grape
,sr=Schokoladenregenschirme 
,b=Bär or x-ray
,num1=123-4
}

\begin{document}


b $\mapsto$ \KW{b}

num1 $\mapsto$ \KW{num1}

sr $\mapsto$ \KW{sr}

b2 $\mapsto$ \KW{b2}


\end{document}

相关内容