Perilaku aneh dari \ jobname

Sep 01 2020

Asumsikan saya memiliki file bernama G1 (SK).texmengandung

\def\SK{SK}

\def\parse"#1 (#2)"{\def\language{#2}}

\expandafter\parse\jobname

\ifx\SK\language equal\else distinct\fi

\bye

Ketika saya menjalankannya, itu mencetak distinct, bahkan jika nilainya jobnameadalah "G1 (SK)". Saat saya menggunakan

\expandafter\parse"G1 (SK)"

itu bekerja seperti yang diharapkan dan mencetak equal.

Bagaimana cara memperbaikinya?

Jawaban

4 egreg Sep 01 2020 at 19:56

\jobnamemenghasilkan karakter kode kategori 12, sedangkan teks pengganti \SKberisi karakter kode kategori 11.

Ada beberapa cara untuk mengatasi masalah tersebut. Jika Anda menggunakan pdftexyang mendukung ekstensi e-TeX

\edef\SK{\detokenize{SK}}

\def\parse"#1 (#2)"{\def\filelanguage{#2}}

\expandafter\parse\jobname

\ifx\SK\filelanguage equal\else distinct\fi

\bye

Anda juga bisa memanfaatkan \pdfstrcmp:

\def\parse"#1 (#2)"{\def\filelanguage{#2}}

\expandafter\parse\jobname

\ifnum\pdfstrcmp{SK}{\filelanguage}=0 equal\else distinct\fi

\bye

karena \pdfstrcmpapakah perbandingan string tidak bergantung pada kode kategori (dan memperluas makro dalam argumennya).

Bagaimanapun, Anda tidak boleh melakukannya \def\language, karena \languageTeX primitif.

Solusi yang lebih fleksibel dengan 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

Ini mencetak "Bahasa adalah SK", tetapi jika saya menggunakan nama pekerjaan yang berbeda, katakanlah XYZ(X), saya mendapatkan "Bahasa yang tidak ditentukan".

Perintah \checklanguageini sepenuhnya dapat diperluas dan berfungsi \edef. Token yang akan dieksekusi untuk setiap string terserah Anda dan aplikasi yang Anda maksudkan. Perhatikan bahwa Anda tidak perlu peduli dengan tanda kutip yang ditambahkan jika ada spasi dalam nama, karena baris pertama hanya mengekstrak apa yang ada di antara tanda kurung (set pertama).

4 DonHosek Sep 01 2020 at 18:44

\jobnamememberikan kode kategori 12 ke semua karakter kecuali spasi saat disetel. Anda bisa mendapatkan hasil yang Anda inginkan dengan melakukan sesuatu seperti ini:

{
  \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