使用 pgfopts 时如何执行默认选项?

使用 pgfopts 时如何执行默认选项?

我想使用 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}

相关内容