\ Jobname garip davranışı

Sep 01 2020

G1 (SK).texİçeren adlı bir dosyam olduğunu varsayalım

\def\SK{SK}

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

\expandafter\parse\jobname

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

\bye

Onu çalıştırdığınızda, yazdırır distinctdeğeri bile jobnameolduğunu "G1 (SK)". Kullandığım zaman

\expandafter\parse"G1 (SK)"

beklendiği gibi çalışır ve yazdırır equal.

Bunu nasıl düzeltebilirim?

Yanıtlar

4 egreg Sep 01 2020 at 19:56

\jobnamekategori kodu 12 karakterleri üretirken, ikame metni \SKkategori kodu 11 karakterlerini içerir.

Sorunla başa çıkmanın birkaç yolu var. pdftexE-TeX uzantılarını destekleyen kullanırsanız

\edef\SK{\detokenize{SK}}

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

\expandafter\parse\jobname

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

\bye

Şunlardan da yararlanabilirsiniz \pdfstrcmp:

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

\expandafter\parse\jobname

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

\bye

çünkü \pdfstrcmpkategori kodlarından bağımsız olarak dize karşılaştırması yapar (ve bağımsız değişkenlerinde makroları genişletir).

Her durumda, yapmamalısınız \def\language, çünkü \languagebir TeX ilkelidir.

İle daha esnek bir çözüm 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

Bu, "Dil SK'dir" yazdırır, ancak farklı bir iş adı kullanırsam, örneğin XYZ(X)"Tanımlanmamış dil" elde ederim.

Komut \checklanguagetamamen genişletilebilir ve bu nedenle de çalışır \edef. Her dizge için yürütülecek simge size ve amaçladığınız uygulamaya bağlıdır. İsimde boşluk varsa eklenen tırnak işaretlerini önemsemenize gerek olmadığını unutmayın, çünkü ilk satırlar sadece (ilk set) parantezler arasında olanı çıkarır.

4 DonHosek Sep 01 2020 at 18:44

\jobname, ayarlandığında boşluk hariç tüm karakterlere kategori kodu 12 atar. Bunun gibi bir şey yaparak istediğiniz sonucu elde edebilirsiniz:

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