我发现了一些奇怪的行为,我似乎无法解决。我正在编写一个基于 memoir 类的类文件的新版本。现在,memoir 类有两个互斥的选项:oneside 和 twoside(twoside 是默认值)。在我的类中,我希望 oneside 是默认值。所以我的类文件的顶部是:
\NeedsTeXFormat{LaTeX2e}[1999/12/01]
\ProvidesClass{mythesis}[01/01/2011, v1.0, my own thesis class]
\RequirePackage{ifthen}
\RequirePackage{calc}
\AtEndOfClass{\RequirePackage{microtype}}
%
\newboolean{@myopti}
\setboolean{@myopti}{false}
\newboolean{@myoptii}
\setboolean{@myoptii}{false}
%
\DeclareOption{myopti}{\setboolean{@myopti}{true}}
\DeclareOption{myoptii}{\setboolean{@myoptii}{true}}
%
\DeclareOption*{\PassOptionsToClass{\CurrentOption}{memoir}}
\LoadClass[12pt,final]{memoir}
\ExecuteOptions{myopti,oneside}
% <remainder of class code>
这无法使 oneside 成为默认值。如果我将其更改为:
\LoadClass[12pt,final,oneside]{memoir}
\ExecuteOptions{myopti}
然后如果我在主文件中执行:
\documentclass[twoside]{mythesis}
它仍然处于单侧模式。我唯一能让它工作的方法就是
\LoadClass[12pt,final]{memoir}
\ExecuteOptions{myopti}
在类文件中,然后根据需要指定 oneside(记住,twoside 是默认的,因为我正在加载回忆录)。
但是我不希望用户需要指定一侧,因为我想要:
\documentclass{mythesis}
站在一边。
我不认为这是一个回忆录问题,而是一个 LaTeX2e 问题,或者是一个我只是不知道正确解决方法的问题。
谢谢
答案1
为了正确地做到这一点,你应该创建一个 if-switch 或布尔值,它oneside
由twoside
你的包,然后将最终选项传递给memoir
。请注意,您应该处理或执行您的选项前加载另一个类或包。
\NeedsTeXFormat{LaTeX2e}[1999/12/01]
\ProvidesClass{mythesis}[01/01/2011, v1.0, my own thesis class]
\RequirePackage{ifthen}
\RequirePackage{calc}
\AtEndOfClass{\RequirePackage{microtype}}
%
\newboolean{@myopti}
\setboolean{@myopti}{false}
\newboolean{@myoptii}
\setboolean{@myoptii}{false}
\newboolean{@myopt@oneside}
\setboolean{@myopt@oneside}{true}
%
\DeclareOption{myopti}{\setboolean{@myopti}{true}}
\DeclareOption{myoptii}{\setboolean{@myoptii}{true}}
\DeclareOption{oneside}{\setboolean{@myopt@oneside}{true}}
\DeclareOption{twoside}{\setboolean{@myopt@oneside}{false}}
%
\DeclareOption*{\PassOptionsToClass{\CurrentOption}{memoir}}
\ExecuteOptions{myopti}
\ProcessOptions*
\ifthenelse{\boolean{@myopt@oneside}}
{\PassOptionsToClass{oneside}{memoir}}
{\PassOptionsToClass{twoside}{memoir}}
\LoadClass[12pt,final]{memoir}
答案2
我知道这是一个老问题,但我刚刚发现了一些东西……我遇到了一个相同的问题,只是字体大小不同。我发现您可以使用命令\PassOptionsToClass{<options-list>}{<package-name>}
来设置默认值。我是初学者,所以我不知道这是否真的是错误的,或者做了一些我不希望它做的事情,但到目前为止一切都很好。所以我猜你的课程代码最终会是这样的(我添加了 Martin Scharrer 的更正):
\NeedsTeXFormat{LaTeX2e}[1999/12/01]
\ProvidesClass{mythesis}[01/01/2011, v1.0, my own thesis class]
\RequirePackage{ifthen}
\RequirePackage{calc}
\AtEndOfClass{\RequirePackage{microtype}}
%
\newboolean{@myopti}
\setboolean{@myopti}{false}
\newboolean{@myoptii}
\setboolean{@myoptii}{false}
%
\DeclareOption{myopti}{\setboolean{@myopti}{true}}
\DeclareOption{myoptii}{\setboolean{@myoptii}{true}}
%
\PassOptionsToClass{oneside}{memoir}
\DeclareOption*{\PassOptionsToClass{\CurrentOption}{memoir}}
\ExecuteOptions{myopti}
\ProcessOptions*
\LoadClass[12pt,final]{memoir}
% <remainder of class code>
然后您可以使用\documentclass{mythesis}
或\documentclass[twoside]{mythesis}
。好吧,至少我在这里得到的 MWE(具有更多选项)如下:
\NeedsTeXFormat{LaTeX2e}
\ProvidesClass{memtest}[2018/07/10 v1.0 Testing Memoir class]
% default options
\PassOptionsToClass{
12pt,
a4paper,
openright, % openleft, openright, openany
oneside, % oneside, twoside
}{memoir}
\DeclareOption*{
\PassOptionsToClass{\CurrentOption}{memoir}
}
\ProcessOptions\relax
\LoadClass{memoir}