.png)
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@title
tiene el valor Riemannsurfaces
(es decir, sin espacios y sólo la parte antes de la primera coma). Ya probé la patch
opción para el kvoptions
paquete.
¿Hay alguna manera de implementar esto correctamente (es posible en el hyperref
paquete, 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 hyperref
paquete, 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-patch
antes de \documentclass en el archivo .tex
No sé cómo hacer que kvoptions-patch
el .cls
archivo funcione, pero por alguna razón funciona sin problemas cuando se carga antes del \documentclass
comando dentro del .tex
archivo.
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 kvoptions
paquete antes, \documentclass
otro 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.