Por que este teste de idioma falha?

Por que este teste de idioma falha?

Meu problema é o seguinte 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}

O resultado é "Idioma não suportado: inglês" em vez de "Idioma suportado: inglês". O que eu faço de errado?

Responder1

Por motivos de implementação, o texto de substituição \languagenametem como primeiro caractere o código de categoria 12; no que \ifxdiz respeito,

e11 n11 g11 l11 i11 s11 h11

e

e12 n11 g11 l11 i11 s11 h11

sãodiferente. Na verdade, se você fizer

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

então a saída é

insira a descrição da imagem aqui

Você precisa fazer esse negócio? Não, claro que não.

\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

Então

\supported{suplang}
  {Supported language: \languagename}
  {Not supported language: \languagename}

vai funcionar.

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

Definição alternativa com \elsee \fipara os ramos verdadeiros e falsos:

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

Responder2

Oresponderdo egreg já explica o motivo do resultado inesperado do exemplo da pergunta e também mostra vários métodos para resolver o problema.

O pacote iflangenvolve o material interno da comparação \languagenameem uma macro simples \IfLanguageName. O exemplo da pergunta torna-se:

\documentclass{article}
\usepackage[english]{babel}
\usepackage{iflang}
\begin{document}
\IfLanguageName{english}{%
    Supported language: \languagename
}{%
    Not supported language: \languagename
}
\end{document}

Resultado

informação relacionada