我的问题是:

我的问题是:

我想编写自己的包,它提供一个\affidavit命令,可以生成两种语言(德语和英语)的标准文本。

该包的最小工作示例:

\def\fileversion{0.1}
\def\filedate{2014/12/10}
\NeedsTeXFormat{LaTeX2e}
\RequirePackage[ngerman,english]{babel}
\ProvidesPackage{myaffidavit}
 [\filedate\space\fileversion\space
   My affidavit package]

\newcommand{\affidavit}{
    \begin{otherlanguage}{ngerman}
    This text will be in german stating some standard information (juristic)...
    It should use correct hyphenation for german texts.
    \end{otherlanguage}
    \begin{otherlanguage}{english}
    This text will be in english stating the same information as the german one above...
    Of course this should automatically use correct hyphenation for english texts.
    \end{otherlanguage}
}

由于我无法控制用户如何使用我的软件包,因此一些用户可能会尝试使用以下乳胶文档的最小工作示例:

\documentclass{article}
\usepackage[ngerman]{babel}
\usepackage{myaffidavit}

\begin{document}
Hallo Welt!
\affidavit
\end{document}

这会导致此错误:LaTeX Error: Option clash for package babel


我的问题是:

我如何编写一个可以输出不同语言文本(使用正确的连字符)的包,而不将我的包的用户限制为包中加载的语言。

当然,如果我的用户反过来加载 babel 和我的包,我将无法在我的包中使用 ngerman 或 english,前提是用户也没有在他的 latex 文档中指定这些语言。(而且,如果用户已经在主文档中加载了 babel,而我的包试图加载其他语言,则会发生选项冲突)

更准确地说:关键是,当我像这样使用 babel 的包选项指定我的包中将要使用的语言时\RequirePackage[ngerman,english]{babel},当我的包的用户也加载 babel 包时,我的包很可能会产生选项冲突。

但:如果我的软件包的用户将他想要使用的语言指定为类选项(如评论中所建议),那么仍然会出现“选项冲突”(有点),因为文档中第一次加载 babel 时仍然指定要加载哪些语言定义(指定为类选项的那些)。然后使用该\myaffidavit命令会产生错误,因为它尝试使用未定义/加载的语言。

我正在编写一个包,我不想强​​迫用户在加载 babel 时指定包内使用的语言。我希望它是透明的。假设我的用户想用意大利语书写,所以他使用意大利语选项加载 babel。如果他在加载 babel 时将其指定为选项\usepackage[italian]{babel},则会发生选项冲突。当他将意大利语指定为类选项时,不会发生选项冲突,但当他加载我的 affidavit 包时,默认语言将不再是意大利语。这不透明!而且我不希望我的包裹太过打扰别人。

答案1

以下是一些你可以玩的东西:

\documentclass[12pt]{article}
\usepackage[T1]{fontenc}
\usepackage[utf8]{inputenc}
\usepackage[paperwidth=9cm, paperheight=10cm, showframe]{geometry}
\parindent 0pt%
%\usepackage[american, british]{babel}
%\usepackage{datetime}


\def\germtoday{% Example format: Date Month Year
\number\day\space
\ifcase\month\or
Januar%
\or Februar%
\or März%
\or April%
\or Mai%
\or Juni%
\or Juli%
\or August%
\or September%
\or Oktober%
\or November%
\or Dezember%
\fi
\space\number\year}

\newcommand\germanaffidavit{
  \begingroup
  \language=31%
  The language is \the\language. {\germtoday}

%  \showhyphens{% Useful to test how words are being hyphenated
  This text will be in Language stating the same information as the
  Language one above.  Of course this should automatically use
  correct hyphenation for Language texts.
%  }
  \endgroup}

\newcommand\englishaffidavit{%
  \begingroup
  \language=0
  The language is \the\language. \today

%  \showhyphens{%
  This text will be in Language stating the same information as the
  Language one above.  Of course this should automatically use
  correct hyphenation for Language texts.
% }
  \endgroup}


\newcommand\affidavit{\germanaffidavit\newpage\englishaffidavit}


\begin{document}
The language is \the\language

This text will be in Language stating the same information as the
Language one above.  Of course this should automatically use
correct hyphenation for Language texts.

\newpage
\affidavit
\newpage
The language is \the\language

This text will be in Language stating the same information as the
Language one above.  Of course this should automatically use
correct hyphenation for Language texts.

\end{document}

评论

  • 关闭时babel,编译两次以消除错误信息。

  • 我倾向于使用自定义日期命令来避免依赖其他包来获得“正确”效果;我在这里建议的只是说明各种可能性,而不是明确的,甚至不是符合标准的。

  • 取消注释该\showhyphens命令以验证 TeX 是否正确连字符(请注意,输出会打印在 中.log

答案2

我最近偶然发现了这个问题,因为我遇到了完全相同的问题,但是这里给出的解决方案并不令我满意,所以我将尝试解释我找到的解决方案,希望它对其他寻找同样问题的人有用。

重点是,我们想专门针对一种语言对 babel 翻译进行处理,但并不禁止加载我们没有专门处理的所有其他语言。这只有在你重新定义翻译时才可以实现babel已加载,并且已选择语言。但是,问题是您正在从或.cls文件中重新定义它.sty。因此,我\AtBeginDocument{}结合使用宏和对包是否存在的测试babel。我在akletter课堂上发现了这个技巧。这是最终代码(重新定义法语翻译的目录部分的名称):

\AtBeginDocument{%
  \@ifpackageloaded{babel}{%
    %%% French
    \addto{\extrasfrench}{%
      \def\frenchcontentsname{Sommaire}%
    }
  }{}
}

还要注意,如果选择了一种语言并且文档是多语言的,我没有使用语言选择器\captionsfrench,而是\extrasfrench绕过语言选择器。

好吧,我希望这能有所帮助!如果此代码有可以改进的地方,欢迎提出任何意见。

答案3

如果你babel使用特定选项加载,任何想要传递babel不同选项的人都需要调用如下命令

\PassOptionsToPackage{italian}{babel}

在打电话给你的包裹之前。你可以把这个写进手册里,这样当他们没有读到它时就不是你的错。

或者,您可以不带任何特定选项地要求包,并使用 添加您的语言\babelprovide。这不是加载德语或英语的推荐方式,但它应该有效,并且可以避免如果用户babel在您的包之前加载时发生选项冲突。

如果您需要您的包支持babel在它之前或之后加载,您需要推迟加载babel和所有依赖于它的命令至少直到\AtEndPreamble,然后在没有包选项的情况下完成所有配置。

相关内容