编写一个可以识别 babel 或 polyglossia 中选择的主语言的包

编写一个可以识别 babel 或 polyglossia 中选择的主语言的包

babel我如何才能让我的包知道用或选择的语言polyglossia,以便可以根据当前语言生成一些自动生成的字符串?

例如,我有一个宏\my@string,它将扩展为英文文本中的“Caption”、德文文本中的“Überschrift”或法文中的“titre”。

答案1

有几种可能性。我将介绍四种不同的方法。前两种方法直接或间接使用由和提供的宏\captions<lang>或。关于这两种方法,有以下说明:\extras<lang>babelpolyglossiababel

  • \captions<lang>:宏\captions<lang>定义保存文本的宏,以替换原有的硬连线文本。
  • \extras<lang>:宏\extras<lang>包含特定语言所需的所有额外定义。此宏 [...] 是一个钩子 - 您可以向其中添加内容,但不能直接使用它。

babel手册使用\extras<lang>来举例说明用户对语言的定义。从用户角度<lang>来看,两者的主要区别在于 稍后设置。因此,如果两者都为一种语言定义相同的宏,则 »wins«中的定义优先。\captions<lang>\extras<lang>\extras<lang>

\addto\captions<...>

您可以检查babel或是否polyglossia已加载以及是否将翻译添加到\captions<lang>\extras<lang>

\newcommand*\mytitle{Title}
\@ifpackageloaded{babel}
  {\addto\captionsngerman{\def\mytitle{Titel}}}
  {
    \@ifpackageloaded{polyglossia}
      {\addto\captionsngerman{\def\mytitle{Titel}}}
      {}
  }

当然,为了不必重复代码,这可以包含在更方便的条件中。

这是一个可扩展的解决方案,这意味着它\mytitle也可以用于 PDF 书签或其他有用的地方。

一个可能的缺点:使用此解决方案,您必须为每种“方言”提供翻译。例如,如果您设置了语言\addto\captionsngerman,但用户选择了语言,german他将看不到翻译。

\RequirePackage{filecontents}
\begin{filecontents*}{mypackage.sty}
\ProvidesPackage{mypackage}[2014/07/27 v0.0 my new package]

