# LaTeX3 - Test string equality + Star version

I'm looking for some good advice on switching from (La)TeX to LaTeX3

Here is the first questions corresponding to the toy code below.

1. What is a good way to manage an optional argument with LaTeX3?

2. What is a good way to define star versions with LaTeX3?

\documentclass[12pt,a4paper]{article}

\usepackage{ifthen}

\makeatletter

\newcommand\test{\@ifstar{\@test@star}{\@test@no@star}}

\newcommand\@test@no@star[1]{%
I am a %
\ifthenelse{\equal{#1}{upper}}%
{TSAR}%
{tsar}%
.
}

\newcommand\@test@star{%
I am a star.%
}

\makeatother

\begin{document}

\test{}

\test{upper}

\test*{}

\end{document}


Defining a command with a *-variant is very simple:

\NewDocumentCommand{\test}{sm}{%
\IfBooleanTF{#1}
{% * is present
I am a star.%
}
{% no *
\testupper{#2}%
}%
}


How to define \testupper to check whether the argument is upper? There is no “user level version”, and you need to go to the expl3 level; defining your own comparator is recommended:

\ExplSyntaxOn
\NewExpandableDocumentCommand{\comparestringTF}{mmmm}
{% #1 = input string, #2 = fixed string, #3 = true text, #4 = false text
\str_if_eq:nnTF { #1 } { #2 } { #3 } { #4 }
}
\ExplSyntaxOff

\NewDocumentCommand{\testupper}{m}{%
I am a \comparestringTF{#1}{upper}{TSAR}{tsar}%
}


In these examples you could use \NewExpandableDocumentCommand everywhere, but don't be too fast in employing it.

• Thanks a lot. This should be the 1st question of a long series (I am switching all my packages to LaTeX3 and then I will put it on CTAN). Jul 5, 2021 at 7:35

There isn't really a "LaTeX3" just an up to date LaTeX2e

\documentclass{article}

\NewDocumentCommand\test{s}{\IfBooleanTF{#1}{star}{no star}}

\begin{document}

\test

\test*

\end{document}


• Thanks. That solves half of the problem. It remains to translate the string test. Jul 5, 2021 at 7:20
• @projetmbc oh sorry, I missed that: \str_if_eq:nnTF but I see egreg has already stolen the tick, that will make his day:-) Jul 5, 2021 at 7:46

You'll want to use the xparse capabilities that have been part of LaTeX's kernel since last October. Your definition becomes:

\NewDocumentCommand{\test}{ s }{%
I am a
\IfBooleanTF{#1}
{TSAR}
{tsar}
}


The full dirt on xparse can be had by typing texdoc xparse at a command line or searching for xparse at https://texdoc.org

• Thanks. That solves half of the problem. It remains to translate the string test. Jul 5, 2021 at 7:20