我如何防止重复的章节标题?

我如何防止重复的章节标题?

对于我的文档,我希望当内容继续到新页面时重复显示章节和节标题。为了实现这一点,我使用了与以下问题答案中类似的方法:这个问题

这种方法效果很好,但有一种情况除外。如果某一节结束于一页的最末尾,则下一节的标题将在下一页的顶部显示两次。

以下是一些演示该问题的示例代码:

\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 内部工作原理的人的意见。

相关内容