我正在使用该类memoir
,并希望新章节从左侧页面开始,除非相关章节只有一页长。两者都openleft
没有openany
给出此行为。如果我可以通过这样做获得此行为,我并不反对使用其他类或使用部分而不是章节。
答案1
此行为的实现需要知道章节的长度。然后它可以在章节的开头和结尾放置参考资料,并计算页数。
类memoir
(或标准 LaTeX 类)用于\chapter
标记章节的开始。但是没有标记来结束章节。因此必须猜测章节的结尾。例如,章节结束于:
- 下一个
\chapter
, - 下一个
\part
, - 文档结束。
该解决方案使用绝对页码和绝对章节号,以避免出现非唯一页码和章节号(带星号的章节等)的问题。我使用包来zref
处理参考文献,因为它提供了更多的控制权,可以控制写入的内容(只需要绝对页码作为参考数据)和写入方式。输出最后一页后,延迟写入不起作用,因此zref
使用立即包装器。下次输出时延迟写入(参见\label
)是没有必要的,因为我们知道页码位于页面的开头。
\documentclass{memoir}
\usepackage{zref-abspage}
\usepackage{atveryend}
\makeatletter
% Because of starred chapters we need an extra chapter counter
% for identifying a chapter. \thechapter is not unique in general.
\newcounter{abschap}
\renewcommand*{\theabschap}[1]{abschap.\the\value{abschap}.#1}
\renewcommand*{\clearforchapter}{%
\EndChapter
\stepcounter{abschap}%
\zref@refused{\theabschap{beg}}%
\zref@refused{\theabschap{end}}%
\def\ClearChapter{\cleartoverso}%
\zref@ifrefundefined{\theabschap{beg}}{%
}{%
\zref@ifrefundefined{\theabschap{end}}{%
}{%
\ifnum\numexpr
\zref@extract{\theabschap{end}}{abspage}%
-\zref@extract{\theabschap{beg}}{abspage}%
= 1 %
\let\ClearChapter\@empty
\fi
}%
}%
\ClearChapter
\zref@wrapper@immediate{%
\zref@labelbyprops{\theabschap{beg}}{abspage}%
}%
}
\newcommand*{\EndChapter}{%
% flush floats
\clearpage
% Set an anchor after the last page with contents of the current
% chapter.
\zref@wrapper@immediate{%
\@ifundefined{\theabschap{end}}{%
\zref@labelbyprops{\theabschap{end}}{abspage}%
\global\expandafter\let\csname\theabschap{end}\endcsname\@empty
}{}%
}%
}
\AfterLastShipout{\EndChapter}
\newcommand*{\org@part}{}
\let\org@part\part
\renewcommand*{\part}{%
\EndChapter
\org@part
}
\makeatother
\begin{document}
Title\newpage
\tableofcontents
\chapter{A}
Short.
\chapter{B}
Long\newpage
Page B.2
\chapter{C}
Short.
\chapter{D}
Long\newpage
Page D.2\newpage
Page D.3
\chapter{E}
Short.
\end{document}