Пробелы и запятые в 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(т.е. без пробелов и только часть перед первой запятой). Я уже пробовал 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.

Связанный контент