我正在尝试编写 Latex 文档,以便自动满足政府对标记某些类别信息的要求:
- 每个段落都以一个标签开头,表明其重要性。
- 每页的页眉和页脚都包含一个标签,指示该页面上最重要的段落(即使它从上一页开始)。
这是我最接近的一次:
\documentclass[12pt]{report}
\usepackage{fancyhdr}
\usepackage{ifthen}
\usepackage{afterpage}
\usepackage{color}
\usepackage{lipsum}
\setlength\parskip{.6\baselineskip}
\setlength\parindent{0pt}
\setlength\headheight{15pt}
\setlength\textheight{21\baselineskip}
\newcommand\pageimport{TRIVIAL}
\newcommand\paraimport{TRIVIAL}
\pagestyle{fancy}
\lhead{}\chead{\leftmark}\rhead{}
\lfoot{}\cfoot{\leftmark}\rfoot{\thepage}
\newcommand{\IMP}[1]{\renewcommand\paraimport{IMPORTANT}
\renewcommand\pageimport{IMPORTANT}
\markboth{\pageimport}{\paraimport}
\afterpage{\renewcommand\pageimport{\protect\paraimport}\markboth{\protect\paraimport}{}}
\textcolor{red}{(I) #1}\renewcommand\paraimport{TRIVIAL}}
\newcommand{\TRI}[1]{\renewcommand\paraimport{TRIVIAL}
\markboth{\pageimport}{\paraimport}
\afterpage{\renewcommand\pageimport{\protect\paraimport}\markboth{\protect\paraimport}{}}
(U) #1\renewcommand\paraimport{TRIVIAL}}
\begin{document}
\immediate\typeout{a. pageimport = \pageimport\space paraimport = \paraimport}
\TRI{\lipsum[1]}
\TRI{\lipsum[2]}
\TRI{\lipsum[3]}
\immediate\typeout{b. pageimport = \pageimport\space paraimport = \paraimport}
\IMP{\lipsum[4]}
\immediate\typeout{c. pageimport = \pageimport\space paraimport = \paraimport}
\TRI{\lipsum[5]}
\TRI{\lipsum[6]}
\TRI{\lipsum[7]}
\TRI{\lipsum[8]}
\immediate\typeout{d. pageimport = \pageimport\space paraimport = \paraimport}
\IMP{\lipsum[9]}
\immediate\typeout{e. pageimport = \pageimport\space paraimport = \paraimport}
\TRI{\lipsum[10]}
\TRI{\lipsum[11]}
\TRI{\lipsum[12]}
\end{document}
(我在这里更改了标签,以避免引起不必要的恐慌。为方便起见,我还将“重要”文本设置为红色。)我的想法是将每个段落的“重要性”保留在 \paraimport 中。在每个段落结束时重置。页眉和页脚从 \pageimport 获取标签,它记录了当前页面上最高的重要性。在每页结束时,\pageimport 会重置为 \paraimport 的值。
本文档第 2 页有一个“重要”段落,第 4 页开始,第 5 页结束。所有段落均正确标记。前两页有正确的标签,但第 3 页和第 6 页应标记为“琐碎”。每个“重要”段落前后的跟踪语句表明 \pageimport 未在分页符处重置。
我怀疑我正在移动一些易碎的东西,但将 \afterpage 命令重写为
\afterpage{\renewcommand\pageimport{\protect\paraimport}\markboth{\protect\paraimport}{}}
没什么区别。
我见过 secret.sty,但它正在解决不同的问题。我无法将其改编为页面标记。
我将非常感激任何建议。
答案1
这是一个解决方案。
重点是重置左右标记
\afterpage{%
\renewcommand\paraimport{TRIVIAL}%
\markboth{\paraimport}{\paraimport}
笔记我们只需要一个命令\paraimport
更新这个想法是重新定义\parimport
并\markboth
在段落内部,即在(I)之后。
更新的 MWE
\documentclass[12pt]{report}
\usepackage{fancyhdr}
\usepackage{afterpage}
\usepackage{color}
\usepackage{lipsum}
\setlength\parskip{.6\baselineskip}
\setlength\parindent{0pt}
\setlength\headheight{15pt}
\setlength\textheight{21\baselineskip}
\pagestyle{fancy}
\lhead{}\chead{\leftmark}\rhead{}
\lfoot{}\cfoot{\leftmark}\rfoot{\thepage}
\newcommand\paraimport{TRIVIAL}
\markboth{\paraimport}{\paraimport}
\newcommand{\IMP}[1]{%
\textcolor{red}{(I)
\renewcommand\paraimport{IMPORTANT}%
\markboth{\paraimport}{\paraimport}%
#1}%
\afterpage{%
\renewcommand\paraimport{TRIVIAL}%
\markboth{\paraimport}{\paraimport}}%
}
\newcommand{\TRI}[1]{(U) #1}
\begin{document}
\TRI{\lipsum[1]}
\TRI{\lipsum[2]}
\TRI{\lipsum[3]}
\IMP{\lipsum[4]}
\TRI{\lipsum[5]}
\TRI{\lipsum[6]}
\TRI{\lipsum[7]}
\TRI{\lipsum[8]}
\IMP{\lipsum[9]}
\TRI{\lipsum[10]}
\TRI{\lipsum[11]}
\TRI{\lipsum[12]}
\end{document}
答案2
这个问题有点老了,但它在网络搜索中仍然排名靠前。我试图将解决方案调整为多个重要性级别,然后遇到了这个答案检查段落是否跨越分页符。我的解决方案是设置一个计数器,如果段落的重要性级别高于当前段落,则增加计数器。如果页面上的最后一段跨越分页符,我将下一页的页面级别设置为当前级别并重复该过程。我想到的是
\documentclass{article}
\usepackage{afterpage}
\usepackage{lipsum}
\usepackage{fancyhdr}
\pagestyle{fancy}
\fancyhf{}
\newcounter{pagelevel}
\newcounter{currentlevel}
\usepackage{atbegshi}
\usepackage{zref-user}
\usepackage{zref-abspage}
\newcounter{clscnt}
\makeatletter
% When we ship out the page, check if the paragraph spans the break.
\AtBeginShipout{%
\ifnum\zref@extract{markingenv-begin-\theclscnt}{abspage}
=\zref@extract{markingenv-end-\theclscnt}{abspage}
\setcounter{pagelevel}{0}%
\else
\setcounter{pagelevel}{\thecurrentlevel}%
\fi
}
\makeatother
\newcommand{\marking}[2]{%
\stepcounter{clscnt}%
\zlabel{markingenv-begin-\theclscnt}%
(#1 --- \thepagelevel)
\ifnum #1 > \thepagelevel%
\setcounter{pagelevel}{#1}%
\chead{Level \thepagelevel}%
\fi%
\setcounter{currentlevel}{#1}
#2
\zlabel{markingenv-end-\theclscnt}%
}
\newcommand{\VI}[1]{\marking{3}{(V) #1}}
\newcommand{\IMP}[1]{\marking{2}{(I) #1}}
\newcommand{\TRI}[1]{\marking{1}{(U) #1}}
\begin{document}
\TRI{\lipsum[1]\par}
\TRI{\lipsum[2]\par}
\TRI{\lipsum[3]\par}
\IMP{\lipsum[4]\par}
\TRI{\lipsum[5]\par}
\TRI{\lipsum[6]\par}
\TRI{\lipsum[7]\par}
\TRI{\lipsum[8]\par}
\IMP{\lipsum[9]\par}
\TRI{\lipsum[10]\par}
\TRI{\lipsum[11]\par}
\TRI{\lipsum[12]\par}
\TRI{\lipsum[13]\par}
\TRI{\lipsum[14]\par}
\TRI{\lipsum[15]\par}
\VI{\lipsum[16]\par}
\IMP{\lipsum[17]\par}
\TRI{\lipsum[18]\par}
\TRI{\lipsum[19]\par}
\TRI{\lipsum[20]\par}
\TRI{\lipsum[21]\par}
\TRI{\lipsum[22]\par}
\TRI{\lipsum[23]\par}
\TRI{\lipsum[24]\par}
\TRI{\lipsum[25]\par}
\TRI{\lipsum[26]\par}
\TRI{\lipsum[27]\par}
\TRI{\lipsum[28]\par}
\TRI{\lipsum[29]\par}
\end{document}
我修改了示例以明确显示页面级别和段落级别。请注意,第 3 页和第 4 页的标题正确设置为级别 3,而第 5 页和第 6 页的标题重置为级别 1。
编辑:我一直在修改和扩展这个解决方案,使它成为一个包裹。
答案3
这个问题最复杂的部分似乎是段落跨越分页符的情况。也许最简单的做法是防止段落跨越分页符:
\widowpenalties 1 10000
\raggedbottom