私はオプションを受け取りenglish
、article
クラスをロードするクラスファイルを書いています。english
新しいクラスで定義されたオプションははない渡される article
babel
しかし、オプションでロードすると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
私のコメントを回答に変えます。
\@classoptionslist
LaTeX は、 に渡されるオプションを含むグローバル オプションのリスト ( と呼ばれます) を維持します\documentclass
。これらのオプションは、 の後にロードされるすべてのパッケージにデフォルトで転送されます(これは、さまざまなパッケージで使用されるインターフェイスによって異なります。標準の LaTeX インターフェイスはグローバル オプションを取得しますが、 、または\documentclass
などのパッケージはpgfopts
、ローカル オプション リストのみを渡すメカニズムを提供します)。l3keys2e
expkv-opt
削除する要素、完全なリスト、フィルタリングされたリストを保存するマクロの 3 つの引数を取る\@classoptionslist
LaTeX マクロを使用して、からオプションを削除できます。\@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 ソリューションはたくさんあります)。pgfkeys
pgfopts
l3keys
l3keys2e
kvoptions
以下は、の選択肢としてenglish
と を実装します。german
template-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
を提供する取り組みが少し前に行われましたが、とでは依然として異なるコードを記述する必要があります。babel
polyglossia
babel
polyglossia
文字列の単純な翻訳の場合は、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>
次のようなパッケージtracklang
、iflang
、translator
そしてtranslations
これについてもお手伝いできます。