LaTeX 对以下文件的操作不符合我的预期。
第一个文件:
\documentclass[doublespacing]{article}
\usepackage{lipsum} % for dummy text only
\begin{document}
\lipsum
\end{document}
第二个文件:
\documentclass[doublespacing]{article}
\usepackage{setspace}
\usepackage{lipsum} % for dummy text only
\begin{document}
\lipsum
\end{document}
对于第一个文件,LaTeX 按预期发出此警告:
LaTeX Warning: Unused global option(s):
[doublespacing].
但是,第二个文件编译时没有任何警告,并且使用双倍间距来排版文本。
为什么第二个文件有效?似乎应该解析给 documentclass 的选项,并在遇到article
之前发出警告。\usepackage{setspace}
再介绍一下背景:我试图扩展一个文档类以包含doublespacing
(通过使用\DeclareOption{doublespacing}
等),但我无法正确配置行为,因为setspace
包会像我已完成 一样拾取它\usepackage{doublespacing}
。有没有办法不让用户setspace
看到doublespacing
documentclass 选项?
答案1
该行中给出的每个选项都\documentclass
被称为全球的并传递给随后加载的所有包。如果包不知道该选项,则不执行任何操作,否则将应用该选项。(请参阅clsguide.pdf
TeX 系统或这里了解详情。
因此这是预期的行为:说
\documentclass[doublespacing]{article}
\usepackage{setspace}
相当于说
\documentclass{article}
\usepackage[doublespacing]{setspace}
(因为article
班级不知道这个选项)。
如果您编写了一个具有doublespacing
选项的类,则结果是,当指定此选项时,它将传递给之后加载的所有包。
setspace
不过,在这种特殊情况下,你可以通过发出指令来恢复设置
\AtBeginDocument{\setstretch{<factor>}}
<factor>
你有多喜欢呢?
答案2
文档选项(按包或按文档类)根据需要进行组装和处理(如果使用该\DeclareOption
方法)。仅在文档的开头 - at 处\begin{document}
,会检查是否已处理所有选项。从latex.ltx
,以下是在 进行处理的\begin{document}
:
\def\document{\endgroup
\ifx\@unusedoptionlist\@empty\else
\@latex@warning@no@line{Unused global option(s):^^J%
\@spaces[\@unusedoptionlist]}%
%...
未知选项保留在 中\@unusedoptionlist
。因此,即使doublespacing
被传递给文档类,它也会在以下情况下被处理:setspace
已加载。来自setspace.sty
:
\DeclareOption{singlespacing}{\AtEndOfPackage{\singlespacing}}
\DeclareOption{onehalfspacing}{\AtEndOfPackage{\onehalfspacing}}
\DeclareOption{doublespacing}{\AtEndOfPackage{\doublespacing}}
\ProcessOptions