この言語テストはなぜ不合格になるのでしょうか?

この言語テストはなぜ不合格になるのでしょうか?

私の問題は次のコードです:

\documentclass{article}
\usepackage[english]{babel}
\begin{document}
\def\suplang{english}
\ifx\languagename\suplang
    Supported language: \languagename
\else 
    Not supported language: \languagename
\fi
\end{document}

結果は「サポートされている言語: 英語」ではなく「サポートされていない言語: 英語」です。何が間違っているのでしょうか?

答え1

実装上の理由により、の置換テキストの\languagename最初の文字はカテゴリコード12になります。\ifx

e11 n11 g11 l11 i11 s11 h11

そして

e12 n11 g11 l11 i11 s11 h11

違う確かに、もしあなたが

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

出力は次のようになります

ここに画像の説明を入力してください

そのビジネスを行う必要がありますか? いいえ、もちろん必要ありません。

\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

それから

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

働くでしょう。

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

真と偽の分岐に対する\elseとを使用した代替定義:\fi

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

答え2

答えegreg では、質問の例の予期しない結果の理由がすでに説明されており、問題を解決するためのいくつかの方法も示されています。

パッケージは、iflang比較の内部内容を\languagename単純なマクロでラップします\IfLanguageName。質問の例は次のようになります。

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

結果

関連情報