O que causa esse argumento descontrolado ao tentar analisar \jobname?

O que causa esse argumento descontrolado ao tentar analisar \jobname?

Estou tentando analisar o nome do trabalho do meu documento (Xe)LaTeX para definir um sinalizador verdadeiro/falso para uso posterior. eu me depareiesta soluçãoque parecia promissor e que implementei (veja o seguinte 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}

O nome do arquivo deste arquivo mwe-1-0_a.texcorresponde ao que vou usar para o meu arquivo real ( version-m-n_f.tex, ondemensão espaços reservados para os números de versão efé um espaço reservado para a bandeira que pode ser aou f).

Executando isso, recebo o seguinte erro:

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

Ignorar o erro (acertar enter) permitiu que o documento fosse compilado sem mais erros.

Tentando chegar ao fundo da questão, decidi copiar oresposta já vinculada, mas modifiquei um pouco para ficar assim:

\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}

Surpreendentemente, isso não apenas gera um argumento descontrolado, mas também nenhuma das três macros \fileAestá \fileBdefinida \fileC. Então examinei mwe-1-0_f.tex(como acima) e percebi que ele compilou, mas a \ifFrakturcláusula final foi avaliada como false.

Provavelmente há vários problemas em jogo aqui, mas eu estaria mais interessado na causa da discussão desenfreada por enquanto.

Responder1

os caracteres \jobnametêm catcode 12 (como \meaningou \string), então você quer um 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}

Responder2

Aqui está uma implementação que também permite extrair os números de versão, com base no meu código paraAnalisando o nome do arquivo no 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}

Se o nome do arquivo for mwe-1-0_a.tex, a saída será

insira a descrição da imagem aqui

Se o nome for mwe-1-0_f.tex, a saída será

insira a descrição da imagem aqui

informação relacionada