在页眉中插入预定义段落编号

在页眉中插入预定义段落编号

我正在处理的翻译文本具有已经在源文件中定义的“段落”编号,我必须保持一致。因此,我无法使用它\theparagraph来生成编号。更复杂的是,许多段落没有编号;此外,一些段落有一个范围(1-10 等)。这些预定义的编号已经存在于我的文档中。

出于美观原因,我想将这些数字显示在页眉中,而不是段落前面。我使用的是 fancyhdr。在页眉中,它们会出现在两页上,并且前面是节号(而不是章节号)。因此,每个页眉将包含以下内容:

AB-C

其中 A 是章节编号,B 是页面第一段的编号(当然,通常是上一页最后一段的延续),C 是页面最后一段的编号。

这应该已经够复杂了,但除此之外,我们还需要处理范围。在这种情况下,对于 B 号,我们选择范围中的第一位数字;对于 C 号,我们选择最后一位数字。

因此,如果页面上第一个段落的范围是 10-14,而最后一个段落的范围是 16-18,则该页面的页眉将具有 A.10-18。

我希望这清楚了,如果需要进一步解释,请告诉我。

还有一些细节。章节从新页面开始,我使用 titlesec 来实现。(出于某种原因,我下面给出的 MWE 在实际开始之前将第 2 节放在标题中,我还没有检查过这一点。)

章节和段落一样,都有硬编码的数字,因此如果方便的话,我们可以使用这些数字。但是,与段落不同,章节数字简单且连续,因此我认为让 LaTeX 计算它们可能更简单,因为这是它默认想要做的。但无论哪种方式都可以。

这是 MWE。我不确定最好的方法是什么,但我已将原始示例中的 MWE 更改为改编自 Andrew 的以下答案的 MWE。我接受他的答案是正确的,在很大程度上确实如此,但在使用代码时我发现了许多错误,我在下面列出了这些错误。

\documentclass{book}
\usepackage{lipsum}
\setlipsumdefault{1}
\usepackage{titlesec}

