原来的方法为什么不起作用呢?

原来的方法为什么不起作用呢?

我正在尝试使用 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将被传递给pgfkeysfor 进行处理。

但是,.initial并没有定义这样的键。而是定义了一个具有相关名称的键处理程序。因此,不存在,<key path>/<key name>/.@cmd并且该选项被假定为应该传递给类而不是由处理的选项pgfopts

请注意,即使由于密钥是常规密钥而非处理程序而正确处理,该类仍会抱怨选项未知。pgfopts与类似的密钥处理包共享此功能,例如,l3keys2e这些包可以正确处理选项,但不会阻止 LaTeX 警告它们是未知的和未处理的。就 LaTeX 而言,似乎这里是处理,然后是被看到正在处理……

相关内容