
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.tex
der, der dem entspricht, was ich für meine eigentliche Datei verwenden werde ( version-m-n_f.tex
, wobeim
Undn
sind Platzhalter für die Versionsnummern undf
a
ist 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
, \fileB
oder \fileC
ist definiert. Daraufhin untersuchte ich das mwe-1-0_f.tex
(wie oben) und stellte fest, dass es kompiliert wurde, aber die letzte \ifFraktur
Klausel 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 \jobname
haben den Catcode 12 (wie \meaning
oder \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
Wenn der Name lautet mwe-1-0_f.tex
, lautet die Ausgabe