当我将 `\ExecuteOptions` 与 `\usepackage{geometry}` 一起使用时出现错误

当我将 `\ExecuteOptions` 与 `\usepackage{geometry}` 一起使用时出现错误

我正在编写一个自定义文档类。它很简单,但它将使用该geometry包来设置页面大小、方向和边距。但是……每当我使用该包时,\ExecuteOptions命令停止工作。看看这个简单的测试用例:

文件:我的类名.cls

\ProvidesClass{myclass}
\LoadClass{article}

\usepackage[brazilian]{babel}
\usepackage[utf8]{inputenc}
\usepackage[T1]{fontenc}

\usepackage[a4paper,
    includehead, includefoot,
    headheight=23mm, headsep=5mm, footskip=1.5em]{geometry}

\DeclareOption{landscape}{\geometry{landscape, top=12mm, bottom=12mm, left=15mm, right=15mm}}
\DeclareOption{portrait}{\geometry{portrait, top=15mm, bottom=15mm, left=12mm, right=12mm}}
\ExecuteOptions{portrait}
\ProcessOptions

文件:文档

% This works: \documentclass{myclass}
% This does not work: \documentclass[foobar]{myclass}
% This does not work: \documentclass[landscape]{myclass}
% This does not work: \documentclass[anythingITypeHere]{myclass}
\documentclass[landscape]{myclass}

\title{Simple testcase}

\begin{document}

Simple experiment... I think it should have worked.

\end{document}

错误信息:

! Undefined control sequence.
\ExecuteOptions ...eserved@a \CurrentOption \@nil 

l.19 \ExecuteOptions{portrait}

如果我没有向\documentclass命令传递任何选项,那么它会编译。但是,如果我尝试传递任何内容(如上例所示),它会失败并显示那条奇怪的消息。

如果我注释掉\usepackage[...]{geometry},并\geometry用其他内容替换,那么它就会编译。所以,我很确定这个包正在干扰\ExecuteOptions命令。

如果我在导入包之前放置两者,我会收到有关未定义的错误\DeclareOption(正如预期的那样)。\ExecuteOptions\geometry

如果我\DeclareOption在 之前放置\usepackage,然后\ExecuteOptions在其之后离开,那么我会收到有关在选项部分内导入包的错误。

那么...问题是如何在仍然使用geometry包的情况下实现文档类选项?换句话说,如何使上述代码工作?

答案1

\DeclareOption{landscape}{\PassOptionsToPackage{landscape,top=12mm,bottom=12mm,left=15mm,right=15mm}{geometry}}
\DeclareOption{portrait}{\PassOptionsToPackage{portrait,top=15mm,bottom=15mm,left=12mm,right=12mm}{geometry}}
\ExecuteOptions{portrait}
\ProcessOptions

\RequirePackage{geometry}
\geometry{%
  a4paper,
  includehead, 
  includefoot,
  headheight=23mm,
  headsep=5mm,
  footskip=1.5em
}

相关内容