if 语句返回字符串前面的空格

if 语句返回字符串前面的空格

我已经定义了一个宏(使用\def\documentlanguage,它应该设置为germanenglish。现在我想要第二个宏(或命令),它返回english何时\documentlanguageenglish以及ngerman(因为包babel)何时\documentlanguagegerman

这是我的解决方案:

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

相关内容