What's the best way to explode a string into characters, process each character individually, and join them back?
\documentclass{article}
\def\xloop#1{\ifx\relax#1\else\xloopbody{#1}\expandafter\xloop\fi}
\newcommand\explodethenjoin[3]%
{\def\inter{\def\inter{#3}}%
\def\xloopbody##1{\inter#2{##1}}%
\xloop#1\relax
}
\begin{document}
\explodethenjoin{abcdef}{\fbox}{+}
\end{document}
The macro \xloop
iterates over the tokens following it until it encounters \relax
. It has been used several times on this site.
For each token the macro \xloopbody
is executed; by defining it appropriately, the tokens can be processed as needed.
As TeX doesn't really have strings, you do not need any specific commands to split up a token list, it is already a list of distinct tokens. Similarly you don't have to use an explicit loop macro as iterating over a token list is just the normal tex behaviour.
\documentclass{article}
\def\zz#1{\def\zzsep{}\zzz#1\relax}
\def\zzz#1{\ifx\relax#1\else\zzsep\def\zzsep{+}\fbox{#1}\expandafter\zzz\fi}
\begin{document}
\zz{abcdef}
\end{document}
It's a breeze with xparse
:
\documentclass{article}
\usepackage{xparse}
\ExplSyntaxOn
\NewDocumentCommand{\splitstring}{mmO{}}
{
\spraff_string_split:nnn { #1 } { #2 } { #3 }
}
\seq_new:N \l_spraff_string_in_seq
\seq_new:N \l_spraff_string_out_seq
\cs_new_protected:Nn \spraff_string_split:nnn
{
% split the string at 'nothing'
\seq_set_split:Nnn \l_spraff_string_in_seq { } { #1 }
% change each item into '#2{<item>}'
\seq_set_map:NNn \l_spraff_string_out_seq \l_spraff_string_in_seq { #2 { ##1 } }
% use the sequence with '#3' in between items
\seq_use:Nn \l_spraff_string_out_seq { #3 }
}
\ExplSyntaxOff
\NewDocumentCommand{\boxit}{m}{\fbox{\strut#1}}
\begin{document}
\splitstring{abcdef}{\boxit}
\splitstring{abcdef}{\boxit}[${}+{}$]
\end{document}
Beware that the macro used as second argument to \splitstring
should be defined with \NewDocumentCommand
.