# Creating a command that concatenates an input string token by token

Using (first of all) xparse I want to create a command like this:

\DeclareDocumentCommand{\c}{ s > { \SplitList { ; } } r""}
{
% do something
}


It basically should just do the following:

• convert "f;g;h;..." to f » g » h » ..., if s is false (no star is given)
• convert "f;g;h;..." to fgh..., if s is true (a star is given)

The whole purpose is being able to redefine the command to basically reverse the order, that is:

• convert "f;g;h;..." to ... « h « g « f, if s is false (no star is given)
• convert "f;g;h;..." to ...hgf, if s is true (a star is given)

How can I nicely do this using "high-level functions"? I am already using xparse, xstring and I am thinking etoolbox or something similar might help. I do not really want to deal with "low-level" TeX programming, if that makes any sense.

• Is there any particular reason for using a delimited argument instead of the standard braces? – egreg Jan 18 '16 at 20:48
• @egreg Not particularly. I guess it looks better and it is little bit easier to type. Oh, it also may improve readibility, when you have nested commands (when you use multiple kinds of delimiters). – Stefan Perko Jan 18 '16 at 21:31

Not really 'high-level' but since xparse is used anyway and SplitList is expl3 anyway:

The \convert command uses the first starred argument for the f>g>h splitting and the third argument is for reversal of the order.

It uses a \seq_... variable and splits the input by ; into tokens and glues them together (or replaces effectively ; by >) and eventually reverses the order.

\documentclass{article}
\usepackage{xparse}

\ExplSyntaxOn

\DeclareDocumentCommand{\convert}{sr""s}
{
\seq_set_split:Nnn \l_tmpa_seq {;} {#2}
\IfBooleanT{ #3 }{%
\seq_reverse:N \l_tmpa_seq
}
\IfBooleanTF{#1}{%
\seq_use:Nn \l_tmpa_seq {}%
}{%
\seq_use:Nn \l_tmpa_seq {$>$}
}
}
\ExplSyntaxOff
\begin{document}
\convert"f;g;h"

\convert*"f;g;h"

\convert*"f;g;h"*

\convert"f;g;h"*

\end{document}