使用 pgfkeys 通过自定义类接口 \myclsset 传递选项时出现问题

使用 pgfkeys 通过自定义类接口 \myclsset 传递选项时出现问题

我的目的是创建一个带有接口设置命令的类\myclsset

\documentclass{myclass}

\myclsset{key1=val1, key2=val2, ..} % key-value list

\begin{document}
...
\end{document}

其中\myclsset,作为文档接口,\documentclass{}调用后可以在任何地方顺利使用。我选择pgfkeys实现是出于一些特定的原因。

下面是一个.cls文件,我尝试在其中创建一个选择键,其值是一个布尔\if开关,它可以为我完成格式化工作:

\NeedsTeXFormat{LaTeX2e}
\ProvidesClass{myclass}[2019/03/27 My Test Class]

\RequirePackage{pgfkeys,pgfopts}

\newif\ifmyclass@section@italic
\pgfkeys{%
   /myclass/.cd,
   section/.is choice,
   section/italic/.code = {\myclass@section@italictrue}
}

% Set up the interface for the document class.
\newcommand*{\myclsset}[1]{%
   \pgfqkeys{/myclass}{#1}%
}

\DeclareOption*{\PassOptionsToClass{\CurrentOption}{article}}
\ProcessOptions

\ProcessPgfOptions{/myclass} % Processing options through pkg/class

\LoadClass{article} % Load base class

\RequirePackage{titlesec} % Load a package

\ifmyclass@section@italic
   \titleformat*{\section}{\itshape} % make section title italic
\else
   \relax
\fi
\endinput

MWE 表明这是\documentclass[...]{myclass}可行的:

\documentclass[section = italic]{myclass}

\begin{document}
\section{A Topic}
\end{document}

然而,这种模式:

\documentclass{...}
\myclsset{...} % key-value list in braces

根本不起作用:

\documentclass{myclass}

\myclsset{section = italic}

\begin{document}
\section{A Topic}
\end{document}

章节标题没有切换为斜体。所以问题是我错过了什么导致无法正常\myclsset工作?

答案1

问题是,\ifmyclass@section@italic只有在加载类文件时才会检查条件,但您的\myclsset调用发生在那之后。\myclsset然后将开关设置为true正确,但是条件不会再被检查。

您想要做的是将处理当前键设置的所有代码推迟到实际文档开始时。为此,有一个\AtBeginDocument{...}钩子。

您的章节标题处理将看起来像

\newcommand\myclass@handle@keys{%
    \ifmyclass@section@italic
        \titleformat*{\section}{\itshape} % make section title italic
    \else
        \relax
    \fi
}
\AtBeginDocument{\myclass@handle@keys}

无论密钥设置在序言中的什么位置发生,它们都将在文档主体部分的开始时得到正确处理。

相关内容