StringOptions 中的空格和逗号(在 hyperref 中尽可能)

StringOptions 中的空格和逗号(在 hyperref 中尽可能)

我想写一个可以与选项一起使用的小文档类,例如

\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。

相关内容