我正在处理的翻译文本具有已经在源文件中定义的“段落”编号,我必须保持一致。因此,我无法使用它\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,而它应该是该页第一段的相关段落编号,就像其他地方一样。事实上,我无法让这个错误显示在 MWE 中,但它确实显示在我的完整文档中。Andrew 建议将 1 替换为 0,但这并没有解决
\sectionmark
问题。如果我可以让这个错误显示出来,我会更新 MWE。前言中会出现一些页眉/页脚材料,而这些材料都应该是页面样式空白的。它们出现在任何标题之前的页面上。请参阅 MWE 的第二个空白页。
在某些情况下,段落编号的计算不正确。这出现在 MWE 的最后两页。倒数第二页应该是 16-19,但实际上是 16-20;最后一页应该是 19-20。这种情况在我的完整文档中经常发生,并且似乎在出现孤行时发生。
最后一页还显示了另一个小错误:当“范围”只有一个段落时,它应该只显示一个。例如,它应该只显示“20”,而不是“20-20”。
段落范围的处理并不完全符合规定。例如,第三段的范围是 3-5,因此第 4 页的页眉应该以第一的这个范围的段落,但它有 5-20。
章节的最后一个标题给出了错误的章节编号。它具有下一章节的章节编号。例如,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 for
are
,
and
is empty. If
is 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}
笔记
问题
2
是由于空的 pagetyle 并非真的为空。更准确地说,它没有设置\headrulewidth
为零。我没用过
fancyhdr
,所以这很可能是错的,但我觉得你最好定义你自己喜欢的页面样式。我paragraph
上面已经定义了一个页面样式。我这样做是因为我发现这个fancy
页面样式与其他样式不太兼容。\sectionbreak
使用的命令似乎titlesec
是导致问题的原因6
。我怀疑它在调用之前增加了节计数器,\sectionbreak
所以这就是导致标题错误的原因。我通过避免\sectionbreak
并重新定义节命令来解决这个问题。