.png)
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@title
possui o valor Riemannsurfaces
(ou seja, sem espaços e apenas a parte antes da primeira vírgula). Já tentei a patch
opçã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 hyperref
pacote, 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-patch
antes de \documentclass no arquivo .tex
Não sei como fazer kvoptions-patch
funcionar no .cls
arquivo, mas por algum motivo ele está funcionando sem problemas quando é carregado antes do \documentclass
comando dentro do .tex
arquivo.
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 kvoptions
pacote antes, \documentclass
outra 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.