我正在编写一个自定义文档类。它很简单,但它将使用该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
}