
Angenommen, ich habe eine Datei mit dem G1 (SK).tex
Namen
\def\SK{SK}
\def\parse"#1 (#2)"{\def\language{#2}}
\expandafter\parse\jobname
\ifx\SK\language equal\else distinct\fi
\bye
Wenn ich es ausführe, wird gedruckt distinct
, auch wenn der Wert jobname
ist "G1 (SK)"
. Wenn ich verwende
\expandafter\parse"G1 (SK)"
es funktioniert wie erwartet und druckt equal
.
Wie kann ich das beheben?
Antwort1
\jobname
erzeugt Zeichen des Kategoriecodes 12, während der Ersetzungstext \SK
Zeichen des Kategoriecodes 11 enthält.
Es gibt mehrere Möglichkeiten, mit dem Problem umzugehen. Wenn Sie pdftex
e-TeX-Erweiterungen unterstützen,
\edef\SK{\detokenize{SK}}
\def\parse"#1 (#2)"{\def\filelanguage{#2}}
\expandafter\parse\jobname
\ifx\SK\filelanguage equal\else distinct\fi
\bye
Sie könnten auch Folgendes ausnutzen \pdfstrcmp
:
\def\parse"#1 (#2)"{\def\filelanguage{#2}}
\expandafter\parse\jobname
\ifnum\pdfstrcmp{SK}{\filelanguage}=0 equal\else distinct\fi
\bye
weil \pdfstrcmp
der Zeichenfolgenvergleich unabhängig von Kategoriecodes durchgeführt wird (und Makros in seinen Argumenten erweitert).
Auf jeden Fall sollten Sie dies nicht tun \def\language
, da \language
es sich um ein TeX-Grundelement handelt.
Eine flexiblere Lösung mit expl3
.
\input expl3-generic
\ExplSyntaxOn
\str_new:N \l_bak_file_language_str
\str_set_eq:NN \l_bak_file_language_str \c_sys_jobname_str
\regex_replace_once:nnN { .*? \((.*)\) .* } { \1 } \l_bak_file_language_str
% now the string variable contains the string in parentheses
% extracted from the jobname
\cs_new:Npn \checklanguage
{
\str_case:VnF { \l_bak_file_language_str }
{
{SK}{Language~is~SK}
{AB}{Language~is~AB}
{XYZ}{Language~is~XYZ}
}
{Undefined~language}
}
\ExplSyntaxOff
\checklanguage
\bye
Dies gibt „Sprache ist SK“ aus, aber wenn ich beispielsweise einen anderen Jobnamen verwende, XYZ(X)
erhalte ich „Undefinierte Sprache“.
Der Befehl \checklanguage
ist vollständig erweiterbar und funktioniert daher in \edef
. Welches Token für jeden String ausgeführt werden soll, hängt von Ihnen und Ihrer beabsichtigten Anwendung ab. Beachten Sie, dass Sie sich nicht um die Anführungszeichen kümmern müssen, die hinzugefügt werden, wenn der Name ein Leerzeichen enthält, da die ersten Zeilen nur das extrahieren, was zwischen den (ersten) Klammern steht.
Antwort2
\jobname
weist allen Zeichen außer Leerzeichen den Kategoriecode 12 zu, wenn dieser gesetzt ist. Sie können das gewünschte Ergebnis etwa folgendermaßen erzielen:
{
\catcode`\S=12
\catcode`\K=12
\gdef\sk{SK}
}
\def\parse"#1 (#2)"{\def\language{#2}}
\expandafter\parse\jobname
\ifx\sk\language equal\else distinct\fi
\bye