我已经定义了一个宏(使用\def
)\documentlanguage
,它应该设置为german
或english
。现在我想要第二个宏(或命令),它返回english
何时\documentlanguage
是english
以及ngerman
(因为包babel
)何时\documentlanguage
是german
。
这是我的解决方案:
\newcommand{\babellanguage}{
\if\documentlanguage{german}%
ngerman%
\else%
english%
\fi%
}
然后我像这样使用它:
\begin{document}
% set language
\expandafter\selectlanguage\expandafter{\babellanguage}
但随后我收到以下错误:
Package babel Error: You haven't defined the language english yet.
好像 前面有一个空格\babellanguage
。我该如何修复?
谢谢!
编辑:
定义\documentlanguage
:
\def\documentlanguage{german}
答案1
后
\newcommand\documentlanguage{german}
\newcommand{\babellanguage}{
\if\documentlanguage{german}%
ngerman%
\else%
english%
\fi%
}
然后扩展\babellanguage
以空格开始(从换行符之后%
)您需要一个%
之后{
(而不是之后\else
或\fi
无论如何忽略空格的地方)
但随后它会扩大
\if\documentlanguage{german}
\if
展开直到找到两个不可扩展的标记,然后进行比较,因此这是
\if german{german}
g
并会比较和e
不相等的字符代码。
因为你需要测试可扩展,一个简单的方法是
\def\babellanguage{%
\expandafter\ifx\csname l-\documentlanguage\endcsname\relax
\documentlanguage
\else
\csname l-\documentlanguage\endcsname
\fi}
所以默认情况下\babellanguage
只会扩展为,\documentlanguage
但你可以使用
\expandafter\def\csname l-german\endcsname{ngerman}
因此\babellanguage
如果\documentlanguage
是,则扩展为ngerman
,并且您可以添加任意数量的类似语言别名。
\selectlanguage
因此,在调用产生之前,将所有内容放在一起并完全展开宏
\documentclass{article}
\usepackage[english,ngerman]{babel}
\begin{document}
\def\documentlanguage{german}
\def\babellanguage{%
\expandafter\ifx\csname l-\documentlanguage\endcsname\relax
\documentlanguage
\else
\csname l-\documentlanguage\endcsname
\fi}
\expandafter\def\csname l-german\endcsname{ngerman}
%need to expand before `\selectlanguage`
\edef\tmp{\noexpand\selectlanguage{\babellanguage}}\tmp
\end{document}