
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 \languagename
hat der Ersetzungstext von als erstes Zeichen den Kategoriecode 12; was \ifx
betrifft,
e
11n
11g
11l
11i
11s
11h
11
Und
e
12n
11g
11l
11i
11s
11h
11
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
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 \else
und \fi
fü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 iflang
verpackt die internen Dinge des Vergleichs \languagename
in 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}