Befehlsargumente auf erlaubte Zeichen überprüfen mit expl3
Ein Befehlsargument, in dem nur bestimmte Zeichen (sagen wir beispielshalber `0`, `1`, `a` und `b`) erlaubt sein sollen, soll vor der weiteren Verarbeitung im Hinblick hierauf überprüft werden.
Idee hierzu: Mit einer for-Schleife wird der gesamte Inhalt des Arguments Zeichen für Zeichen durchlaufen. Innerhalb der Schleife überprüft dann eine case-Anweisung, ob es sich um ein erlaubtes Zeichen handelt. Ansonsten wird ein Fehlercode ausgeführt (hier eine Package-Warnung).
Ich habe eine Umsetzung auf der Grundlage zweier verschiedener expl3-Datenstrukturen (token list und string) versucht, aber beides funktioniert nicht, wie es soll. Bei der String-Variante liegt dies offenbar daran, dass das zweite Argument von `\str_item_ignore_spaces:nn` `\str_set:Nn` nicht expandiert wird, aber ich weiß nicht, was ich ändern muss.
\documentclass{article}
\usepackage[check-declarations]{expl3}
\usepackage{xparse}
\ExplSyntaxOn
\int_new:N \l_zeichenzahl_int
\tl_new:N \l_zeichen_tl
\str_new:N \l_zeichen_str
\cs_new_protected:Npn \test_mit_tl:n #1
{
\int_set:Nn \l_zeichenzahl_int {\str_count_ignore_spaces:n {#1}}
\cs_set:Npn \zeichen_pruefen:n ##1
{
\tl_set:Nn \l_zeichen_tl {\str_item_ignore_spaces:nn {#1} {##1}}
\tl_case:NnF \l_zeichen_tl
{
0 {}
1 {}
a {}
b {}
}
{\PackageWarning{noname}{Falsches~Zeichen:~\l_zeichen_tl}}
}
\int_step_function:nnnN {1} {1} {\l_zeichenzahl_int} \zeichen_pruefen:n
}
\cs_new_protected:Npn \test_mit_str:n #1
{
\int_set:Nn \l_zeichenzahl_int {\str_count_ignore_spaces:n {#1}}
\cs_set:Npn \zeichen_pruefen:n ##1
{
\str_set:Nn \l_zeichen_str {\str_item_ignore_spaces:nn {#1} {##1}}
\str_case:nnF {\l_zeichen_str}
{
{0} {}
{1} {}
{a} {}
{b} {}
}
{\PackageWarning{noname}{Falsches~Zeichen:~\l_zeichen_str}}
}
\int_step_function:nnnN {1} {1} {\l_zeichenzahl_int} \zeichen_pruefen:n
}
\NewDocumentCommand \Befehl {m}
{
\test_mit_tl:n {#1}
\test_mit_str:n {#1}
}
\ExplSyntaxOff
\begin{document}
\Befehl{12ab}
\end{document}