Espacios y comas en StringOptions (como sea posible en hiperref)

Espacios y comas en StringOptions (como sea posible en hiperref)

Quiero escribir una pequeña clase de documento que pueda usarse con opciones, por ejemplo

\documentclass[title=a]{xyz}

Para hacer esto, escribí en elxyz.cls

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

Sin embargo, no es posible escribir algo como

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

En esta situación, la macro \abc@titletiene el valor Riemannsurfaces(es decir, sin espacios y sólo la parte antes de la primera coma). Ya probé la patchopción para el kvoptionspaquete.

¿Hay alguna manera de implementar esto correctamente (es posible en el hyperrefpaquete, por ejemplo \usepackage[pdftitle={Riemann surfaces, ...}]{hyperref})?

Respuesta1

El uso de espacios en las opciones de clase básicamente no es compatible con el motor latex2e (consulteproblema de github). Existen algunas soluciones para ese problema, pero no funcionan para todas las clases (y por lo tanto, generalmente no funcionarán para su propia clase, ya que normalmente escribiría una clase basada en otra clase). En términos generales, debes evitar los espacios en las opciones de clase (al menos para latex2e, tal vez haya mejores soluciones para Latex3). Sin embargo, si insiste en ello, a continuación se ofrecen tres soluciones que al menos funcionan con algunas clases.

Solución 1: usarpgfopts

Archivo .tex:

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

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

Esto no funciona conKOMAscript(En el hilo vinculado se muestra una solución alternativa, pero no la probé).

Solución 2: usandoxkeyval

Vereste hilopara un ejemplo mínimo de trabajo. Como se muestra en el hilo vinculado, necesita, frente al hyperrefpaquete, dos llaves en lugar de una antes y después del valor. Esto tampoco funcionará con KOMAScript (por el mismo motivo que la Solución 1).

Solución 3: cargar kvoptions-patchantes de \documentclass en el archivo .tex

No sé cómo hacer que kvoptions-patchel .clsarchivo funcione, pero por alguna razón funciona sin problemas cuando se carga antes del \documentclasscomando dentro del .texarchivo.

Archivo .tex:

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

Archivo xyz.cls:

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

\DeclareStringOption[]{title}
\ProcessKeyvalOptions* 

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

Además de la desventaja obvia de que resulta confuso para los usuarios de la clase tener que cargar el kvoptionspaquete antes, \documentclassotro inconveniente de este método es que no se pueden usar comas dentro de los valores (por ejemplo, en el título del ejemplo anterior). Sin embargo, esta solución también funciona con KOMAScript.

información relacionada