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}