在我的文档开头,我倾向于列出一长串我定义的宏,如下所示
\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:nn
fromexpl3
可以轻松做到这一点:
\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
它听起来很像缩写词或词汇表,即缩写命令。或关键词。
根据符号的长度,如果短版本/长版本比率方法可以节省打字时间,则可以使用属性列表。
平均能量损失
\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}