\newcommand*\iflanguagepackage[1]{%
  \@ifpackageloaded{babel}
    {#1}
    {%
      \@ifpackageloaded{polyglossia}
        {#1}
        {}%
    }%
}

\newcommand*\mytitle{Title}
\iflanguagepackage{%
  \addto\captionsenglish{\def\mytitle{Title}}%
  \addto\captionsngerman{\def\mytitle{Titel}}%
  \addto\captionsfrench{\def\mytitle{Titre}}%
}
\end{filecontents*}

\documentclass{article}
\usepackage[english,french,ngerman]{babel}
\usepackage{mypackage}
\begin{document}

\mytitle

\selectlanguage{french}
\mytitle

\selectlanguage{english}
\mytitle

\end{document}

scrbase

KOMA 脚本类,或者更准确地说,KOMA-Script 支持包scrbase提供了\providecaptionname。使用此宏,您不必检查语言包。否则它几乎是相同的:

\newcommand*\mytitle{Title}
\providecaptionname{ngerman}\mytitle{Titel}

它具有与第一个解决方案相同的优点和缺点(可扩展性、方言......)。

\RequirePackage{filecontents}
\begin{filecontents*}{mypackage.sty}
\ProvidesPackage{mypackage}[2014/07/27 v0.0 my new package]
\RequirePackage{scrbase}

\newcommand*\mytitle{Title}
\providecaptionname{english}\mytitle{Title}
\providecaptionname{ngerman}\mytitle{Titel}
\providecaptionname{french}\mytitle{Titre}

\end{filecontents*}

\documentclass{article}
\usepackage[english,french,ngerman]{babel}
\usepackage{mypackage}
\begin{document}

\mytitle

\selectlanguage{french}
\mytitle

\selectlanguage{english}
\mytitle

\end{document}

不过,它比纯babel/polyglossia方式有优势:首先, 的第一个参数\providecaptionname可以是逗号分隔的语言列表,因此更方便提供方言或语言别名的翻译。此外,还有许多相关命令允许更精细的控制:

  • \defcaptionname{<list of languages>}{<macro>}{<translation>}:无论如何都要定义翻译。(例如\def
  • \providecaptionname{<list of languages>}{<macro>}{<translation>}<list of languages>:如果尚未定义标题名称,则为语言定义一个标题名称。(例如\providecommand
  • \newcaptionname{<list of languages>}{<macro>}{<translation>}<list of languages>:如果尚未定义某种语言的标题名称,则抛出错误。(例如\newcommand
  • \renewcaptionname{<list of languages>}{<macro>}{<translation>}:更新 中语言的现有标题名称<list of languages>。如果尚无,则抛出错误。(如\renewcommand

这些命令会自行决定是否最好将翻译添加到\captions<lang>\extras<lang>除非您使用其带星号的变体(这些变体将始终使用 )\extras<lang>。在 v3.12 中,这些宏会推迟在文档开头的定义。

translator

translator包(部分beamer) 是一个更通用的解决方案。

手册beamer上是这么说的:

translator软件包是一个 LaTeX 软件包,它提供了一种将单个单词翻译成不同语言的灵活机制。例如,它可用于将“figure”这样的单词翻译成德语单词“Abbildung”。当某些软件包的作者希望本地化该软件包,以便将文本正确地翻译成用户喜欢的语言时,这种翻译机制非常有用。该translator软件包不适用于自动翻译多个单词。

您可能想知道这个translator包是否真的有必要,因为已经有 (非常好的) babelLaTeX 包可用了。这个包已经提供了像“figure”这样的单词的翻译。不幸的是,这个babel包的架构设计使得无法将新单词的翻译添加到直接内置的 (非常短的) 翻译列表中babel

虽然我们现在知道这并不完全正确,但这个translator包仍然是一个非常有用的概括。基本用法如下:

\newcommand*\mytitle{\translate{mypackage-title}}
\newtranslation[to=English]{mypackage-title}{Title}
\newtranslation[to=German]{mypackage-title}{Titel}

有了它,您也不必自己检查babelpolyglossia但是,为了使翻译正常工作,translator包需要获取使用的语言作为包选项,这意味着用户应该使用该语言作为全局选项:

\documentclass[german]{article}
\usepackage{mypackage}

因此,使用它的包可能应该告诉用户这一点。优点:\newtranslation[to=German]适用于germanngerman自动。如果使用一种没有提供翻译的语言,则使用英语翻译作为后备。

缺点是:\translate不可扩展,这可能会或可能不会引起麻烦(例如,当用于PDF 书签时)\sectionhyperref

另一个可能的优势是:它附带的词典已经提供了相当多的翻译。

此外还\newtranslation translator提供了许多类似的命令:

  • \deftranslation[to=<lang>]{<string>}{<translation>}:无论如何,<string>为语言提供新的翻译。(如)<lang>\def
  • \newtranslation[to=<lang>]{<string>}{<translation>}<string>:为语言提供新的翻译<lang>。如果已存在则抛出错误。(例如\newcommand
  • \providetranslation[to=<lang>]{<string>}{<translation>}<string>:如果语言<lang>尚不存在,则提供新的翻译。(例如\providecommand
  • \renewtranslation[to=<lang>]{<string>}{<translation>}<string>:更新语言 的现有翻译<lang>。如果尚不存在,则抛出错误。(例如\renewcommand
\RequirePackage{filecontents}
\begin{filecontents*}{mypackage.sty}
\ProvidesPackage{mypackage}[2014/07/27 v0.0 my new package]
\RequirePackage{translator}

\newcommand*\mytitle{\translate{mypackage-title}}
\newtranslation[to=English]{mypackage-title}{Title}
\newtranslation[to=German]{mypackage-title}{Titel}
\newtranslation[to=French]{mypackage-title}{Titre}

\end{filecontents*}

\documentclass[english,french,ngerman]{article}
\usepackage{babel}
\usepackage{mypackage}
\begin{document}

\mytitle

\selectlanguage{french}
\mytitle

\selectlanguage{english}
\mytitle

\end{document}

translations

你可能还想看看translations包裹。

它的用法与 非常相似translator。但它有几个优点:

  • \GetTranslation是可扩展的
  • 即使没有给出全局选项,所选语言也会被识别
  • 它知道方言的概念

来自手册:

此软件包为软件包作者提供了一个简单的界面,用于国际化他们的软件包。此软件包的功能在很多方面也包含在软件包中translator(捆绑包的一部分beamer)。国际化也可以通过babel\addto\captions<language>机制或 KOMA-Script \providecaptionname和类似命令来实现。但是,我认为这 translations比所有这些都更灵活。与此不同,translator它检测所使用的(babelpolyglossia)语言本身并提供可扩展的翻译密钥检索。translations 还提供了对语言方言的支持,这意味着软件包作者可以区分英国、澳大利亚、加拿大和美国英语。

translations提供了许多宏来定义和检索翻译的字符串。大多数时候

  • \DeclareTranslationFallback{<string>}{<translation>}
  • \DeclareTranslation{<language>}{<string>}{<translation>}
  • \GetTranslation{<string>}

就足够了。

还有

  • \NewTranslation{<language>}{<string>}{<translation>}
  • \ProvideTranslation{<language>}{<string>}{<translation>}
  • \RenewTranslation{<language>}{<string>}{<translation>}

scrbase其后果与translator和 的宏相同。

每个字符串至少应该有一个»后备翻译«,当没有语言包或用户选择了没有提供翻译的语言时使用。

就像该translatortranslations也知道字典并且已经提供了许多翻译。

\RequirePackage{filecontents}
\begin{filecontents*}{mypackage.sty}
\ProvidesPackage{mypackage}[2014/07/27 v0.0 my new package]
\RequirePackage{translations}

\newcommand*\mytitle{\GetTranslation{mypackage-title}}

% translations for `mypackage-title':
\DeclareTranslationFallback {mypackage-title}{Title}
\DeclareTranslation{English}{mypackage-title}{Title}
\DeclareTranslation{French} {mypackage-title}{Titre}
\DeclareTranslation{German} {mypackage-title}{Titel}

\end{filecontents*}

\documentclass{article}
\usepackage[english,french,ngerman]{babel}
\usepackage{mypackage}
\begin{document}

\mytitle

\selectlanguage{french}
\mytitle

\selectlanguage{english}
\mytitle

\end{document}

所有完整的例子都给出

在此处输入图片描述

相关内容