页眉和页脚中的分类标签

页眉和页脚中的分类标签

我正在尝试编写 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

相关内容