我正在尝试使用 pgfopts 将一个键值对传递给一个类。文件testclass.cls
:
\NeedsTeXFormat{LaTeX2e}
\ProvidesClass{testclass}[2016/12/04 A Test Class]
\LoadClass{article}
\RequirePackage{pgfkeys}
\RequirePackage{pgfopts}
\pgfkeys{testclass/testkey/.initial=testkeyinitial}
\pgfkeys{testclass/.is family}
\ProcessPgfOptions{/testclass}
\pgfkeys{testclass, testkey/.get=\optiontest}
并testfile.tex
测试该课程:
\documentclass[testkey=works]{testclass}
\begin{document}
Test: \optiontest
\end{document}
但是输出只是初始值testkeyinital
,并且在编译期间会发出警告:
LaTeX Warning: Unused global option(s):
[testkey=works].
我遗漏了什么?提前致谢!
答案1
首先,请注意/testclass/
不同于testclass/
。因此,您至少需要
\pgfkeys{%
/testclass/testkey/.initial=testkeyinitial,
/testclass/.is family,
}
其次,我建议在之前定义和处理所有选项\LoadClass
。这是因为在真正的寄生类中,您通常希望将所有未知选项传递给基类。pgfopts
似乎对此毫不在意,这让我很惊讶,处理选项的其他两种方法都关心这个问题,除非有令人信服的理由不这样做,否则坚持通常的模式可能是很好的管理方式。(也就是说,这让我很紧张!)
经过适当更正路径后,如果您处理包选项,您使用的代码将会起作用,但用于类选项时则不起作用。
改用.store in
即可解决问题。
\begin{filecontents}{\jobname.cls}
\NeedsTeXFormat{LaTeX2e}
\ProvidesClass{\jobname}[2016/12/04 A Test Class]
\RequirePackage{pgfkeys}
\RequirePackage{pgfopts}
\pgfkeys{%
/testclass/.is family,
/testclass,
testkey/.store in=\optiontest,
testkey=testkeyinitial,
}
\ProcessOptions
\ProcessPgfOptions{/testclass}
\LoadClass{article}
\end{filecontents}
\documentclass[testkey=works]{\jobname}
\begin{document}
Test: \optiontest
\end{document}
原来的方法为什么不起作用呢?
我不确定以下内容。但是,我认为发生的事情是,pgfopts
依赖<key path>/<key name>/.@cmd
于类选项的测试(请参阅手册第 4 页)。这样做是为了可以忽略不相关的选项,这些选项只能由类本身以正常方式处理。否则,12pt
说或a4paper
将被传递给pgfkeys
for 进行处理。
但是,.initial
并没有定义这样的键。而是定义了一个具有相关名称的键处理程序。因此,不存在,<key path>/<key name>/.@cmd
并且该选项被假定为应该传递给类而不是由处理的选项pgfopts
。
请注意,即使由于密钥是常规密钥而非处理程序而正确处理,该类仍会抱怨选项未知。pgfopts
与类似的密钥处理包共享此功能,例如,l3keys2e
这些包可以正确处理选项,但不会阻止 LaTeX 警告它们是未知的和未处理的。就 LaTeX 而言,似乎这里是处理,然后是被看到正在处理……