\jobname の奇妙な動作

\jobname の奇妙な動作

という名前のファイルがあるとします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

関連情報