
Mi problema es el siguiente código:
\documentclass{article}
\usepackage[english]{babel}
\begin{document}
\def\suplang{english}
\ifx\languagename\suplang
Supported language: \languagename
\else
Not supported language: \languagename
\fi
\end{document}
El resultado es "Idioma no admitido: inglés" en lugar de "Idioma admitido: inglés". ¿Qué hago mal?
Respuesta1
Por motivos de implementación, el texto de reemplazo de \languagename
tiene su primer carácter del código de categoría 12; hasta donde \ifx
tengo entendido,
e
11n
11g
11l
11i
11s
11h
11
y
e
12n
11g
11l
11i
11s
11h
11
sondiferente. De hecho, si lo haces
\documentclass{article}
\usepackage[english]{babel}
\begin{document}
\edef\suplang{\string english}
\ifx\languagename\suplang
Supported language: \languagename
\else
Not supported language: \languagename
\fi
\end{document}
entonces la salida es
¿Necesitas hacer ese negocio? No claro que no.
\usepackage{pdftexcmds} % to work with all engines
\makeatletter
\newcommand{\supported}[3]{%
\ifnum\pdf@strcmp{\languagename}{#1}=\z@
\expandafter\@firstoftwo
\else
\expandafter\@secondoftwo
\fi
{#2}{#3}%
}
\makeatother
Entonces
\supported{suplang}
{Supported language: \languagename}
{Not supported language: \languagename}
trabajará.
\documentclass{article}
\usepackage[english]{babel}
\usepackage{pdftexcmds} % to work with all engines
\makeatletter
\newcommand{\supported}[3]{%
\ifnum\pdf@strcmp{\languagename}{#1}=\z@
\expandafter\@firstoftwo
\else
\expandafter\@secondoftwo
\fi
{#2}{#3}%
}
\makeatother
\def\suplang{english}
\begin{document}
\supported{\suplang}
{Supported language: \languagename}
{Not supported language: \languagename}
\end{document}
Definición alternativa con \else
y \fi
para las ramas verdadera y falsa:
\documentclass{article}
\usepackage[english]{babel}
\usepackage{pdftexcmds} % to work with all engines
\makeatletter
\newcommand{\issupported}[1]{%
TT\fi\ifnum\pdf@strcmp{\languagename}{#1}=\z@
}
\makeatother
\def\suplang{english}
\begin{document}
\if\issupported\suplang
Supported language: \languagename
\else
Not supported language: \languagename
\fi
\end{document}
Respuesta2
Elrespuestade egreg ya explica el motivo del resultado inesperado del ejemplo de la pregunta y también muestra varios métodos para resolver el problema.
El paquete iflang
envuelve el material interno de la comparación \languagename
en una macro simple \IfLanguageName
. El ejemplo de la pregunta se convierte en:
\documentclass{article}
\usepackage[english]{babel}
\usepackage{iflang}
\begin{document}
\IfLanguageName{english}{%
Supported language: \languagename
}{%
Not supported language: \languagename
}
\end{document}