Seltsames Verhalten von \ jobname
Angenommen, ich habe eine Datei mit dem Namen G1 (SK).texenthaltend
\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 es gedruckt distinct, auch wenn der Wert von jobnameist "G1 (SK)". Wenn ich benutze
\expandafter\parse"G1 (SK)"
es funktioniert wie erwartet und druckt equal.
Wie kann ich das beheben?
Antworten
\jobnameerzeugt Zeichen des Kategoriecodes 12, während der Ersatztext von \SKZeichen des Kategoriecodes 11 enthält.
Es gibt verschiedene Möglichkeiten, um das Problem zu lösen. Wenn Sie dies verwenden pdftex, werden e-TeX-Erweiterungen unterstützt
\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 ausnutzen \pdfstrcmp:
\def\parse"#1 (#2)"{\def\filelanguage{#2}}
\expandafter\parse\jobname
\ifnum\pdfstrcmp{SK}{\filelanguage}=0 equal\else distinct\fi
\bye
weil \pdfstrcmpder Zeichenfolgenvergleich unabhängig von Kategoriecodes ist (und Makros in seinen Argumenten erweitert).
In jedem Fall sollten Sie dies nicht tun \def\language, da \languagees 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, erhalte XYZ(X)ich "Undefinierte Sprache".
Der Befehl \checklanguageist vollständig erweiterbar und funktioniert daher in \edef. Das für jede Zeichenfolge auszuführende Token liegt bei Ihnen und Ihrer beabsichtigten Anwendung. Beachten Sie, dass Sie sich nicht um die hinzugefügten Anführungszeichen kümmern müssen, wenn der Name ein Leerzeichen enthält, da in den ersten Zeilen nur die Angaben zwischen den (ersten) Klammern extrahiert werden.
\jobnameWeist allen Zeichen den Kategoriecode 12 zu, außer dem Leerzeichen, wenn es festgelegt ist. Sie können Ihr gewünschtes Ergebnis erzielen, indem Sie Folgendes tun:
{
\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