我正在用 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}
打印内容: