Vergleich von Makros schlägt fehl

Vergleich von Makros schlägt fehl

Ich bin neu bei LaTex und habe von meinen Kollegen ein Problem bekommen. Sie definieren einen Dokumenttyp in einer TeX-Datei (z. B. 'svvr', 'srs', ...). Diese externe Definition entspricht den Zeilen 4 und 5 in meinem Beispielcode (MWE 2).

Nun soll ich anhand dieser externen Definition in meiner TeX-Datei entscheiden, welche dokumentabhängige Verarbeitung erfolgen soll. Dazu habe ich ein MWE geschrieben, um die Auswahl zu testen.

Mein Testcode stammt ursprünglich aus dem Internet und vergleicht den Jobnamen mit einem vorgegebenen String (z.B. "{\detokenize{svvr}"). Meine TeX-Datei habe ich "svvr.tex" genannt, um den Vergleich mit \jobname durchführen zu können.

Mein Problem ist nun, dass wenn ich mit \jobname (MWE 1) vergleiche, die Auswahl korrekt funktioniert.

\documentclass{article}

% Own TeX file:
\begin{document}
    \edef\docTypeExt{\jobname}
    % Specify which document type is to be handled: 'svvr', 'srs', ...
    \edef\docTypeSvvr{\detokenize{svvr}} 
    \edef\docTypeSrs{\detokenize{srs}}

    \textbf{\jobname} 
    \textbf{\docShortcut}
    \textbf{\docTypeSvvr}
    \textbf{\docTypeSrs}
    \newline
    
    \ifx\docTypeExt\docTypeSvvr
        true
    \else
        false: \\
        \jobname \\
        \docShortcut \\
        \docTypeSvvr
    \fi
\newline

    \ifx\docTypeExt\docTypeSrs
        true
    \else
        false: \\
        \jobname \\
        \docShortcut \\
        \docTypeSrs
    \fi

\end{document}

Vergleiche ich jedoch mit der externen Definition meiner Kollegen (MWE 2), schlägt der Vergleich fehl.

\documentclass{article}

% Given code, defined in included TeX file: 'svvr', 'srs', ...
\newcommand { \docpropPTdocShortcut } {svvr}    % Define document type here!
\gdef\docShortcut{\docpropPTdocShortcut}

% Own TeX file:
\begin{document}
    \edef\docTypeExt{\docShortcut}
    % Specify which document type is to be handled: 'svvr', 'srs', ...
    \edef\docTypeSvvr{\detokenize{svvr}} 
    \edef\docTypeSrs{\detokenize{srs}}

    \textbf{\jobname} 
    \textbf{\docShortcut}
    \textbf{\docTypeSvvr}
    \textbf{\docTypeSrs}
    \newline
    
    \ifx\docTypeExt\docTypeSvvr
        true
    \else
        false: \\
        \jobname \\
        \docShortcut \\
        \docTypeSvvr
    \fi
\newline

    \ifx\docTypeExt\docTypeSrs
        true
    \else
        false: \\
        \jobname \\
        \docShortcut \\
        \docTypeSrs
    \fi

\end{document}

Wie muss die Auswahl gestaltet sein, damit diese auch mit der externen Definition klappt?

Ich habe die Definitionen geändert, aber alle bisherigen Versuche sind fehlgeschlagen.

Antwort1

Jedes von gelieferte Zeichentoken \jobnameist von Kategorie 12 (andere). Ausnahme: Leerzeichen (Codepunktnummer 32 sowohl in ASCII als auch in Unicode) sind von Kategorie 10 (Leerzeichen). Dasselbe gilt für von gelieferte Zeichentoken \detokenize.

Die Zeichentoken, die in Ihrem zweiten Beispiel in den Ersetzungstext von eingehen, werden jedoch nicht von oder \docpropPTdocShortcutgeliefert, sondern entstehen dadurch, dass TeX Dinge aus der .tex-Eingabedatei liest und tokenisiert. Dabei wird ein anderes Kategoriencode-Regime angewendet, sodass viele Zeichentoken, die auf diese Weise entstehen, eine andere Kategorie als 12 (andere) haben. Beispielsweise haben Zeichentoken, die auf diese Weise entstehende Buchstaben des Alphabets bezeichnen, normalerweise die Kategorie 11 (Buchstabe).\jobname\detokenize

