¿Por qué falla esta prueba de idioma?

¿Por qué falla esta prueba de idioma?

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 \languagenametiene su primer carácter del código de categoría 12; hasta donde \ifxtengo entendido,

e11 n11 g11 l11 i11 s11 h11

y

e12 n11 g11 l11 i11 s11 h11

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

ingrese la descripción de la imagen aquí

¿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 \elsey \fipara 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 iflangenvuelve el material interno de la comparación \languagenameen 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}

Resultado

información relacionada