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 \jobname
ist 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 \docpropPTdocShortcut
geliefert, 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 \docTypeSvvr
oder \docTypeSrs
, dessen Ersetzungstext nur aus Zeichen-Token besteht, die von \jobname
oder stammen \detokenize
und daher Zeichen-Token der Kategorie 12 (andere) oder Leerzeichen der Kategorie 10 (Leerzeichen) sind, eine andere Bedeutung als eine Kontrollsequenz, \docTypeExt
in der dieselben Zeichen mit Kategorie 11 (Buchstabe) tokenisiert wurden.
Somit \ifx
führt ein -Vergleich mit Ihrem zweiten Beispiel zum \else
-Zweig.
Bei Ihrem zweiten Beispiel können Sie entweder \detokenize
bei der Definition von \docTypeSvvr
/ weglassen oder bei der Definition \docTypeSrs
von 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 \baselineskip
von \newline
und die vertikale, \parskip
wenn 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 \parskip
nicht, sondern verwenden Sie oder oder oder oder oder .\newline
\vspace
\addvspave
\vskip
\smallskip
\medskip
\bigskip
\newcommand { \docpropPTdocShortcut } {svvr}
, bei dem \docpropPTdocShortcut
nach 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 \detokenize
wird die -Route verwendet, sodass Sie sicher mit Makros vergleichen können, deren Ersetzungstext, \jobname
wenn 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}