带有 if 语句的多语言文本

带有 if 语句的多语言文本

我正在用 LaTeX 处理一份文档,我想有多个语言版本。我可以复制所有内容并进行翻译,但这会导致出现多个版本,每次我都必须单独更新。

我想要的是指定要编译的语言(或者也许它总是编译所有语言,所以每次运行时它都会保存例如英语、荷兰语和德语版本)。然后它只打印该语言。我当时想的是:

\languageversion{english} %this could be changed for language specification

\begin{document}
...
\dutch{some dutch text here}
\english{some english text here}
\german{some german text here}

因此,当我选择英语时,只会打印英语部分。这样,如果我要更改布局,我不必对多个版本执行此操作,而只需对一个版本执行此操作。

这可能吗?

答案1

这是一种方法,但我不认为这对长文本真正有用。

\documentclass{article}
\usepackage[dutch,ngerman,english]{babel}

\makeatletter
\newcommand{\declarelanguage}{\@dblarg\@declarelanguage}
\def\@declarelanguage[#1]#2{%
  \long\@namedef{#2}{%
    \edef\@temp{\string#1}%
    \ifx\@temp\languagename
      \expandafter\@firstofone
    \else
      \expandafter\@gobble
   \fi}%
}
\makeatother

\declarelanguage{dutch}
\declarelanguage[ngerman]{german}
\declarelanguage{english}

\begin{document}

English

\dutch{some dutch text here}
\english{some english text here}
\german{some german text here}

\bigskip
\hrule
\bigskip

German

\selectlanguage{ngerman}

\dutch{some dutch text here}
\english{some english text here}
\german{some german text here}

\bigskip
\hrule
\bigskip

Dutch

\selectlanguage{dutch}

\dutch{some dutch text here}
\english{some english text here}
\german{some german text here}

\end{document}

这将使用活动语言(根据babel规则)。\declarelanguage有一个可选参数:与语言名称匹配的字符串babel。使用它,您使用什么名称并不重要;例如,您可以说

\declarelanguage[english]{EN}

并用于\EN{English text}插入英文文本。请随意选择;对于德语,这是必需的。

注意:有一个奇怪的babel特性: 维护的语言字符串的\languagename第一个字符的类别代码为 12,这就是神秘的 的原因,这使得您给出的字符串与对此事的看法\edef\@tempa{\string#1}一致。babel

答案2

我找到了两种解决这个问题的方法。注意:文档始终以德语开头。


第一个解决方案,包含语言更改

第一个解决方案- 相当琐碎,灵感来自user1460812 的评论- 允许在受控容器内更改语言,而不会影响文档的语言。例如:

\newif\ifeng
\newif\ifita

\engtrue
%\itatrue

\documentclass{article}
\usepackage[main=ngerman, italian, english]{babel}

\newcommand{\italian}[1]{%
    \ifeng\begin{otherlanguage}{italian}#1\end{otherlanguage}\fi}
    
\newcommand{\english}[1]{%
    \ifeng\begin{otherlanguage}{english}#1\end{otherlanguage}\fi}

\begin{document}
    
    \par{\bf{The document starts with: \prefacename, \alsoname.}}

    \italian{Buongiorno!}
    \english{Hi!}

    \italian{In italiano si dice: \prefacename, \alsoname.}
    \english{In English it says: \prefacename, \alsoname.}

    \par{\bf{The document ends with: \prefacename, \alsoname.}}
    
\end{document}

打印内容: 上述代码的结果


第二种解决方案,语言从某一点开始改变

第二种解决方案借自egreg 的回答并改变整个文档的语言(我将其包括在这里以便对解决方案进行实际比较):

\documentclass{article}
\usepackage[main=ngerman, italian,ngerman,english]{babel}

\makeatletter
\newcommand{\declarelanguage}{\@dblarg\@declarelanguage}
\def\@declarelanguage[#1]#2{%
    \long\@namedef{#2}{%
        \edef\@temp{\string#1}%
        \ifx\@temp\languagename
        \expandafter\@firstofone
        \else
        \expandafter\@gobble
        \fi}%
}
\makeatother

\declarelanguage[ngerman]{german}
\declarelanguage{english}
\declarelanguage{italian}

\begin{document}

\selectlanguage{english}

    \par{\bf{The document starts with: \prefacename, \alsoname.}}

    \italian{Buongiorno!}
    \english{Hi!}

    \italian{In italiano si dice: \prefacename, \alsoname.}
    \english{In English it says: \prefacename, \alsoname.}

    \par{\bf{The document ends with: \prefacename, \alsoname.}}

\end{document}

打印内容:

上述代码的结果

相关内容