# expl3 — sort a token list

L A TEX3 comes with a facility to sort list variables (sequences, token lists, or comma-lists) according to some user-defined comparison.

I try to adapt the interface3 manuel example to a token list, but it fails.

! Missing number, treated as zero.

Maybe the argument BCA is counted as one token, that's a second is missing for sorting procedure, but then how to trasform BCA in ABC ?

\documentclass{article}
\usepackage{xparse}

\ExplSyntaxOn

\tl_new:N \l_foo_tl

\NewDocumentCommand{\Sort}{m}{%

\tl_set:Nn \l_foo_tl { #1 }
\tl_sort:Nn \l_foo_tl
{
\int_compare:nNnTF { ##1 } > { ##2 }
{ \sort_return_swapped: }
{ \sort_return_same: }
}

\l_foo_tl

}

\ExplSyntaxOff

\begin{document}

\Sort{BCA}

\end{document}

• You're not comparing numbers – egreg Mar 23 '18 at 21:29
• Are you having uppercase and lowercase letters? The predefined function to convert letters to numbers in expl3 is \int_from_alph:n { a }. – Manuel Mar 24 '18 at 0:23
• No haven't lowercase letters in a name of a triangle and there will be it's no a problem they come after uppercase, the poit to name the triangle allways with the same ABC not BCA, but I call the macro with BCA because it is rectangle in B. Thank you for the convert to number function, what is your idea with this suggestion ? – Tarass Mar 24 '18 at 8:30
• @Tarass egreg finally added that to the answer below. I didn't want to add an answer just to add that idea. – Manuel Mar 24 '18 at 10:38
• @Manuel Yhank you I understand your point now. – Tarass Mar 24 '18 at 14:29

You need to compare numbers. If your input only consists of characters, you can use

<char>


Here's a working code:

\documentclass{article}
\usepackage{xparse}

\ExplSyntaxOn

\tl_new:N \l_tarass_sort_tl

\NewDocumentCommand{\Sort}{m}
{
\tl_set:Nn \l_tarass_sort_tl { #1 }
\tl_sort:Nn \l_tarass_sort_tl
{
\int_compare:nNnTF { ##1 } > { ##2 }
{ \sort_return_swapped: }
{ \sort_return_same: }
}

\tl_use:N \l_tarass_sort_tl
}

\ExplSyntaxOff

\begin{document}

\Sort{BCA}

\end{document}


If you want to consider equal upper and lower case versions of the same letters, use \int_from_alph:n that returns 1 from A or a, 2 from B or b, and so on, so

    \int_compare:nNnTF { \int_from_alph:n { ##1 } } > { \int_from_alph:n { ##2 } }


would sort bCA into AbC, whereas the code above would produce ACb.

• Thank you. I looked for other prefix_compare, but didn't find anything for caracters. Where is  documented and is there some other usefull trick as this one to know, and where to find them ;-) Thank you again. – Tarass Mar 23 '18 at 21:37
• @Tarass Backquote-character is standard TeX syntax for an alphabetical constant, denoting the character’s ASCII code. There are no interfaces for string comparison, at the moment. – egreg Mar 23 '18 at 22:12
• I made a function to reuse the sorting process on characters, it works but I prefer someone check and improve it (there is several type type of functions and other possible mistakes). Do I post it here as an edit or as a new question ? – Tarass Mar 23 '18 at 22:18
• @Tarass There is CodeReview.SE – egreg Mar 23 '18 at 22:30
• The tex tag says : TeX is a typesetting system, where the output is defined by command-sequences. Note that http://tex.stackexchange.com is specifically dedicated to TeX questions.  and is not very active : 29 questions in 4 years. – Tarass Mar 23 '18 at 22:35