私は、すべての個人用マクロと個人用スタイルのカスタムクラスを含むカスタムパッケージを作成しようとしています。私は、またはnotation
の値を取ることができるキーワード引数を渡したいと考えていました。math
physics
ことができるキーワード引数を渡して、私が受講するさまざまなコースの表記を変更したいと考えていました(たとえば、数学では複素共役はバーで表され、物理学ではアスタリスクで表されます)。いろいろ試して、私が得た答えに従った後、ここ以下の 3 つのファイルを取得しました。
% demo-pkg.sty
\NeedsTeXFormat{LaTeX2e}
\ProvidesPackage{demo-pkg}[Demo]
\RequirePackage{xstring}
\DeclareKeys[demo]
{
notation.choices:nn =
{ physics, math }
{\ExpandArgs{Nc}\let\@demo@notation{l_keys_choice_tl}},
notation.usage = load,
notation.initial:n = physics
}
\ProcessKeyOptions[demo]
\IfStrEqCase{\@demo@notation}{
{physics}{}%
{math}{}%
}[
\PackageError{demo-pkg}{Invalid notation value: \@demo@notation}
{Choose value of: physics, math}
]
\RequirePackage{xparse}
\IfStrEqCase{\@demo@notation}{%
{physics}{%
\NewDocumentCommand{\Conjugate}{ m }{{##1}^{\ast}}%
}%
{math}{%
\NewDocumentCommand{\Conjugate}{ m }{\overline{##1}}%
}%
}%
% demo-cls.cls
\NeedsTeXFormat{LaTeX2e}
\ProvidesClass{demo-cls}[Demo class]
\DeclareKeys[demo-cls]
{
notation.choices:nn =
{ physics, math }
{\PassOptionsToPackage{notation=l_keys_choice_tl}{demo-pkg}}, % <- This seems to cause issues
notation.usage = load,
notation.initial:n = physics
}
\DeclareOption*{\PassOptionsToClass{\CurrentOption}{article}}
\ProcessKeyOptions[demo-cls]
\ProcessOptions\relax
\LoadClass[a4paper, 12pt]{article}
\RequirePackage{demo-pkg}
% main.tex
\documentclass[notation=math]{demo-cls}
\begin{document}
\[ z = x + iy \Longleftrightarrow \Conjugate{z} = x - iy \]
\end{document}
このコードをコンパイルしようとするとエラーが発生しますKey 'demo/notation' accepts only a fixed set of choices.
。 を直接使用するとdemo-pkg
:
\documentclass{article}
\usepackage[notation=math]{demo-pkg}
\begin{document}
\[ z = x + iy \Longleftrightarrow \Conjugate{z} = x - iy \]
\end{document}
コンパイルは正常に行われ、パッケージ パラメータを使用して表記を切り替えることができます。クラスからパッケージにパラメータを渡すと、問題が発生するようです。 を使用して\l_keys_choice_tl
、\tl_use:N \l_keys_choice_tl
このコード ブロックを\ExplSyntaxOn
/で囲んでみました。何も機能しません。同じエラーが発生します。クラスからパッケージにパラメータ\ExplSyntaxOff
を渡すにはどうすればよいですか?notation
demo-cls
demo-pkg
答え1
notation=math
から\documentclass
パッケージに を転送する必要はありません。パッケージは を使用する\ProcessKeyOptions
ため、そのオプションを含むグローバル オプション リストを解析します。
\ProcessKeyOptions
また、クラス内の メカニズムを使用して、不明なオプションを に転送することもできますarticle
。したがって、変更が必要なファイルはクラスのみです。
demo-cls.cls
:
% demo-cls.cls
\NeedsTeXFormat{LaTeX2e}
\ProvidesClass{demo-cls}[Demo class]
\DeclareKeys[demo-cls]
{
unknown .code = \PassOptionsToClass{\CurrentOption}{article}
}
\ProcessKeyOptions[demo-cls]
\LoadClass[a4paper, 12pt]{article}
\RequirePackage{demo-pkg}
demo-pkg.sty
:
% demo-pkg.sty
\NeedsTeXFormat{LaTeX2e}
\ProvidesPackage{demo-pkg}[Demo]
\RequirePackage{xstring}
\DeclareKeys[demo]
{
notation.choices:nn =
{ physics, math }
{\ExpandArgs{Nc}\let\@demo@notation{l_keys_choice_tl}},
notation.usage = load,
notation.initial:n = physics
}
\ProcessKeyOptions[demo]
\IfStrEqCase{\@demo@notation}{
{physics}{}%
{math}{}%
}[
\PackageError{demo-pkg}{Invalid notation value: \@demo@notation}
{Choose value of: physics, math}
]
\RequirePackage{xparse}
\IfStrEqCase{\@demo@notation}{%
{physics}{%
\NewDocumentCommand{\Conjugate}{ m }{{##1}^{\ast}}%
}%
{math}{%
\NewDocumentCommand{\Conjugate}{ m }{\overline{##1}}%
}%
}%
main.tex
:
% main.tex
\documentclass[notation=math]{demo-cls}
\begin{document}
\[ z = x + iy \Longleftrightarrow \Conjugate{z} = x - iy \]
\end{document}
少し説明が必要だと思います(以前の回答を振り返っても)。
\ExpandArgs
は、引数の展開を細かく制御するための高レベル インターフェースを提供するマクロです。これを使用して、\@demo@notation
L3 言語を直接使用せずに (つまり、またはを使用せずに\ExplSyntaxOn
) 、パッケージ内部を L3 変数の値に設定しました\ProvidesExplPackage
。これは を使用して行われました\ExpandArgs{Nc}\let\@demo@notation{l_keys_choice_tl}
。つまり、 を使用する前に\let
、2 つの引数を使用します。最初の引数は変更されない単一のトークン ( N
) で、2 番目の引数は によってマクロを形成する中括弧で囲まれたグループです\csname
。したがって、\ExpandArgs{Nc}\let\@demo@notation{l_keys_choice_tl}
この低レベル構造のより読みやすい変形は次のようになります。
\expandafter\let\expandafter\@demo@notation\csname l_keys_choice_tl\endcsname
この説明があなたの
\DeclareKeys[demo-cls]
{
notation.choices:nn =
{ physics, math }
{\PassOptionsToPackage{notation=l_keys_choice_tl}{demo-pkg}}, % <- This seems to cause issues
notation.usage = load,
notation.initial:n = physics
}
動作しませんでした。 はl_keys_choice_tl
魔法のように実際の選択値にならないため、 によって実行され\ExpandArgs
、ここでも同様の方法 (私のコメントで示唆した方法) で実行する必要があります。