.png)
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@title
hat 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.
hyperref
Gibt 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 hyperref
Paket 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-patch
vor \documentclass in der .tex-Datei
Ich weiß nicht, wie ich die Datei zum kvoptions-patch
Laufen bringe .cls
, aber aus irgendeinem Grund funktioniert es problemlos, wenn es vor dem \documentclass
Befehl in der .tex
Datei 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 kvoptions
Paket 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.