有没有一种简单的方法可以在使用 的包选项中使用空格来处理pgfopts
它们,这种方法对于该包来说是本地的,即我不必在 之前在主文档中包含某些包\documentclass
。我想做的是fontspec
使用 将字体名称传递到包内部pgfopts
。
答案1
基本上,这里的答案是“不”。在将任何内容传递给或任何其他键值处理包之前,LaTeX2e 内核会从类(和包)选项中删除空格pgfopts
。为此存在的两个补丁(xkvltxp
和kvoptions-patch
) 都必须在使用它们“保护”的任何选项之前加载,这意味着\documentclass
在类选项之前加载。
您可以使用括号保护选项不被空格剥离,例如
\documentclass[foo={bar baz}]{mycls}
但这可能会导致问题,因为内核在执行“重复删除”时可能会出现问题。因此,一般来说,在加载包或类时最好不要使用包含空格的选项:之后再设置选项。
答案2
11年过去了,事情发生了变化。
LaTeX 内核的最新版本提供了选项列表,一次作为删除空格的处理列表,一次作为未进行任何此类更改的原始列表。
不幸的是,大多数软件包不支持处理那些空格未被删除的原始选项。我目前知道的解决方案是:
LaTeX 内核本身支持 key=value 选项,通过使用
\DeclareKeys[<module>]{<key-definitions>}
来定义键、\SetKeys[<module>]{<key=val-list>}
将键设置为值以及\ProcessKeyOptions[<module>]
处理当前包或类文件的选项。所有这些<module>
默认为当前文件名(删除文件扩展名)。包
expkv-opt
(的一部分expkv-bundle
),以获得一个与之相当的键定义前端,pgfkeys
或者\DeclareKeys
您还必须加载expkv-def
,然后您可以\ekvdefinekeys{<set>}{<key-definitions>}
定义键,\ekvset{<set>}{<key=val-list>}
将键设置为值,并\ekvoProcessOptions{<set>}
处理当前包或类文件的选项。
使用这两种解决方案,您只需使用
\documentclass[foo=bar baz]{mycls}
一切正常。
这里有一个关于这两种解决方案的很小的例子:
文档文件
该文件适用于以下两个类文件。
\documentclass[foo=bar baz]{mycls}
\begin{document}
The value was \texttt{\myfoo}.
\end{document}
类文件expkv-opt
\ProvidesClass{mycls}[adhoc class for an example]
\LoadClass{article}
\RequirePackage{expkv-opt,expkv-def}
\ekvdefinekeys{mycls}{store foo = \myfoo}
\ekvoProcessOptions{mycls}
使用 LaTeX 内置机制的类文件
\ProvidesClass{mycls}[adhoc class for an example]
\LoadClass{article}
\DeclareKeys{foo .store = \myfoo}
\ProcessKeyOptions\relax
在这两种情况下,输出都如下所示: