如何执行由 \DeclareOption* 处理的 \ExecuteOptions?

如何执行由 \DeclareOption* 处理的 \ExecuteOptions?

我正在编写一个基于报告类的类文件,我希望其默认字体大小为 12 pt 而不是 10 pt。我尝试使用命令指定默认字体大小\ExecuteOptions{},但它没有按我预期的方式工作。这是一个简单的例子:

测试类.cls

\NeedsTeXFormat{LaTeX2e}
\ProvidesClass{testclass}[2023-02-07 Test class]

% All options passed to report class
\DeclareOption*{\PassOptionsToClass{\CurrentOption}{report}}

% Execute options with default values
\ExecuteOptions{12pt}

% Process options
\ProcessOptions\relax

% Load base class
\LoadClass{report}

% etc.

测试文档

\documentclass{testclass}
\usepackage{lipsum}

\begin{document}

\chapter{A chapter}
\section{A section}
\lipsum[1-10]

\end{document}

但是当我运行此代码时,字体大小仍为 10pt,而不是 12pt。当我编写命令时\ExecuteOptions{12pt},我期望它执行内部代码,\DeclareOption*{}因为这就是处理用户提供给类的所有选项的方式。但显然这并不适用于通过其他方式指定的选项,例如\ExecuteOptions{}

有没有什么方法可以让它\ExecuteOptions{}执行代码\DeclareOption*{}

(注意:如果您专门添加\DeclareOption{12pt}{},它可以起作用,但为您可能需要的每个可能的默认选项编写声明并不是很实际。)

答案1

使用的循环\ExecuteOptions非常简单,不使用任何代码来检查是否存在任何选项。您可以改用以下代码来检查已定义的选项并使用 fallback 选项:

\begin{filecontents*}{testclass.cls}
\NeedsTeXFormat{LaTeX2e}
\ProvidesClass{testclass}[2023-02-07 Test class]

% All options passed to report class
\DeclareOption*{\PassOptionsToClass{\CurrentOption}{report}}

\newcommand*\ExecuteOptionsOrUseFallback[1]{%
  \edef\@fortmp{\zap@space#1 \@empty}%
  \def\reserved@a##1\@nil{%
    \@for\CurrentOption:=\@fortmp\do
            {\@ifundefined{ds@\CurrentOption}%
                {\default@ds}%
                {\csname ds@\CurrentOption\endcsname}}%
    \edef\CurrentOption{##1}}%
  \expandafter\reserved@a\CurrentOption\@nil}

% Execute options with default values
\ExecuteOptionsOrUseFallback{12pt}

% Process options
\ProcessOptions\relax

% Load base class
\LoadClass{report}
\end{filecontents*}

\documentclass{testclass}

\begin{document}
This is in size: \makeatletter\f@size pt\makeatother.
\end{document}

相关内容