.png)
Я хочу написать небольшой класс документов, который можно использовать с параметрами, например
\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
(т.е. без пробелов и только часть перед первой запятой). Я уже пробовал patch
опцию - для kvoptions
-package.
Есть ли способ реализовать это правильно (например hyperref
, в -package \usepackage[pdftitle={Riemann surfaces, ...}]{hyperref}
)?
решение1
Использование пробелов в параметрах класса в принципе не поддерживается движком latex2e (см.проблема с github). Существуют некоторые обходные пути для этой проблемы, но они работают не для каждого класса (и поэтому они обычно не будут работать для вашего собственного класса, поскольку вы обычно пишете класс, основанный на другом классе). Вообще говоря, вам следует избегать пробелов в параметрах класса (по крайней мере для latex2e, возможно, для Latex3 есть лучшие решения). Однако, если вы настаиваете на этом, ниже приведены три решения, которые работают, по крайней мере, с некоторыми классами.
Решение 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}
Это не работает сКОМАСкрипт(в связанной теме показано решение этой проблемы, но я его не пробовал).
Решение 2: Использованиеxkeyval
Видетьэта темадля минимального рабочего примера. Как показано в связанной ветке, вам нужно в противоположность пакету hyperref
две фигурные скобки вместо одной до и после значения. Это также не будет работать с KOMAScript (по той же причине, что и для решения 1).
Решение 3: Загрузка kvoptions-patch
перед \documentclass в файле .tex
Я не знаю, как заставить 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
перед этим, \documentclass
еще одним недостатком этого метода является то, что вы не можете использовать запятые внутри значений (например, в заголовке в приведенном выше примере). Однако это решение также работает с KOMAScript.