
Моя проблема заключается в следующем коде:
\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}
Альтернативное определение с \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
Theотвечатьegreg уже объясняет причину неожиданного результата примера в вопросе, а также показывает несколько методов решения проблемы.
Пакет iflang
оборачивает внутреннюю часть сравнения \languagename
в простой макрос \IfLanguageName
. Пример вопроса становится:
\documentclass{article}
\usepackage[english]{babel}
\usepackage{iflang}
\begin{document}
\IfLanguageName{english}{%
Supported language: \languagename
}{%
Not supported language: \languagename
}
\end{document}