
假設我有一個名為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