カスタムクラスと `babel` の `english` オプションとの衝突

カスタムクラスと `babel` の `english` オプションとの衝突

私はオプションを受け取りenglisharticleクラスをロードするクラスファイルを書いています。english新しいクラスで定義されたオプションはない渡される articlebabelしかし、オプションでロードするとUSenglish、警告が表示されます。

Package Babel Warning: The package option `english' should not be used
(Babel)                with a more specific one (like `USenglish')

englishまるでクラスに渡されたかのようにarticle

クラスにオプションを渡す方法は次のとおりです。

\NeedsTeXFormat{LaTeX2e}
\ProvidesClass{myclass}[2020/11/07 myclass template]

\newif\ifEnglish\Englishfalse

\DeclareOption{english}{\Englishtrue}
\DeclareOption*{\ClassWarning{myclass}{Unknown option `\CurrentOption'}}
\ProcessOptions\relax

\LoadClass[10pt, a4paper, oneside]{article}

コード

\documentclass[english]{myclass}
\usepackage[USenglish]{babel}

上記の警告が表示されますbabelこれをどうすれば修正できますか?

警告はエラーではないことは理解していますが、(1)english定義するオプションのスコープが に限定されmyclass、 に継承されないことを確認したいarticle、(2) 警告のないテンプレートが本当に欲しい、(3) ロードするパッケージをできるだけ少なくしたい(したがって、このためだけに を呼び出すことは避けたいsilence)という理由があります。

答え1

私のコメントを回答に変えます。

\@classoptionslistLaTeX は、 に渡されるオプションを含むグローバル オプションのリスト ( と呼ばれます) を維持します\documentclass。これらのオプションは、 の後にロードされるすべてのパッケージにデフォルトで転送されます(これは、さまざまなパッケージで使用されるインターフェイスによって異なります。標準の LaTeX インターフェイスはグローバル オプションを取得しますが、 、または\documentclassなどのパッケージはpgfopts、ローカル オプション リストのみを渡すメカニズムを提供します)。l3keys2eexpkv-opt

削除する要素、完全なリスト、フィルタリングされたリストを保存するマクロの 3 つの引数を取る\@classoptionslistLaTeX マクロを使用して、からオプションを削除できます。\@removeelement

この知識を使ってクラスファイルを変更し、

\NeedsTeXFormat{LaTeX2e}
\ProvidesClass{myclass}[2020/11/07 myclass template]

\newif\ifEnglish\Englishfalse

\DeclareOption{english}
  {%
    \Englishtrue
    \@expandtwoargs\@removeelement{english}\@classoptionslist\@classoptionslist
  }
\DeclareOption*{\ClassWarning{myclass}{Unknown option `\CurrentOption'}}
\ProcessOptions\relax

\LoadClass[10pt, a4paper, oneside]{article}

englishグローバル オプションのリストから削除されます。


ただし、他の人が指摘しているように (@moewe さん、ありがとうございます)、 と連携するbabelか、異なる名前を使用する方がよいかもしれません。そのため、以下では、テンプレート言語に、異なるオプション名 (衝突する可能性がはるかに低い) を持つ key=value オプションを使用することを提案します。私はこれに を使用しますが、 、またはと、または、または...を使用expkv-optしても同じことが実現できます(key=value ソリューションはたくさんあります)。pgfkeyspgfoptsl3keysl3keys2ekvoptions

以下は、の選択肢としてenglishと を実装します。germantemplate-language

myclass.cls:

\NeedsTeXFormat{LaTeX2e}
\ProvidesClass{myclass}[2020/11/07 myclass template]

\RequirePackage{expkv-opt, expkv-def}
\ekvdefinekeys{myclass}
  {
    choice template-language =
      {
        ,english = \Englishtrue  \Germanfalse
        ,german  = \Englishfalse \Germantrue
      }
  }

\newif\ifEnglish\Englishfalse
\newif\ifGerman\Germanfalse

\ekvoProcessGlobalOptions{myclass}
\ekvoProcessLocalOptions {myclass}

\LoadClass[10pt, a4paper, oneside]{article}

書類:

\documentclass[template-language=english]{myclass}

\usepackage[USenglish]{babel}

\begin{document}
\ifEnglish English \fi
\ifGerman Deutscher \fi
Test
\end{document}

ここに画像の説明を入力してください

答え2

babelこれはテンプレートの正確な性質とテンプレートが提供するローカリゼーションによって異なりますが、特定のクラスのローカリゼーション機能については、ユーザーが(およびおそらく)を介して設定した言語にテンプレートが単純に反応できれば最も便利ですpolyglossia

babel残念ながら、現在 LaTeX のドキュメントのローカライズにはとの 2 つのシステムがあります。この 2 つのシステムは、いくつかの領域でアプローチが若干異なり、統一されたインターフェイスはありません。開発者がロケール対応パッケージを簡単に作成できるように、 で と同等の機能polyglossiaを提供する取り組みが少し前に行われましたが、とでは依然として異なるコードを記述する必要があります。babelpolyglossiababelpolyglossia

文字列の単純な翻訳の場合は、babel次のようにします。

\begin{filecontents}[overwrite]{myclass.cls}
\NeedsTeXFormat{LaTeX2e}
\ProvidesClass{myclass}[2020/11/07 myclass template]

\RequirePackage{etoolbox}

\newcommand*{\rabbit}{\textbf{??? rabbit is missing a translation}}

\AtBeginDocument{%
  \appto\captionsenglish{%
    \renewcommand{\rabbit}{rabbit}%
  }%
  \appto\captionsUSenglish{%
    \renewcommand{\rabbit}{rabbit}%
  }%
  \appto\captionsgerman{%
    \renewcommand{\rabbit}{Hase}%
  }%
  \appto\captionsngerman{%
    \renewcommand{\rabbit}{Hase}%
  }%
}

\LoadClass[10pt, a4paper, oneside]{article}
\end{filecontents}

\documentclass{myclass}

\usepackage[USenglish]{babel}

\begin{document}
Ohh, \rabbit!
\end{document}

文字列に新しいマクロを定義し、 を使用して\apptoその言語の翻訳<language>をに挿入するだけです。(これは、マクロが既に存在し、変更が上書きされないようにするためにフック\captions<language>で実行されます。タイミングを正しくとるのは少し面倒です。)\AtBeginDocument\captions<language>

次のようなパッケージtracklangiflangtranslatorそしてtranslationsこれについてもお手伝いできます。

関連情報