Was verursacht dieses außer Kontrolle geratene Argument beim Versuch, \jobname zu analysieren?

Was verursacht dieses außer Kontrolle geratene Argument beim Versuch, \jobname zu analysieren?

Ich versuche, den Jobnamen meines (Xe)LaTeX-Dokuments zu analysieren, um ein True/False-Flag für die spätere Verwendung zu setzen. Ich bin aufdiese Lösungwas vielversprechend erschien und was ich umgesetzt habe (siehe folgendes MWE).

\documentclass{report}

\newif\ifFraktur
\makeatletter%
\newcommand{\filenameparse}[1]{\expandafter\filename@parse@#1\@nil}%
\def\filename@parse@#1_#2\@nil{%
   \gdef\filenameflag{#2}%
}%
\makeatother
\filenameparse{\jobname}%

\if{f}\filenameflag{%
   \Frakturtrue}%
\else{%
   \Frakturfalse}%
\fi%

\begin{document}

\ifFraktur{We have an f document}%
\else{We have an a document.}%
\fi
\end{document}

Der Dateiname dieser Datei ist mwe-1-0_a.texder, der dem entspricht, was ich für meine eigentliche Datei verwenden werde ( version-m-n_f.tex, wobeimUndnsind Platzhalter für die Versionsnummern undfaist ein Platzhalter für die Flagge, die entweder oder sein kann f).

Wenn ich dies ausführe, erhalte ich die folgende Fehlermeldung:

Runaway argument?
mwe-1-0_a\@nil
! Paragraph ended before \filename@parse@ was complete.
<to be read again>
                   \par
l.11

Durch das Ignorieren des Fehlers (Aufrufen von enter) konnte das Dokument ohne weitere Fehler kompiliert werden.

Um dem Problem auf den Grund zu gehen, beschloss ich, diebereits verlinkte Antwort, aber ich habe es leicht wie folgt abgeändert:

\documentclass{article}

\makeatletter
\newcommand{\filenameparse}[1]{\expandafter\filename@parse@#1\@nil}
\def\filename@parse@#1_#2_#3\@nil{%
  \gdef\fileA{#1}% first part
  \gdef\fileB{#2}% middle part
  \gdef\fileC{#3}% final part
}
\makeatother

\filenameparse{\jobname}

\begin{document}

\fileA \par
\fileB \par
\fileC
\end{document}

Überraschenderweise erzeugt dies nicht nur ein außer Kontrolle geratenes Argument, sondern auch keines der drei Makros \fileA, \fileBoder \fileCist definiert. Daraufhin untersuchte ich das mwe-1-0_f.tex(wie oben) und stellte fest, dass es kompiliert wurde, aber die letzte \ifFrakturKlausel als ausgewertet wurde false.

Wahrscheinlich spielen hier mehrere Ursachen eine Rolle, aber vorerst interessiert mich vor allem der Grund für den außer Kontrolle geratenen Streit.

Antwort1

die Zeichen in \jobnamehaben den Catcode 12 (wie \meaningoder \string), also möchten Sie einen Catcode 12_

\documentclass{report}

\newif\ifFraktur
\makeatletter%
\catcode`\_=12
\newcommand{\filenameparse}[1]{\expandafter\filename@parse@#1\@nil}%
\def\filename@parse@#1_#2\@nil{%
   \gdef\filenameflag{#2}%
}%
\catcode`\_=8
\makeatother
\filenameparse{\jobname}%

\edef\testf{\string f}
\ifx\testf\filenameflag
   \Frakturtrue
\else
   \Frakturfalse
\fi%

\begin{document}

\ifFraktur
We have an f document
\else
We have an a document.
\fi
\end{document}

Antwort2

Hier ist eine Implementierung, die es Ihnen auch ermöglicht, die Versionsnummern zu extrahieren, basierend auf meinem Code fürDateinamen in Dokument parsen

\documentclass{article}
\usepackage{xparse,l3regex}

\ExplSyntaxOn
\cs_generate_variant:Nn \regex_split:nnN { nV }
\seq_new:N \l_liz_jobname_seq

\NewDocumentCommand{\splitjobname}{m}
 {
  \regex_split:nVN { #1 } \c_sys_jobname_str \l_liz_jobname_seq
 }

\DeclareExpandableDocumentCommand{\jobnamepart}{m}
 {
  \seq_item:Nn \l_liz_jobname_seq { #1 }
 }

\DeclareExpandableDocumentCommand{\isfrakturTF}{mm}
 {
  \str_if_eq_x:nnTF { \jobnamepart{-1} } { f } { #1 } { #2 }
 }
\ExplSyntaxOff

\splitjobname{ [ _ \- ] } % at _ or -

\begin{document}

This document's name \isfrakturTF{has}{has not} a trailing `f'.

First part: \jobnamepart{1}\par
Second part: \jobnamepart{2}\par
Third part: \jobnamepart{3}

\end{document}

Wenn der Dateiname lautet mwe-1-0_a.tex, lautet die Ausgabe

Bildbeschreibung hier eingeben

Wenn der Name lautet mwe-1-0_f.tex, lautet die Ausgabe

Bildbeschreibung hier eingeben

verwandte Informationen