
我的問題是以下程式碼:
\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
而言,
e
11n
11g
11l
11i
11s
11h
11
和
e
12n
11g
11l
11i
11s
11h
11
是不同的。確實,如果你這樣做
\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}
true 和 false 分支的替代定義\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}