对于我的文档,我希望当内容继续到新页面时重复显示章节和节标题。为了实现这一点,我使用了与以下问题答案中类似的方法:这个问题。
这种方法效果很好,但有一种情况除外。如果某一节结束于一页的最末尾,则下一节的标题将在下一页的顶部显示两次。
以下是一些演示该问题的示例代码:
\documentclass[twoside]{memoir}
\usepackage[papersize={8.5in,11in}, vmargin=0.5in, outer=1in, inner=0.5in, includehead, includefoot]{geometry}
\usepackage{color}
\usepackage{fontspec}
\usepackage{newunicodechar}
\usepackage{lipsum}% http://ctan.org/pkg/lipsum
\usepackage{everyshi}% http://ctan.org/pkg/everyshi
\usepackage{etoolbox}% http://ctan.org/pkg/etoolbox
\usepackage[none]{hyphenat}
\setmainfont{OpenSans}
\makeatletter
\makechapterstyle{mychapter}{
% Remove 'Chapter 1' from beginning of chapters
\renewcommand\@makechapterhead[1]{%
\chapterheadstart% \vspace*{50\p@}%
{%\parindent \z@ \raggedright \normalfont
%\parskip \z@
\parindent \z@ \memRTLraggedright \normalfont%
\printchaptertitle{##1}% \Huge \bfseries #1
\afterchaptertitle% \par\nobreak \vskip 40\p@
}
}
\setlength{\afterchapskip} {10pt} % Reduce spacing after headings
% Remove spacing before chapter titles
\renewcommand\chapterheadstart {}
%\setlength{\beforechapskip}{0pt} % Doesn't work
% Allow new chapter to start on right side page
\renewcommand\clearforchapter{
\clearpage
}
}
% Repeating headings (based on https://tex.stackexchange.com/questions/47646/re-displaying-section-headings-after-page-breaks)
\let\@section@title@\relax% Section heading storage
\newcommand{\beginsection}[1]{%
{\normalfont\secheadstyle #1}
\par
\vspace{0.5pt} % Required for vertical alignment, not quite sure why it's necessary
\gdef\@section@title@{#1}
}
\makepagestyle{headings} {} % Disable default Memoir repeated headings, we'll make our own
\definecolor{grey}{gray}{0.6}
\EveryShipout{%
\ifdim\pagetotal>\pagegoal% There is content overflow on this page
\begingroup\let\protect\@typeset@protect
{\textcolor{grey}{\chaptitlefont\f@rhdr\ (cont'd.)}}% Reprint chapter header
\afterchaptertitle
\@afterheading
\vspace{6pt} % Required for vertical alignment, not quite sure why it's necessary
{
\@tempskipa \beforesecskip\relax%
\textcolor{grey}{\normalfont\secheadstyle \@section@title@\ (cont'd.)}%
}
\endgroup
\fi%
}
\makeatother
%\raggedright
\setlength{\parindent}{0pt}%
\nonzeroparskip
\begin{document}
\chapterstyle{mychapter}
\chapter{Good Chapter}
\beginsection{Section 1}\lipsum[1-2]
\beginsection{Section 2}\lipsum[1-7]
\beginsection{Section 3}\lipsum[1-4]
\chapter{Problem Chapter}
\beginsection{Section 1}\lipsum[7-14]
\beginsection{Section 2}\lipsum[1-6]
\end{document}
以下是截图:
如您所见,“问题章节”中的第 2 节的标题显示了两次。
我该如何避免这个问题?我知道最简单的解决办法是让每个部分都从新的一页开始,但这对我来说是不可接受的。
提前致谢!
答案1
我想到了一种似乎可行的方法,但它增加了一些不必要的空间,所以我很想知道是否有人有更干净的方法。
\documentclass[twoside]{memoir}
\usepackage[papersize={8.5in,11in}, vmargin=0.5in, outer=1in, inner=0.5in, includehead, includefoot]{geometry}
\usepackage{color}
\usepackage{fontspec}
\usepackage{newunicodechar}
\usepackage{lipsum}% http://ctan.org/pkg/lipsum
\usepackage{everyshi}% http://ctan.org/pkg/everyshi
\usepackage{etoolbox}% http://ctan.org/pkg/etoolbox
\usepackage[none]{hyphenat}
\setmainfont{OpenSans}
\makeatletter
\makechapterstyle{mychapter}{
% Remove 'Chapter 1' from beginning of chapters
\renewcommand\@makechapterhead[1]{%
\chapterheadstart% \vspace*{50\p@}%
{%\parindent \z@ \raggedright \normalfont
%\parskip \z@
\parindent \z@ \memRTLraggedright \normalfont%
\printchaptertitle{##1}% \Huge \bfseries #1
\afterchaptertitle% \par\nobreak \vskip 40\p@
}
}
\setlength{\afterchapskip} {10pt} % Reduce spacing after headings
% Remove spacing before chapter titles
\renewcommand\chapterheadstart {}
%\setlength{\beforechapskip}{0pt} % Doesn't work
% Allow new chapter to start on right side page
\renewcommand\clearforchapter{
\clearpage
}
}
% Repeating headings (based on http://tex.stackexchange.com/questions/47646/re-displaying-section-headings-after-page-breaks)
\let\@section@title@\relax% Section heading storage
\newcommand{\beginsection}[1]{%
\let\@section@title@\relax
{\normalfont\secheadstyle #1}
\par
\vspace{0.5pt} % Required for vertical alignment, not quite sure why it's necessary
\gdef\@section@title@{#1}
}
\makepagestyle{headings} {} % Disable default Memoir repeated headings, we'll make our own
\definecolor{grey}{gray}{0.6}
\EveryShipout{%
\ifdim\pagetotal>\pagegoal% There is content overflow on this page
\begingroup\let\protect\@typeset@protect
\textcolor{grey}{\chaptitlefont\f@rhdr\ (cont'd.)}% Reprint chapter header
\afterchaptertitle
\@afterheading
\vspace{2pt} % Required for vertical alignment, not quite sure why it's necessary
\if\relax\@section@title@%
\relax
\else%
{
\@tempskipa \beforesecskip\relax%
\textcolor{grey}{\normalfont\secheadstyle \@section@title@\ (cont'd.)}%
}
\fi%
\endgroup
\fi%
}
\makeatother
%\raggedright
\setlength{\parindent}{0pt}%
\nonzeroparskip
\begin{document}
\chapterstyle{mychapter}
\chapter{Good Chapter}
\beginsection{Section 1}\lipsum[1-2]
\beginsection{Section 2}\lipsum[1-7]
\beginsection{Section 3}\lipsum[1-4]
\chapter{Problem Chapter}
\beginsection{Section 1}\lipsum[7-14]
\beginsection{Section 2}\lipsum[1-6]
\end{document}
这里的关键变化是,在我的 \beginsection 宏中,我首先取消设置章节标题,禁用标题。然后我打印标题。然后我开始一个新段落,我认为这是必要的,因为everyshi 的工作方式(但如果有办法摆脱它,我很乐意听到!)然后我将章节标题设置为新值。
编辑:我只想补充一下我完全没有根据的理论,说明为什么添加新段落会使其起作用。我认为,当 LaTeX 试图找出分页符的位置时,它会分块处理文档。当调用 \beginsection 而当前页面没有足够的空间容纳时(因此它会溢出到下一页的最顶部),LaTeX 似乎首先尝试将其定位在第一页,执行其内容(包括任何 /let 或 /def 语句),这就是为什么“问题章节”第二页的标题是“第 2 节”,而不是我预期的“第 1 节”。我对此感到惊讶的原因是,在我看来,从第二页的顶部开始,第 2 节似乎还没有开始,但我认为我提供的理论现在可以解释这一点。
我认为在设置节名的新值之前插入段落分隔符之所以有效,是因为这会将新值的设置移到不同的块中。当 LaTeX 开始渲染这个块时,它已经知道它在下一页上。因此,这个段落分隔符似乎允许我的宏的第一部分在上一页上运行,第二部分在新页面上运行。
无论如何,不知道这是否正确,我有兴趣听听更了解 LaTeX 内部工作原理的人的意见。