
私は(Xe)LaTeX文書のジョブ名を解析して、後で使用するためにtrue/falseフラグを設定しようとしています。この解決策これは有望だと思われ、私が実装したものです (次の 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}
このファイルのファイル名は、mwe-1-0_a.tex
実際のファイルで使用するファイル名に対応しています(version-m-n_f.tex
、ここでm
そしてn
バージョン番号のプレースホルダーであり、f
a
は、または のいずれかになるフラグのプレースホルダーですf
。
これを実行すると、次のエラーが発生します。
Runaway argument?
mwe-1-0_a\@nil
! Paragraph ended before \filename@parse@ was complete.
<to be read again>
\par
l.11
エラーを無視すると ( を押すとenter
)、ドキュメントはそれ以上エラーなしでコンパイルされます。
問題の根本を突き止めようと、私はすでにリンクされている回答ですが、少し変更して次のようになりました。
\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}
驚いたことに、これも暴走引数を生成するだけでなく、3 つのマクロ\fileA
、 、のいずれも定義されていません。そこで、 を (上記のように) 調べたところ\fileB
、コンパイルはされるものの、最後の節が として評価されることが分かりました。\fileC
mwe-1-0_f.tex
\ifFraktur
false
おそらくここには複数の問題が関係しているのでしょうが、当面は暴走した議論の原因に最も興味があります。
答え1
の文字は\jobname
catcode 12(または\meaning
)なので\string
、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}
答え2
これは、私のコードに基づいてバージョン番号を抽出できる実装です。ファイル名をドキュメントに解析する
\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}
ファイル名が の場合mwe-1-0_a.tex
、出力は
名前が の場合mwe-1-0_f.tex
、出力は次のようになります。