¿Qué causa este argumento desbocado al intentar analizar \jobname?

¿Qué causa este argumento desbocado al intentar analizar \jobname?

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.texel que corresponde a lo que voy a usar para mi archivo real ( version-m-n_f.tex, dondemynson marcadores de posición para los números de versión yfes un marcador de posición para la bandera que puede ser ao 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 \fileAestá \fileBdefinida \fileC. Luego de lo cual examiné mwe-1-0_f.tex(como arriba) y me di cuenta de que estaba compilado, pero la \ifFrakturclá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 \jobnametienen catcode 12 (como \meaningo \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

ingrese la descripción de la imagen aquí

Si el nombre es mwe-1-0_f.tex, la salida es

ingrese la descripción de la imagen aquí

información relacionada