為什麼這次語言測試失敗了?

為什麼這次語言測試失敗了?

我的問題是以下程式碼:

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

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}

結果

相關內容