Seltsames Verhalten von \jobname

Seltsames Verhalten von \jobname

Angenommen, ich habe eine Datei mit dem G1 (SK).texNamen

\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 jobnameist "G1 (SK)". Wenn ich verwende

\expandafter\parse"G1 (SK)"

es funktioniert wie erwartet und druckt equal.

Wie kann ich das beheben?

Antwort1

\jobnameerzeugt Zeichen des Kategoriecodes 12, während der Ersetzungstext \SKZeichen des Kategoriecodes 11 enthält.

Es gibt mehrere Möglichkeiten, mit dem Problem umzugehen. Wenn Sie pdftexe-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 \pdfstrcmpder 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 \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, XYZ(X)erhalte ich „Undefinierte Sprache“.

Der Befehl \checklanguageist 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

\jobnameweist 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

verwandte Informationen