Espaços e vírgula em StringOptions (como possível em hyperref)

Espaços e vírgula em StringOptions (como possível em hyperref)

Quero escrever uma pequena documentclass que possa ser usada com opções, por exemplo

\documentclass[title=a]{xyz}

Para fazer isso, escrevi noxyz.cls

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

Contudo, não é possível escrever algo como

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

Nesta situação, a macro \abc@titlepossui o valor Riemannsurfaces(ou seja, sem espaços e apenas a parte antes da primeira vírgula). Já tentei a patchopção -para o kvoptions-package.

Existe uma maneira de implementar isso corretamente (é possível no hyperref-package, por exemplo \usepackage[pdftitle={Riemann surfaces, ...}]{hyperref})?

Responder1

O uso de espaços nas opções de classe basicamente não é suportado pelo mecanismo latex2e (vejaproblema no github). Existem algumas soluções alternativas para esse problema, mas elas não funcionam para todas as classes (e, portanto, geralmente não funcionam para sua própria classe, como você normalmente escreveria uma classe baseada em outra classe). De modo geral, você deve evitar espaços nas opções de classe (pelo menos para latex2e, talvez existam soluções melhores para Latex3). Porém se você insistir nisso, a seguir são dadas três soluções que pelo menos funcionam com algumas classes.

Solução 1: usandopgfopts

Arquivo .tex:

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

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

Isso não funciona comKOMAscript(no tópico vinculado é mostrada uma solução alternativa para isso, mas não tentei).

Solução 2: usandoxkeyval

Vereste tópicopara um exemplo mínimo de trabalho. Conforme mostrado no tópico vinculado, você precisa, no oposto do hyperrefpacote, dois colchetes em vez de um antes e depois do valor. Isto também não funcionará com KOMAScript (pelo mesmo motivo da Solução 1).

Solução 3: Carregando kvoptions-patchantes de \documentclass no arquivo .tex

Não sei como fazer kvoptions-patchfuncionar no .clsarquivo, mas por algum motivo ele está funcionando sem problemas quando é carregado antes do \documentclasscomando dentro do .texarquivo.

Arquivo .tex:

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

arquivo xyz.cls:

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

\DeclareStringOption[]{title}
\ProcessKeyvalOptions* 

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

Além da desvantagem óbvia de que é confuso para os usuários da classe o fato de eles precisarem carregar o kvoptionspacote antes, \documentclassoutra desvantagem desse método é que você não pode usar vírgulas dentro dos valores (por exemplo, no título do exemplo acima). No entanto, esta solução também funciona com KOMAScript.

informação relacionada