私の質問は次のとおりです:

私の質問は次のとおりです:

\affidavit2 つの言語 (ドイツ語と英語) で標準テキストを生成するコマンドを提供する独自のパッケージを作成したいと考えています。

このパッケージの最小限の動作例:

\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}
}

ユーザーが私のパッケージをどのように操作するかは制御できないため、一部のユーザーは次の LaTeX ドキュメントの最小限の動作例を使用しようとする可能性があります。

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

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

その結果、次のエラーが発生します:LaTeX Error: Option clash for package babel


私の質問は次のとおりです:

パッケージのユーザーをパッケージにロードされた言語に制限せずに、さまざまな言語でテキストを出力する (正しいハイフネーションを使用) パッケージを作成するにはどうすればよいでしょうか。

そしてもちろん、もしユーザーが babel と私のパッケージを逆にロードした場合、ユーザーが LaTeX ドキュメントでもこれらの言語を指定していないと、私のパッケージで german や english を使用することはできません。(そして、ユーザーがメイン ドキュメントで 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、エラー メッセージが表示されないように 2 回コンパイルします。

  • 他のパッケージに依存して「正しく」実行することを避けるために、カスタムの日付コマンドを使用することをお勧めします。ここで提案したのは、可能性を示すことを目的としており、決定的なものでも標準に準拠したものでもありません。

  • TeXがハイフンを正しく付けているかどうかを確認するには、コマンドのコメントを解除します\showhyphens(出力は に印刷されることに注意してください.log)。

答え2

私もまったく同じ問題を抱えていたため、最近この質問に偶然出会ったのですが、ここで示されている解決策は私にとって満足のいくものではありませんでした。そこで、同じ問題を探している他の人にも役立つことを願って、私が見つけた解決策を説明しようと思います。

ポイントは、Babel翻訳を1つの言語に特化したいが、特化していない他のすべての言語をロードすることを禁止したくないということです。これは、翻訳を再定義した場合にのみ実行できます。パッケージbabelがロードされ、言語が選択されました。しかし、問題は、.clsまたはファイルから再定義していることです。そのため、パッケージの存在 (または不在) のテストと組み合わせてマクロ.styを使用しました。このトリックはクラスで見つけました。最終的なコードは次のとおりです (フランス語翻訳の目次セクションの名前を再定義します)。\AtBeginDocument{}babelakletter

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

また、言語セレクタが選択されていてドキュメントが多言語である場合は、言語セレクタを回避するために\captionsfrenchbutを使用しなかったことにも注意してください。\extrasfrench

さて、これが役に立つことを願っています。このコードで何か改善できる点があれば、コメントをお待ちしています。

答え3

特定のオプションを指定してロードする場合babel、異なるオプションを渡したい人はbabel次のようなコマンドを呼び出す必要があります。

\PassOptionsToPackage{italian}{babel}

パッケージに電話する前に、これをマニュアルに記載しておけば、相手がマニュアルを読んでいなくてもあなたの責任にはなりません。

あるいは、特定のオプションを指定せずにパッケージを require し、 を使用して言語を追加することもできます\babelprovide。これはドイツ語や英語をロードするための推奨される方法ではありませんが、機能するはずですし、ユーザーがbabelパッケージの前にロードした場合にオプションの衝突を避けることができます。

babelパッケージがの前または後に読み込みをサポートする必要がある場合は、読み込みbabelとそれに依存するすべてのコマンドを少なくとも まで延期し\AtEndPreamble、その後、パッケージ オプションなしですべての構成を実行する必要があります。

関連情報