我想要编写几个类,其中大多数将使用 KOMA 类作为基类。
然而,我偶然发现了一个问题,如果在包装类中给出某些选项(主要与布局有关),则不会处理它们:
\begin{filecontents}{test.cls}
\ProvidesClass{test}[2015/01/01]
\DeclareOption*{\PassOptionsToClass{\CurrentOption}{scrartcl}}
\ProcessOptions\relax
\LoadClass[paper=a5]{scrartcl}
\end{filecontents}
\documentclass{test}
\usepackage{blindtext}
\begin{document}
\section{Test}
\blindtext
\end{document}
这导致
LaTeX Warning: Unused global option(s): [paper=a5]
如果我给出选项,\documentclass[paper=a5]{test}
它就会被正确使用,因为我将选项传递给了 scrartcl。但是我想更改布局的默认值。
我怎样才能实现这个目标?
答案1
使用\LoadClass
选项是一件棘手的事情,因为没有任何选项会传递给包,所有选项都是为类准备的。KOMA paper
-sclass 不知道该选项,因为包typearea
处理布局内容,因此发出警告。
允许使用documentclass
选项解析到包,因此这种方法完全没问题。如果您想设置固定的页面大小,请在加载类之前将选项传递给包,就像类内部所做的那样。这种排队机制运行良好,但使用显式选项加载包会失败。
当然,总有欺骗的余地。KOMA 类知道选项 a5paper
,a4paper
以及其他一些选项,并将传递正确的选项以typearea
自行打包。
\begin{filecontents}{\jobname.cls}
\ProvidesClass{\jobname}[2015/01/01]
\DeclareOption*{\PassOptionsToClass{\CurrentOption}{scrartcl}}
\ProcessOptions\relax
\PassOptionsToPackage{ paper=a5,pagesize }{typearea}
\LoadClass{scrartcl}
\end{filecontents}
\documentclass{\jobname}
\usepackage{blindtext}
\begin{document}
\section{Test}
\blindtext
\end{document}
当然,你可以将布局工作推迟到以后,甚至可以在文档中更改它。有一件事要记住,告诉typearea
做一些重新计算。如果你可以更改纸张尺寸,8用户*也可以这样做。
\begin{filecontents}{\jobname.cls}
\ProvidesClass{\jobname}[2015/01/01]
\DeclareOption*{\PassOptionsToClass{\CurrentOption}{scrartcl}}
\ProcessOptions\relax
\LoadClass{scrartcl}
\KOMAoptions{paper=a3,pagesize,paper=landscape}
\recalctypearea
\end{filecontents}
\documentclass[paper=a5]{\jobname}
\usepackage{blindtext}
\begin{document}
\section{Test}
\blindtext
\end{document}
在 KOMA 3.17 版中,该typearea
选项pagesize
成为默认选项。所有仍在运行旧版本的用户(TeX Live 2014 已冻结)都需要明确提供该选项。我将其添加到传递给的选项列表中,typearea
以方便他们使用。感谢 @esdd 给我留言。
答案2
这个答案也解决了这个问题:
LaTeX warning: Unused global option(s): [DIV].
这是由于以下情况引起的:DIV=计算由 LoadClass 加载到使用某些 KOMA 类定义的类中,例如我定义了一个类 Style.cls 并在其中的代码
\LoadClass[DIV=calc]{scrbook}
这会导致显示上述警告信息。
非常好的答案,六年多后它仍然很有帮助。
非常感谢,并祝贺回答问题的人以及长期保持答案活跃的人。