我的問題是:

我的問題是:

我想編寫自己的包,它提供了一個\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。 (如果我的套件在使用者已經在主文檔中載入了 babel 之後嘗試載入其他語言,則會出現選項衝突)

更準確地說:關鍵是,當我像這樣使用 babel 的套件選項指定我的套件將在套件內使用的語言時\RequirePackage[ngerman,english]{babel},當我的套件的使用者也載入 babel 套件時,我的套件很可能會產生選項衝突。

但:如果我的套件的使用者指定了他想要用作類別選項的語言(如註釋中所建議的),那麼仍然會出現「選項衝突」(有點),因為文件中的 babel 的第一次載入仍然存在指定正在載入哪些語言定義(指定為類別選項的語言定義)。然後使用該\myaffidavit命令會產生錯誤,因為它嘗試使用未定義/載入的語言。

我正在編寫一個包,我不想強迫使用者指定我的包內使用的語言,以及在載入 babel 時使用的語言。我希望它是透明的。假設我的用戶想用義大利語編寫,所以他正在使用義大利語選項載入 babel。如果他在載入 babel 時將其指定為選項,\usepackage[italian]{babel}則會發生選項衝突。當他指定義大利語作為類別選項時,沒有選項衝突,但當他載入我的宣誓書包時,預設語言將不再是義大利語。這不透明啊!我不希望我的包裹那麼具有侵入性。

答案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,然後在沒有套件選項的情況下進行所有配置。

相關內容