StringOptions 内のスペースとカンマ (hyperref で可能な範囲)

StringOptions 内のスペースとカンマ (hyperref で可能な範囲)

オプションで使用できる小さなドキュメントクラスを書きたい。例えば

\documentclass[title=a]{xyz}

これを実現するために、私はxyz.cls

\RequirePackage{kvoptions}
\SetupKeyvalOptions{
  family=abc,
  prefix=abc@
}
\DeclareStringOption{title}
\ProcessKeyvalOptions*

しかし、次のように書くことはできません。

\documentclass[title={Riemann surfaces, projective curves and function fields}]{xyz}

この状況では、マクロ\abc@titleには値Riemannsurfaces(つまり、スペースなし、最初のコンマの前の部分のみ) が含まれます。 -packagepatchの -option はすでに試しましたkvoptions

hyperrefこれを適切に実装する方法はありますか (例: パッケージでは可能です\usepackage[pdftitle={Riemann surfaces, ...}]{hyperref})?

答え1

クラスオプションでスペースを使用することは、基本的にlatex2eエンジンではサポートされていません(githubの問題)。この問題には回避策がいくつかありますが、すべてのクラスで機能するわけではありません (したがって、通常は別のクラスに基づいてクラスを作成するため、独自のクラスでは機能しません)。一般的に言えば、クラス オプションでスペースを避ける必要があります (少なくとも latex2e では、Latex3 にはもっと良い解決策があるかもしれません)。ただし、どうしても必要な場合は、少なくとも一部のクラスで機能する 3 つの解決策を次に示します。

解決策1: 使用pgfopts

.tex ファイル:

\documentclass[title={with space and, comma}]{xyz}
\begin{document}
    the Title is \title
\end{document}

xyz.cls ファイル:

\NeedsTeXFormat{LaTeX2e}
\ProvidesClass{xyz}[2020/07/14]
\RequirePackage{pgfopts}

\LoadClass{article}

\pgfkeys{
    /xyz/.cd,
    title/.store in=\xyz@title
}

\ProcessPgfOptions{/xyz}

\renewcommand{\title}{\xyz@title}

これは機能しませんKOMAスクリプト(リンクされたスレッドでは回避策が示されていますが、私は試していません)。

解決策2: 使用xkeyval

見るこのスレッド最小限の動作例です。リンクされたスレッドに示されているように、hyperrefパッケージとは逆に、値の前後に中括弧を 1 つではなく 2 つ付ける必要があります。これは、KOMAScript でも機能しません (ソリューション 1 と同じ理由により)。

解決策3: kvoptions-patch.texファイル内の\documentclassの前に読み込む

kvoptions-patchファイル内で動作させる方法がわかりませんが、何らかの理由で、ファイル内のコマンド.clsの前にロードすると問題なく動作します。\documentclass.tex

.tex ファイル:

\RequirePackage{kvoptions-patch}
\documentclass[title=with space]{xyz}
\begin{document}
    the Title is: \printTitle
\end{document}

xyz.cls ファイル:

\NeedsTeXFormat{LaTeX2e}
\ProvidesClass{xyz}[2020/07/14]
\RequirePackage{kvoptions}
\LoadClass{article}

\DeclareStringOption[]{title}
\ProcessKeyvalOptions* 

\newcommand{\printTitle}{\xyz@title}

kvoptionsこの方法のもう 1 つの欠点は、クラス ユーザーにとって、パッケージをロードする前にそれをロードする必要があるため混乱を招くという明らかな欠点に加えて、\documentclass値内でコンマを使用できないことです (上記の例のタイトル内など)。ただし、このソリューションは KOMAScript でも機能します。

関連情報