\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

这会打印“语言是 SK”,但如果我使用不同的作业名称,比如说XYZ(X),我会得到“未定义的语言”。

该命令\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

相关内容