\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 的字符。

有幾種方法可以解決這個問題。如果您使用pdftex支援 e-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字串比較獨立於類別代碼(並擴展其參數中的宏)。

無論如何,您不應該這樣做\def\language,因為\language是 TeX 原語。

更靈活的解決方案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

相關內容