
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 \languagename
tem como primeiro caractere o código de categoria 12; no que \ifx
diz respeito,
e
11n
11g
11l
11i
11s
11h
11
e
e
12n
11g
11l
11i
11s
11h
11
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 é
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 \else
e \fi
para 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 iflang
envolve o material interno da comparação \languagename
em 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}