% fancy headings as defined by the OP except we need to be more careful
% with plain headings
\usepackage{fancyhdr}
\fancypagestyle{plain}{% need to reset \firstpara on pages without headers
  \fancyhf{} % clear all header and footer fields
  \renewcommand{\headrulewidth}{0pt}
  \fancyfoot[C]{\bfseries \thepage}
  \xdef\firstpara{\lastpara}
}
\pagestyle{fancy}
\fancyhf{}
\fancyhead[LE,RO]{\thepage}
\fancyhead[CO]{\rightmark}
\renewcommand{\sectionmark}[1]{%
   \markright{#1}%
   \def\firstpara{1}\def\lastpara{1}% reset counters each section
}
\fancyhead[CE]{\leftmark}
\renewcommand{\chaptermark}[1]{\markboth{#1}{}}
\fancyhead[LO,RE]{\thesection.\theparagraph}

\newcommand{\sectionbreak}{\clearpage\thispagestyle{plain}}
\renewcommand\thesection{\arabic{section}}

% now the macros for tracking the paragraph numbers
\def\firstpara{1}%    set to 1 by default
\def\lastpara{1}% set to 1 by default
\def\setparagraph#1-#2-#3|{%
   % if \firstpara=0 => new page => set \firstpara
   \ifnum\firstpara=0\def\firstpara{#1}\fi%
   % if #2=0 => only #1 is meaningful to set \lastpara to this
   % otherwise use #2
   \ifnum#2=0\def\lastpara{#1}\else\def\lastpara{#2}\fi%
}
\def\paragraph#1{%\textbf{#1}\space
  \setparagraph#1-0-|%
}
\def\theparagraph{%
  % if \firstpara=\lastpara print only \firstpara otherwise print a range
  \ifnum\firstpara=\lastpara\firstpara\else\firstpara--\lastpara\fi
  % reset firstpara and lastpara
  \xdef\firstpara{\lastpara}%
  %\let\lastpara\relax%
}

% back to the MWe
\begin{document}

\null
\pagestyle{empty}

\newpage

\newpage

\pagestyle{fancy}

\chapter{A Chapter}

\section{First Section}

\paragraph{1}\lipsum

\paragraph{2}\lipsum

\paragraph{3-5}\lipsum

\paragraph{6}\lipsum

\paragraph{7-17}\lipsum

\paragraph{18}\lipsum

\paragraph{19-20}\lipsum

\paragraph{21-28}\lipsum

\paragraph{29}\lipsum

\paragraph{30}\lipsum

\section{Second Section}

\paragraph{1}\lipsum

\paragraph{2}\lipsum

\paragraph{3-5}\lipsum

\paragraph{6}\lipsum

\paragraph{7-17}\lipsum

\paragraph{18}\lipsum

\paragraph{19-20}\lipsum

\paragraph{21-28}\lipsum

\paragraph{29}\lipsum

\paragraph{30}\lipsum

\section{Third Section}

\paragraph{1}\lipsum

\paragraph{2}\lipsum

\paragraph{3}\lipsum

\paragraph{4}\lipsum

\paragraph{5}\lipsum

\paragraph{6}\lipsum

\paragraph{7}\lipsum

\paragraph{8}\lipsum

\paragraph{9}\lipsum

\paragraph{10}\lipsum

\paragraph{11}\lipsum

\paragraph{12}\lipsum

\paragraph{13}\lipsum

\paragraph{14}\lipsum

\paragraph{15}\lipsum

\paragraph{16}\lipsum

\paragraph{17}\lipsum

\paragraph{18}\lipsum

\paragraph{19}\lipsum

\paragraph{20}\lipsum

\end{document}

以下是我所知道的错误:

  1. 新部分的页面样式是纯文本,因此没有页眉,这是正确的。但是,在下一页,即有页眉的部分的第一页,第一个段落编号始终为 1,而它应该是该页第一段的相关段落编号,就像其他地方一样。事实上,我无法让这个错误显示在 MWE 中,但它确实显示在我的完整文档中。Andrew 建议将 1 替换为 0,但这并没有解决\sectionmark问题。如果我可以让这个错误显示出来,我会更新 MWE。

  2. 前言中会出现一些页眉/页脚材料,而这些材料都应该是页面样式空白的。它们出现在任何标题之前的页面上。请参阅 MWE 的第二个空白页。

  3. 在某些情况下,段落编号的计算不正确。这出现在 MWE 的最后两页。倒数第二页应该是 16-19,但实际上是 16-20;最后一页应该是 19-20。这种情况在我的完整文档中经常发生,并且似乎在出现孤行时发生。

  4. 最后一页还显示了另一个小错误:当“范围”只有一个段落时,它应该只显示一个。例如,它应该只显示“20”,而不是“20-20”。

  5. 段落范围的处理并不完全符合规定。例如,第三段的范围是 3-5,因此第 4 页的页眉应该以第一的这个范围的段落,但它有 5-20。

  6. 章节的最后一个标题给出了错误的章节编号。它具有下一章节的章节编号。例如,MWE 的第 5 页具有编号 2.20-30,但它位于第一节中,因此应该是 1.20-30。

答案1

好问题!这是实现此目的的一种方法。我劫持了该\paragraph命令,以便它打印给出的参数,然后通过调用带有作为参数的命令来\textbf{#1}设置段落计数器\firstpara和。\lastpara\setparagraph#1-0-|

这个\setparagraph宏有点棘手,因为它需要接受的参数可以是单个数字,例如6,也可以是一系列数字,例如7-21。它通过期望三个参数来实现这一点,这些参数需要以 格式给出#1-#2-#3|。因此,如果是\setparagraph #1=6 #2=0 #3 7-21 \paragraph6的参数,那么,并且对于。\paragraph then the arguments forare,andis empty. Ifis the argument to#1=7#2=21#3=0\setparagaph

之后,我玩了一些游戏,以确保\firstpara\lastpara始终设置为适当的值,并进行检查,例如\ifnum\firstpara=0...。标题中的段落范围使用打印\theparagraph,并且此宏还会重置\firstpara和,\lastpara以便下一页的计数器正确无误。

以下是一些示例输出(带有段落编号以便清晰显示):

在此处输入图片描述

以下是代码(包含段落编号以供参考):

编辑稍微更新了代码以满足更新帖子中的 1-6 要求。

\documentclass{book}
\usepackage{lipsum}
\setlipsumdefault{1}
\usepackage{titlesec}
%\usepackage[hmargin=63mm,vmargin=68mm]{geometry}

% fancy headings as defined by the OP except we need to be more careful
% with plain headings
\usepackage{fancyhdr}
\fancypagestyle{empty}{
  \fancyhf{}
  \renewcommand{\headrulewidth}{0pt}
}
\fancypagestyle{plain}{
  \fancyhf{}% clear all header and footer fields
  \renewcommand{\headrulewidth}{0pt}
  \renewcommand{\footrulewidth}{0pt}
  \fancyfoot[C]{\bfseries \thepage}%
  % need to reset \firstpara on pages without headers
  \xdef\firstpara{\midpara}%
}
\fancypagestyle{paragraphs}{
  \fancyhead[LE,RO]{\thepage}
  \fancyhead[CO]{\rightmark}
  \fancyhead[CE]{\leftmark}
  \fancyhead[LO,RE]{\ifnum\firstpara>0\relax\thesection.\theparagraph\fi}
}
\renewcommand{\chaptermark}[1]{\markboth{#1}{}}
\renewcommand{\sectionmark}[1]{%
   \markright{#1}%
   % reset paragraph counters in each section
   \def\firstpara{0}\def\midpara{0}\def\lastpara{0}
}
%\newcommand{\sectionbreak}{\newpage\thispagestyle{plain}}
\let\realSection\section
\renewcommand\section[2][\relax]{\clearpage%
  \thispagestyle{plain}%
  \ifx#1\relax\relax\realSection{#2}%
  \else\realSection[#1]{#2}%
  \fi
}
\renewcommand\thesection{\arabic{section}}

% now the macros for tracking the paragraph numbers
\def\firstpara{0}%    set to 1 by default
\def\midpara{0}%    set to 1 by default
\def\lastpara{0}% set to 1 by default
\def\setparagraph#1-#2-#3|{\def\midpara{#1}%
   % if \firstpara=0 => new page => set \firstpara
   \ifnum\firstpara=0\relax\def\firstpara{#1}\fi%
   % if #2=0 => only #1 is meaningful to set \lastpara to this
   % otherwise use #2
   \ifnum#2=0\relax\def\lastpara{#1}%
   \else\def\lastpara{#2}%
   \fi%
}
\def\paragraph#1{\textbf{#1}\space
  \setparagraph#1-0-|%
}
\def\theparagraph{%
  % if \firstpara=\lastpara print only \firstpara otherwise print a range
  \ifnum\firstpara=\lastpara\relax\firstpara\else\firstpara--\lastpara\fi
  % reset firstpara and lastpara
  \xdef\firstpara{\midpara}%
  %\let\lastpara\relax%
}

% back to the MWe
\begin{document}

\null
\pagestyle{empty}

\newpage

\newpage

\pagestyle{paragraphs}

\chapter{A Chapter}

\section{First Section}

\paragraph{1}\lipsum

\paragraph{2}\lipsum

\paragraph{3-5}\lipsum

\paragraph{6}\lipsum

\paragraph{7-17}\lipsum

\paragraph{18}\lipsum

\paragraph{19-20}\lipsum

\paragraph{21-28}\lipsum

\paragraph{29}\lipsum

\paragraph{30}\lipsum

\section{Second Section}

\paragraph{1}\lipsum

\paragraph{2}\lipsum

\paragraph{3-5}\lipsum

\paragraph{6}\lipsum

\paragraph{7-17}\lipsum

\paragraph{18}\lipsum

\paragraph{19-20}\lipsum

\paragraph{21-28}\lipsum

\paragraph{29}\lipsum

\paragraph{30}\lipsum

\section{Third Section}

\paragraph{1}\lipsum

\paragraph{2}\lipsum

\paragraph{3}\lipsum

\paragraph{4}\lipsum

\paragraph{5}\lipsum

\paragraph{6}\lipsum

\paragraph{7}\lipsum

\paragraph{8}\lipsum

\paragraph{9}\lipsum

\paragraph{10}\lipsum

\paragraph{11}\lipsum

\paragraph{12}\lipsum

\paragraph{13}\lipsum

\paragraph{14}\lipsum

\paragraph{15}\lipsum

\paragraph{16}\lipsum

\paragraph{17}\lipsum

\paragraph{18}\lipsum

\paragraph{19}\lipsum

\paragraph{20}\lipsum

\end{document}

笔记

  1. 问题2是由于空的 pagetyle 并非真的为空。更准确地说,它没有设置\headrulewidth为零。

  2. 我没用过fancyhdr,所以这很可能是错的,但我觉得你最好定义你自己喜欢的页面样式。我paragraph上面已经定义了一个页面样式。我这样做是因为我发现这个fancy页面样式与其他样式不太兼容。

  3. \sectionbreak使用的命令似乎titlesec是导致问题的原因6。我怀疑它在调用之前增加了节计数器,\sectionbreak所以这就是导致标题错误的原因。我通过避免\sectionbreak并重新定义节命令来解决这个问题。

相关内容