问题
这个问题与如何指定一长串数学运算符?– 但有一点不同:我想在逗号分隔的列表中允许有空格,如下所示:
\newacronyms{acm, ams, cpu, nih}
对于其中的每一个,宏\newacronym
(注意缺少后缀“s”),其定义如下:
\newcommand*\newacronym[1]{
\expandafter\newcommand\csname#1\endcsname[1][]{{\acronymstyle#1}##1\xspace}}
然后我可以在文本中使用首字母缩略词,如下所示:
The \nih is the National Institute of Health.
Modern computers have several \cpu[s].
– 但是\newacronyms
宏观上是什么样子的?
部分解决方案
我让它在没有空格的情况下工作 - 也就是说,它只能这样工作\newacronyms{foo,bar}
:
\newcommand*\newacronyms[1]{
\@for\@i:=#1\do{\expandafter\newacronym\expandafter{\@i}}}
我的方法(不起作用……)
现在我需要一种方法来吞噬宏中的前导空格\@i
,但我已经无计可施了。我最初的想法是,按照下面的思路应该可以做到,但无济于事。
\def\gobble@spaces{\@ifnextchar\space{\@gobble\gobble@spaces}{}}
\newcommand*\newacronyms[1]{
\@for\@i:=#1\do{%
\edef\@ii{\expandafter\gobble@spaces\@i}%
\expandafter\newacronym\expandafter{\@ii}}}
应当指出的是\gobble@spaces
作品在类似的情况下(虽然我不确定为什么......\expandafter
在之前不应该有一个\@gobble
吗?),只是不在上面:
% This WORKS:
\def\mylst{1, 2, 3, 4}
\@for\i:=\mylst\do{print ``\expandafter\gobble@spaces\i''\\}
顺便问一下,内核中是否已经存在等效命令?我无法想象我是第一个需要它的人。
答案1
这里有一个使用该etoolbox
包的解决方案:
\usepackage{etoolbox}
\newcommand*{\newacronym}[1]{\typeout{New acronym: [#1]}}
\newcommand*{\newacronyms}{%
\let\do\newacronym
\docsvlist
}
\newacronyms{acm, ams, cpu, nih}
答案2
在 ConTeXt 中,有一个\processcommalist
用于处理逗号列表的宏。因此,您的示例可以写成
\def\newacronyms#1{\processcommalist[#1]\donewacronyms}
\def\donewacronyms#1%
{\setvalue{#1}{\newacronym{#1}}}
我很确定会有一个 LaTeX 包可以做同样的事情。如果没有,你可以随时复制\进程列表
答案3
为了回答您的小问题:要吞噬宏内部或甚至一串标记周围的空格,请查看 trimspaces 包:
\usepackage{trimspaces} ... \newcommand*\newacronyms[1]{% \@for\@ii:=#1\do{% \trim@spaces@in\@ii \expandafter\newacronym\expandafter{\@ii}}}
答案4
你可以把所有东西都放在一起。你的定义\gobble@spaces
还有很多不足之处。
\documentclass{article}
\usepackage{catoptions}
\usepackage{xcolor,xspace}
\makeatletter
% \docommalist trims leading and trailing spaces in the elements of the list:
\robust@def*\newacronyms#1{%
\docommalist{#1}{%
\ifcsndefinable{##1}\relax
\csn@def{##1}{\aftercsname\cpt@testopt{##1@aux}{}}%
\csn@def{##1@aux}[####1]{{\acronymstyle##1}####1\xspace}%
}%
}
\makeatother
\newacronyms{acm , ams , cpu, nih}
\begin{document}
\def\acronymstyle{\color{red}}
\acm, \ams, \acm[s], \ams[s]
\end{document}