我的目的是创建一个带有接口设置命令的类\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}
无论密钥设置在序言中的什么位置发生,它们都将在文档主体部分的开始时得到正确处理。