我不知道是否已经存在这样的问题,但 20 分钟后我还没有找到。
还有类似的,比如如何定义一个命令,将输入参数中每个单词的首字母加粗?,不过和我的不一样。
我正在寻找一个命令\shortenthis{…}
,它可以提取命令中每个单词的首字母。\shortenthis{Leonard Euler}
将给我们LE
。如果是,\shortenthis{Pierre de Fermat}
它应该给出PdF
。
这个想法是为了缩短名字。
我猜这对 LaTeX3 来说很“简单”(虽然我是新手,但我查看了文档和本网站中的示例,但做不到),但任何解决方案都会被接受。
答案1
我发布的链接中几乎复制了 cgnieder 的解决方案。
\documentclass{scrartcl}
\usepackage{xparse}
\ExplSyntaxOn
\NewDocumentCommand\shortenthis{ m }
{
\shorten_this:n { #1 }
}
\seq_new:N \l_shorten_seq
\cs_new_protected:Npn \shorten_this:n #1
{
\seq_set_split:Nnn \l_shorten_seq { ~ } { #1 }
\seq_map_inline:Nn \l_shorten_seq
{
\tl_head:n { ##1 }
}
}
\ExplSyntaxOff
\begin{document}
\shortenthis{Pierre de Fermat}
\shortenthis{Leonard Euler}
\end{document}
答案2
在这个答案中,宏\getargsC
将参数的每个单词提取到宏\argi
、\argii
等中。然后我设置了一个循环来用一个简单的\def
\documentclass{article}
\usepackage{readarray}
\usepackage{ifthen}
\newcounter{index}\setcounter{index}{0}
\def\firstletters#1{%
\getargsC{#1}%
\whiledo{\theindex<\narg}{%
\stepcounter{index}%
\edef\nextword{\csname arg\romannumeral\theindex\endcsname}%
\expandafter\getfirst\nextword\relax%
}%
}
\def\getfirst#1#2\relax{#1}
\begin{document}
\firstletters{This is a test of the Emergency Broadcast System.}
\end{document}