Warum fällt dieser Sprachtest durch?

Warum fällt dieser Sprachtest durch?

Mein Problem ist der folgende Code:

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

Das Ergebnis ist „Nicht unterstützte Sprache: Englisch“ statt „Unterstützte Sprache: Englisch“. Was mache ich falsch?

Antwort1

Aus Implementierungsgründen \languagenamehat der Ersetzungstext von als erstes Zeichen den Kategoriecode 12; was \ifxbetrifft,

e11 n11 g11 l11 i11 s11 h11

Und

e12 n11 g11 l11 i11 s11 h11

Sindanders. Wenn Sie das tun,

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

dann ist die Ausgabe

Bildbeschreibung hier eingeben

Müssen Sie dieses Geschäft betreiben? Nein, natürlich nicht.

\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

Dann

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

wird funktionieren.

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

Alternative Definition mit \elseund \fifür die wahren und falschen Zweige:

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

Antwort2

DerAntwortvon egreg erklärt in der Frage bereits den Grund für das unerwartete Ergebnis des Beispiels und zeigt zudem mehrere Methoden zur Lösung des Problems.

Das Paket iflangverpackt die internen Dinge des Vergleichs \languagenamein einem einfachen Makro \IfLanguageName. Das Beispiel der Frage lautet:

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

Ergebnis

verwandte Informationen