Seltsames Verhalten von \ jobname

Sep 01 2020

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

4 egreg Sep 01 2020 at 19:56

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

4 DonHosek Sep 01 2020 at 18:44

\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