Somit hat ein Kontrollsequenz-Token \docTypeSvvroder \docTypeSrs, dessen Ersetzungstext nur aus Zeichen-Token besteht, die von \jobnameoder stammen \detokenizeund daher Zeichen-Token der Kategorie 12 (andere) oder Leerzeichen der Kategorie 10 (Leerzeichen) sind, eine andere Bedeutung als eine Kontrollsequenz, \docTypeExtin der dieselben Zeichen mit Kategorie 11 (Buchstabe) tokenisiert wurden.
Somit \ifxführt ein -Vergleich mit Ihrem zweiten Beispiel zum \else-Zweig.

Bei Ihrem zweiten Beispiel können Sie entweder \detokenizebei der Definition von \docTypeSvvr/ weglassen oder bei der Definition \docTypeSrsvon anwenden .\detokenize\@onelevel@sanitize\docTypeExt

\newline, was LaTeX dazu veranlasst, den Absatz weiter zu setzen, aber eine weitere Zeile des Absatzes zu beginnen, gefolgt von einer leeren Zeile, was LaTeX dazu veranlasst, den aktuellen Absatz zu beenden, scheint mir irgendwie überflüssig: Sie erhalten die vertikale \baselineskipvon \newlineund die vertikale, \parskipwenn diese nicht Null ist. Wenn vertikal Null ist und Sie an einigen Stellen einen vertikalen Sprung zwischen den Absätzen wünschen, missbrauchen Sie dies \parskipnicht, sondern verwenden Sie oder oder oder oder oder .\newline\vspace\addvspave\vskip\smallskip\medskip\bigskip

\newcommand { \docpropPTdocShortcut } {svvr}, bei dem \docpropPTdocShortcutnach der Tokenisierung ein Leerzeichen-Token folgt, ist keine gute Praxis. Wenn nicht in ExplSyntax, wo Leerzeichen bereits beim Tokenisieren ignoriert würden, gehen Sie wie folgt vor:
\newcommand{\docpropPTdocShortcut}{svvr}.

Im folgenden Beispiel \detokenizewird die -Route verwendet, sodass Sie sicher mit Makros vergleichen können, deren Ersetzungstext, \jobnamewenn Sie möchten, durch die Erweiterung von gebildet wird.

\documentclass{article}


% Given code, defined in included TeX file: 'svvr', 'srs', ...
%% (In case the TeX file in question does not produce text/a chapter of the document, 
%%  \input might be a better choice than \include ...)

\newcommand{\docpropPTdocShortcut}{svvr}% Define document type here!
\gdef\docShortcut{\docpropPTdocShortcut}

% Own TeX file:
\begin{document}
  \edef\docTypeExt{\docShortcut}%%
  \edef\docTypeExt{\detokenize\expandafter{\docTypeExt}}%%
  %\csname @onelevel@sanitize\endcsname\docTypeExt
  %-----------------------------------------------------------------  
  % Specify which document type is to be handled: 'svvr', 'srs', ...
  \edef\docTypeSvvr{\detokenize{svvr}}%%
  \edef\docTypeSrs{\detokenize{srs}}%%

  \noindent
  \verb|\jobname|: \texttt{\jobname}\\
  \verb|\docShortcut|: \texttt{\meaning\docShortcut}\\
  \verb|\docTypeExt|: \texttt{\meaning\docTypeExt}\\
  \verb|\docTypeSvvr|: \texttt{\meaning\docTypeSvvr}\\
  \verb|\docTypeSrs|: \texttt{\meaning\docTypeSrs}

  \vskip\baselineskip

  \noindent
  \ifx\docTypeExt\docTypeSvvr
      true
  \else
      false:\\
      \jobname\\
      \docShortcut\\
      \docTypeSvvr
  \fi

  \vskip\baselineskip

  \noindent
  \ifx\docTypeExt\docTypeSrs
      true
  \else
      false:\\
      \jobname\\
      \docShortcut\\
      \docTypeSrs
  \fi
\end{document}

verwandte Informationen