
Supongamos que tengo un archivo llamado G1 (SK).tex
que contiene
\def\SK{SK}
\def\parse"#1 (#2)"{\def\language{#2}}
\expandafter\parse\jobname
\ifx\SK\language equal\else distinct\fi
\bye
Cuando lo ejecuto, imprime distinct
, incluso si el valor de jobname
es "G1 (SK)"
. cuando uso
\expandafter\parse"G1 (SK)"
Funciona como se esperaba e imprime equal
.
¿Cómo puedo arreglar esto?
Respuesta1
\jobname
produce caracteres del código de categoría 12, mientras que el texto de reemplazo \SK
contiene caracteres del código de categoría 11.
Hay varias formas de afrontar el problema. Si usa pdftex
un soporte que admita extensiones e-TeX
\edef\SK{\detokenize{SK}}
\def\parse"#1 (#2)"{\def\filelanguage{#2}}
\expandafter\parse\jobname
\ifx\SK\filelanguage equal\else distinct\fi
\bye
También podrías explotar \pdfstrcmp
:
\def\parse"#1 (#2)"{\def\filelanguage{#2}}
\expandafter\parse\jobname
\ifnum\pdfstrcmp{SK}{\filelanguage}=0 equal\else distinct\fi
\bye
porque \pdfstrcmp
la comparación de cadenas es independiente de los códigos de categoría (y expande las macros en sus argumentos).
En cualquier caso, no deberías hacerlo \def\language
, porque \language
es una primitiva TeX.
Una solución más flexible con 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
Esto imprime "El idioma es SK", pero si uso un nombre de trabajo diferente, por ejemplo XYZ(X)
, aparece "Idioma no definido".
El comando \checklanguage
es completamente expandible y por lo tanto funciona en \edef
. El token a ejecutar para cada cadena depende de usted y de la aplicación prevista. Tenga en cuenta que no necesita preocuparse por las comillas agregadas si hay un espacio en el nombre, porque las primeras líneas simplemente extraen lo que hay entre los (primer conjunto de) paréntesis.
Respuesta2
\jobname
asigna el código de categoría 12 a todos los caracteres excepto al espacio cuando está configurado. Puede obtener el resultado deseado haciendo algo como esto:
{
\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