
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.tex
corresponde ao que vou usar para o meu arquivo real ( version-m-n_f.tex
, ondem
en
são espaços reservados para os números de versão ef
é um espaço reservado para a bandeira que pode ser a
ou 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 \fileA
está \fileB
definida \fileC
. Então examinei mwe-1-0_f.tex
(como acima) e percebi que ele compilou, mas a \ifFraktur
clá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 \jobname
têm catcode 12 (como \meaning
ou \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á
Se o nome for mwe-1-0_f.tex
, a saída será