我想使用 pgfopts 为包定义选项。到目前为止,它运行良好,但我不知道如何执行默认选项。以下是描述:如何在 pgfkeys 中定义默认选择但由于某种原因,它在我的测试包中不起作用。
让包裹
\NeedsTeXFormat{LaTeX2e}
\ProvidesPackage{testpack}[2019/10/01 v0.1]
\RequirePackage{pgfopts}
\pgfkeys{
/testpack/.cd,
lastword/.is choice,
lastword/yes/.code=\AtEndDocument{\par Yes last word.},
lastword/no/.code=\AtEndDocument{\par No last word.},
lastword/.default=no
}
\ProcessPgfPackageOptions*
和测试文档
\documentclass{article}
%\usepackage[lastword=yes]{testpack}
%\usepackage[lastword=no]{testpack}
\usepackage{testpack}
\begin{document}
Here is the text.
\end{document}
那么前两个加载选项将提供所需的行为。但是,当加载时testpack
没有任何选项,则根本不会执行任何代码。我假设.default
语句可以实现这个技巧,但显然它没有。
有任何想法吗?
答案1
您正在寻找.initial
。.default
设置一个默认值,如果指定了键但没有提供值,则应用该默认值。但 .initial
不适用于子键(来自手册“请注意,不涉及任何子键。”)。因此,为您的选择键设置初始值的最简单方法是使用lastword=no
。但请记住,由于这是代码,因此每次调用它时都会插入一个,因此如果您稍后使用该选项,\AtEndDocument
您将得到。\par No last word.\par Yes last word.
lastword=yes
\documentclass{article}
\begin{filecontents*}{testpack.sty}
\NeedsTeXFormat{LaTeX2e}
\ProvidesPackage{testpack}[2019/10/01 v0.1]
\RequirePackage{pgfopts}
\pgfkeys{
/testpack/.cd,
lastword/.is choice,
lastword/yes/.code=\AtEndDocument{\par Yes last word.},
lastword/no/.code=\AtEndDocument{\par No last word.},
lastword=no
}
\ProcessPgfPackageOptions*
\end{filecontents*}
%\usepackage[lastword=yes]{testpack}
%\usepackage[lastword=no]{testpack}
\usepackage{testpack}
\begin{document}
Here is the text.
\end{document}
答案2
无论如何,我通过检查是否调用了任何方法解决了这个问题。如果没有,则包仍然需要初始化,然后我才能调用所需的代码。
更新后的包如下
\NeedsTeXFormat{LaTeX2e}
\ProvidesPackage{testpack}[2019/10/01 v0.1]
%
\newif\if@testpack@needs@init@
\@testpack@needs@init@true
%
\newcommand{\testpack@handle@yes}{%
\@testpack@needs@init@false
\AtEndDocument{\par Yes last word.}
}
\newcommand{\testpack@handle@no}{%
\@testpack@needs@init@false
\AtEndDocument{\par No last word.}
}
%
\RequirePackage{pgfopts}
\pgfkeys{
/testpack/.cd,
lastword/.is choice,
lastword/yes/.code=\testpack@handle@yes{},
lastword/no/.code=\testpack@handle@no{},
}
\ProcessPgfPackageOptions*
%
\if@testpack@needs@init@
\testpack@handle@no{}
\fi
代码现在给出了预期的结果。你怎么看?对这种方法的稳健性有什么看法?
答案3
这是我的解决方案。
文件testpack.sty
:
\NeedsTeXFormat{LaTeX2e}
\ProvidesPackage{testpack}[2019/10/01 v0.1]
%
%
\RequirePackage{pgfopts}
\pgfkeys{
/testpack/.cd,
lastword/.is choice,
lastword/yes/.code={
\def\testpack@at@end@document{\AtEndDocument{\par Yes last word.}}
},
lastword/no/.code={
\def\testpack@at@end@document{\AtEndDocument{\par No last word.}}
},
lastword=no,
}
\ProcessPgfPackageOptions*
\testpack@at@end@document
然后,一个测试文件:
\documentclass{article}
\usepackage[lastword=yes,lastword=no]{testpack}
\begin{document}
AAA
\end{document}