Take the 2-minute tour ×
TeX - LaTeX Stack Exchange is a question and answer site for users of TeX, LaTeX, ConTeXt, and related typesetting systems. It's 100% free, no registration required.

I don't know if already exists a question like this, but after 20 minutes I haven't found one.

There are similar ones, like How to define a command that bolds the first letter of each word in the input argument?, but it's not the same as mine.

I'm looking for a command \shortenthis{…} which extracts the first letter of each word in the command. \shortenthis{Leonard Euler} will give us LE. In case of \shortenthis{Pierre de Fermat} it should give PdF.

The idea is to shorten names.

I guess this is “easy” with LaTeX3 (although I'm a newbie, I looked in the documentation, and examples in this site, and couldn't do it), but any solution would be accepted.

share|improve this question
    
Already found an answer. If someone marks this as a duplicate, will delete it. If not, may be it's good for the community to have it here. –  Manuel Mar 1 at 12:15
    
Which question do you think this is a duplicate of? –  egreg Mar 1 at 12:16
    
I don't know, but my memory keeps saying that I have already seen something like this. –  Manuel Mar 1 at 12:16
    
Why don't you use some acronym facility instead of re-inventing things? –  Harish Kumar Mar 1 at 12:17
    
I have an answer ready, shoot if you still need it. :) –  Paulo Cereda Mar 1 at 12:20

2 Answers 2

up vote 5 down vote accepted

Almost a copy of cgnieder's solution in the link I posted.

\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}
share|improve this answer

In this answer, the macro \getargsC extracts each word of the argument into the macros \argi, \argii, etc. Then I set up a loop to grab the first letter of each word with a simple \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}

enter image description here

share|improve this answer

Your Answer

 
discard

By posting your answer, you agree to the privacy policy and terms of service.

Not the answer you're looking for? Browse other questions tagged or ask your own question.