
という名前のファイルがあるとしますG1 (SK).tex
。
\def\SK{SK}
\def\parse"#1 (#2)"{\def\language{#2}}
\expandafter\parse\jobname
\ifx\SK\language equal\else distinct\fi
\bye
これを実行すると、のdistinct
値が であっても と表示されます。jobname
"G1 (SK)"
\expandafter\parse"G1 (SK)"
期待通りに動作し、印刷されますequal
。
これをどうすれば修正できますか?
答え1
\jobname
カテゴリ コード 12 の文字が生成されますが、 の置換テキストには\SK
カテゴリ コード 11 の文字が含まれます。
この問題に対処する方法はいくつかあります。e pdftex
-TeX拡張機能をサポートするものを使用する場合
\edef\SK{\detokenize{SK}}
\def\parse"#1 (#2)"{\def\filelanguage{#2}}
\expandafter\parse\jobname
\ifx\SK\filelanguage equal\else distinct\fi
\bye
以下を利用することもできます\pdfstrcmp
:
\def\parse"#1 (#2)"{\def\filelanguage{#2}}
\expandafter\parse\jobname
\ifnum\pdfstrcmp{SK}{\filelanguage}=0 equal\else distinct\fi
\bye
\pdfstrcmp
カテゴリ コードとは独立して文字列比較を行う (そして引数にマクロを展開する)ためです。
いずれにしても、は TeX プリミティブなので\def\language
、を実行しないでください。\language
より柔軟なソリューションexpl3
。
\input expl3-generic
\ExplSyntaxOn
\str_new:N \l_bak_file_language_str
\str_set_eq:NN \l_bak_file_language_str \c_sys_jobname_str
\regex_replace_once:nnN { .*? \((.*)\) .* } { \1 } \l_bak_file_language_str
% now the string variable contains the string in parentheses
% extracted from the jobname
\cs_new:Npn \checklanguage
{
\str_case:VnF { \l_bak_file_language_str }
{
{SK}{Language~is~SK}
{AB}{Language~is~AB}
{XYZ}{Language~is~XYZ}
}
{Undefined~language}
}
\ExplSyntaxOff
\checklanguage
\bye
これは「Language is SK」と出力しますが、別のジョブ名、たとえばを使用するとXYZ(X)
、「Undefined language」が表示されます。
このコマンド\checklanguage
は完全に拡張可能なので、 で動作します\edef
。各文字列に対して実行するトークンは、ユーザーと目的のアプリケーションによって異なります。名前にスペースがある場合は、追加された引用符を気にする必要がないことに注意してください。最初の行は、括弧 (最初のセット) の間にあるものを抽出するだけだからです。
答え2
\jobname
設定されている場合、スペースを除くすべての文字にカテゴリ コード 12 を割り当てます。次のようにすると、目的の結果を得ることができます。
{
\catcode`\S=12
\catcode`\K=12
\gdef\sk{SK}
}
\def\parse"#1 (#2)"{\def\language{#2}}
\expandafter\parse\jobname
\ifx\sk\language equal\else distinct\fi
\bye