新的选项和加载的类选项有错误吗?

新的选项和加载的类选项有错误吗?

我发现了一些奇怪的行为,我似乎无法解决。我正在编写一个基于 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 或布尔值,它onesidetwoside你的包,然后将最终选项传递给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}

相关内容