我想写一个可以与选项一起使用的小文档类,例如
\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
(即没有空格,只有第一个逗号之前的部分)。我已经尝试了-packagepatch
的 -option kvoptions
。
有没有办法正确实现这一点(可以在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}
这不适用于KOMA脚本(在链接的线程中显示了一种解决方法,但我没有尝试)。
解决方案 2:使用xkeyval
看此主题最低限度的工作示例。如链接线程所示,您需要在hyperref
包的对面在值前后使用两个而不是一个花括号。这也不适用于 KOMAScript(原因与解决方案 1 相同)。
解决方案 3:kvoptions-patch
在 .tex 文件中的 \documentclass 之前加载
我不知道如何让它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。