假设我有一个名为的文件,其中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