解析以逗号分隔的带空格的命令名称列表

解析以逗号分隔的带空格的命令名称列表

问题

这个问题与如何指定一长串数学运算符?– 但有一点不同:我想在逗号分隔的列表中允许有空格,如下所示:

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

相关内容