選択肢オプションをパッケージに渡すことができません

選択肢オプションをパッケージに渡すことができません

私は、すべての個人用マクロと個人用スタイルのカスタムクラスを含むカスタムパッケージを作成しようとしています。私は、またはnotationの値を取ることができるキーワード引数を渡したいと考えていました。mathphysicsことができるキーワード引数を渡して、私が受講するさまざまなコースの表記を変更したいと考えていました(たとえば、数学では複素共役はバーで表され、物理学ではアスタリスクで表されます)。いろいろ試して、私が得た答えに従った後、ここ以下の 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を渡すにはどうすればよいですか?notationdemo-clsdemo-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@notationL3 言語を直接使用せずに (つまり、またはを使用せずに\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、ここでも同様の方法 (私のコメントで示唆した方法) で実行する必要があります。

関連情報