当我为自己的课程使用 pgfopts 时,无法将选项传递给 \LoadClass{book}

当我为自己的课程使用 pgfopts 时,无法将选项传递给 \LoadClass{book}

我正在为课程指南编写一个课程,并以标准book课程为基础。以下是答案埃格尔使用 pgfopts 时仅传递其他选项,我开始研究自己的课程。但不知何故,虽然它没有抱怨额外的选项,并且在调用时似乎有正确的选项LoadClass,但这些选项都不会影响课程的行为book

\begin{filecontents}{courseguide.cls}
\NeedsTeXFormat{LaTeX2e}
\ProvidesClass{courseguide}
\RequirePackage{pgfopts}

%%%% PGF options
\def\Course@classoptions{10pt}

%% Academic year
\newcounter{AY}
\setcounter{AY}{\the\year}

\pgfkeys{
  /Course/.cd,
  %%% This is the academic year
  AY/.code=\setcounter{AY}{#1},
  AY/.default=\the\year,
  .unknown/.code={
    \message{mwe found unknown key: \pgfkeyscurrentname}
    \edef\Course@classoptions{\Course@classoptions,\pgfkeyscurrentname}
  }
}

\ProcessPgfOptions{/Course}

\message{MWE Current \\Course@classoptions: \Course@classoptions}

\LoadClass[\Course@classoptions]{book}
\end{filecontents}

\documentclass[AY=2026,letterpaper,landscape,12pt]{courseguide}
\usepackage{lipsum}
\begin{document}

The academic year is \theAY-{\the\numexpr\theAY+1}

\end{document}

这是一个不起作用的 MWE。选项出现可以通过,但总是 10pt、a4、纵向。我以为这很简单,但我却不知所措。


附录。在第一个答案(这很有帮助)之后,我很困惑,如果我\usepackage{showframe}从(固定的)测试文档中删除会发生什么。打印的内容仍然相同:

学年为2026-2027。

该文件使用的纸张尺寸为 W=11.00215 英寸、H=8.50166 英寸。

文档字体大小为12。

但实际文档(通过检查 evince 中的 PDF 属性)是 A4 纸。

latex 和 evince 中的尺寸冲突

如果我不删除该线而是用 替换它\usepackage[noframe]{showframe},则尺寸和方向是相同的。

答案1

您的问题中有一些错误的假设。

这是一个奇怪的特征标准类不设置后端特定长度的纸张尺寸。因此,例如,使用 PDFLaTeX 来编译

\documentclass[a4paper]{book}
\begin{document}
Test
\end{document}

\documentclass[a4paper,landscape]{book}
\begin{document}
Test
\end{document}

两者都会导致 PDF 具有关于页面大小的相同文档信息,通常(使用pdfinfo):

Page size:       595.276 x 841.89 pts (A4)

然而,如您所见,如果添加更多文本,文档将会有所不同:

\documentclass[a4paper]{book}
\usepackage{lipsum}
\begin{document}
\lipsum
\end{document}

在此处输入图片描述

对阵

\documentclass[a4paper,landscape]{book}
\usepackage{lipsum}
\begin{document}
\lipsum
\end{document}

在此处输入图片描述

因此,在 PDF 中看不到正确的尺寸并不意味着book没有处理选项letterpaper(这已经是 的默认设置book)或landscape

要查看 PDF 中的真实纸张尺寸,您可以使用pdfmanagement-testphase(有关更多信息,请参阅手册),\DocumentMetadata{}在之前添加或加载类似或的\documentclass包。hyperrefshowframe

如果您查看生成的 PDF 的字体信息,您会看到(使用pdffonts):。AKGSOO+CMR12该部分CMR12表示使用 12pt。并且在log文件中您会发现,bk12.clo加载的是 ,而不是bk10.clo。因此,您关于仍然使用 10pt 的假设也是错误的。

为了查看正确的 PDF 尺寸以及使用的字体大小,我建议使用另一个测试文件:

\begin{filecontents}{courseguide.cls}
\NeedsTeXFormat{LaTeX2e}
\ProvidesClass{courseguide}
\RequirePackage{pgfopts}

%%%% PGF options
\def\Course@classoptions{10pt}

%% Academic year
\newcounter{AY}
\setcounter{AY}{\the\year}


\pgfkeys{
  /Course/.cd,
  %%% This is the academic year
  AY/.code=\setcounter{AY}{#1},
  AY/.default=\the\year,
  .unknown/.code={
    \message{mwe found unknown key: \pgfkeyscurrentname}
    \edef\Course@classoptions{\Course@classoptions,\pgfkeyscurrentname}
  }
}

\ProcessPgfOptions{/Course}

\message{MWE Current \\Course@classoptions: \Course@classoptions}

\LoadClass[\Course@classoptions]{book}
\end{filecontents}

\documentclass[AY=2026,letterpaper,landscape,12pt]{courseguide}
\usepackage{lipsum}
\usepackage{showframe}
\usepackage{printlen}
\begin{document}

The academic year is \theAY-{\the\numexpr\theAY+1}.

\uselengthunit{in}
The document uses paper of size W=\printlength{\paperwidth},
H=\printlength{\paperheight}.

The document font size is \csname f@size\endcsname.

\end{document}

在此处输入图片描述

如您所见,所有选项均按预期处理。

但是,请注意,的选项book是按顺序处理的,而不是按使用顺序定义的。因此,如果您使用:

\begin{filecontents}[overwrite]{courseguide.cls}
\NeedsTeXFormat{LaTeX2e}
\ProvidesClass{courseguide}
\RequirePackage{pgfopts}

%%%% PGF options
\def\Course@classoptions{12pt}% CHANGED!!!

%% Academic year
\newcounter{AY}
\setcounter{AY}{\the\year}


\pgfkeys{
  /Course/.cd,
  %%% This is the academic year
  AY/.code=\setcounter{AY}{#1},
  AY/.default=\the\year,
  .unknown/.code={
    \message{mwe found unknown key: \pgfkeyscurrentname}
    \edef\Course@classoptions{\Course@classoptions,\pgfkeyscurrentname}
  }
}

\ProcessPgfOptions{/Course}

\message{MWE Current \\Course@classoptions: \Course@classoptions}

\LoadClass[\Course@classoptions]{book}
\end{filecontents}

\documentclass[AY=2026,letterpaper,landscape,10pt]{courseguide}% FONT SIZE OPTION CHANGED
\usepackage{lipsum}
\usepackage{showframe}
\usepackage{printlen}
\begin{document}

The academic year is \theAY-{\the\numexpr\theAY+1}.

\uselengthunit{in}
The document uses paper of size W=\printlength{\paperwidth},
H=\printlength{\paperheight}.

The document font size is \csname f@size\endcsname.

\end{document}

您仍然会有 12pt,因为book使用以下方法定义字体大小选项:

\if@compatibility
  \renewcommand\@ptsize{0}
\else
  \DeclareOption{10pt}{\renewcommand\@ptsize{0}}
\fi
\DeclareOption{11pt}{\renewcommand\@ptsize{1}}
\DeclareOption{12pt}{\renewcommand\@ptsize{2}}

因此 12pt 总是最后处理。因此在 的定义中设置默认值\Course@classoptions可能会有问题。

相关内容