
Estoy intentando analizar el nombre del trabajo de mi documento (Xe)LaTeX para establecer un indicador de verdadero/falso para su uso posterior. Me encontré conesta soluciónque parecía prometedor y que implementé (ver el siguiente 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}
El nombre de este archivo es mwe-1-0_a.tex
el que corresponde a lo que voy a usar para mi archivo real ( version-m-n_f.tex
, dondem
yn
son marcadores de posición para los números de versión yf
es un marcador de posición para la bandera que puede ser a
o f
).
Al ejecutar esto, aparece el siguiente error:
Runaway argument?
mwe-1-0_a\@nil
! Paragraph ended before \filename@parse@ was complete.
<to be read again>
\par
l.11
Ignorar el error (presionar enter
) permitió que el documento se compilara sin más errores.
Tratando de llegar al fondo del asunto, decidí copiar elrespuesta ya vinculada, pero lo modifiqué ligeramente para que sea el siguiente:
\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}
Sorprendentemente, esto no sólo genera un argumento desbocado, sino que además ninguna de las tres macros \fileA
está \fileB
definida \fileC
. Luego de lo cual examiné mwe-1-0_f.tex
(como arriba) y me di cuenta de que estaba compilado, pero la \ifFraktur
cláusula final fue evaluada como false
.
Probablemente haya varios problemas en juego aquí, pero por el momento, lo que más me interesaría sería la causa del argumento desbocado.
Respuesta1
los caracteres en \jobname
tienen catcode 12 (como \meaning
o \string
), por lo que quieres un 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}
Respuesta2
Aquí hay una implementación que también le permite extraer los números de versión, según mi código paraAnalizando el nombre del archivo en el documento
\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}
Si el nombre del archivo es mwe-1-0_a.tex
, la salida es
Si el nombre es mwe-1-0_f.tex
, la salida es