Überarbeitungsverlauf[Zurück]
Klicke auf Einblenden/Ausblenden von Überarbeitungen 2

23 Mai '16, 17:43

Cletus's gravatar image

Cletus
1.6k75867

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}
Klicke auf Einblenden/Ausblenden von Überarbeitungen 1

23 Mai '16, 17:41

Cletus's gravatar image

Cletus
1.6k75867

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` 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}