Leerzeichen und Kommata in StringOptions (wie in Hyperref möglich)

Leerzeichen und Kommata in StringOptions (wie in Hyperref möglich)

Ich möchte eine kleine Dokumentklasse schreiben, die mit Optionen verwendet werden kann, zB

\documentclass[title=a]{xyz}

Um dies zu tun, schrieb ich in derxyz.cls

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

Es ist jedoch nicht möglich, etwas wie

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

In dieser Situation \abc@titlehat das Makro den Wert Riemannsurfaces(also ohne Leerzeichen und nur den Teil vor dem ersten Komma). Ich habe bereits die patch-Option für das kvoptions-Paket ausprobiert.

hyperrefGibt es eine Möglichkeit, dies richtig zu implementieren (es ist beispielsweise im -Paket möglich \usepackage[pdftitle={Riemann surfaces, ...}]{hyperref})?

Antwort1

Die Verwendung von Leerzeichen in Klassenoptionen wird von der Latex2e-Engine grundsätzlich nicht unterstützt (sieheGitHub-Problem). Es gibt einige Workarounds für dieses Problem, aber diese funktionieren nicht für jede Klasse (und daher funktionieren sie normalerweise nicht für Ihre eigene Klasse, da Sie normalerweise eine Klasse schreiben würden, die auf einer anderen Klasse basiert). Generell sollten Sie Leerzeichen in Klassenoptionen vermeiden (zumindest für Latex2e, vielleicht gibt es bessere Lösungen für Latex3). Wenn Sie jedoch darauf bestehen, finden Sie im Folgenden drei Lösungen, die zumindest mit einigen Klassen funktionieren.

Lösung 1: Verwendenpgfopts

.tex-Datei:

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

xyz.cls-Datei:

\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}

Das funktioniert nicht mitKOMAscript(im verlinkten Thread wird ein Workaround dafür gezeigt, den ich aber nicht ausprobiert habe).

Lösung 2: Verwendenxkeyval

Sehendieser Threadfür ein minimales funktionierendes Beispiel. Wie im verlinkten Thread gezeigt, braucht man im Gegensatz zum hyperrefPaket zwei statt einer geschweiften Klammer vor und nach dem Wert. Auch das wird mit KOMAScript nicht funktionieren (aus dem gleichen Grund wie bei Lösung 1).

Lösung 3: Laden kvoptions-patchvor \documentclass in der .tex-Datei

Ich weiß nicht, wie ich die Datei zum kvoptions-patchLaufen bringe .cls, aber aus irgendeinem Grund funktioniert es problemlos, wenn es vor dem \documentclassBefehl in der .texDatei geladen wird.

.tex-Datei:

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

xyz.cls-Datei:

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

\DeclareStringOption[]{title}
\ProcessKeyvalOptions* 

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

Neben dem offensichtlichen Nachteil, dass es für Klassenbenutzer verwirrend ist, dass sie das kvoptionsPaket vor dem Laden laden müssen \documentclass, besteht ein weiterer Nachteil dieser Methode darin, dass Sie in Werten keine Kommas verwenden können (z. B. im Titel im obigen Beispiel). Diese Lösung funktioniert jedoch auch mit KOMAScript.

verwandte Informationen