如何在每个页面上添加标记,标记该页面中出现的第一个和最后一个编号环境/方程的编号?

如何在每个页面上添加标记,标记该页面中出现的第一个和最后一个编号环境/方程的编号?

我想知道是否有可能实现以下类似字典的功能:

在每一页上添加标记,标出该页中出现的第一个和最后一个编号环境/方程的编号。

因此,如果页面中第一个编号的环境/方程式是 2.34,最后一个编号的环境/方程式是 2.39,我想在页脚打印,例如,

2.34--2.39

我正在使用tufte-book哪些用途fancyhdr正在并且我所有编号的环境/方程式都共享相同的计数器。

我调查了我使用字典模板来查看是否能弄清楚该怎么做,但结果不太好。

PS:我没有包括 MWE,因为我完全不知道从哪里开始。也欢迎指点 :)

编辑

以下是我迄今为止尝试过的 MWE。我试图equation在标题排版后立即打印计数器的值,并将其存储起来以供日后使用。

抱歉代码太长,但需要很多页面才能看到不同页面上的值存在的问题。

\documentclass{article}

\usepackage{fancyhdr}

\usepackage{calc}

\usepackage{amsthm}

\newcounter{firstequation}

\newcounter{lastequation}

\newcommand{\myeqnmarker}{%
  \setcounter{lastequation}{\theequation-3}%
  \thefirstequation--\thelastequation%
  \setcounter{firstequation}{\value{equation}-2}%
}

\begin{document}

\pagestyle{fancy}
\fancyhf{}%
\fancyhead[LE]{\myeqnmarker}%
\fancyhead[RO]{\myeqnmarker}%

\begin{equation}
  x=1
\end{equation}

\begin{equation}
  x=1
\end{equation}

\begin{equation}
  x=1
\end{equation}

\begin{equation}
  x=1
\end{equation}

\begin{equation}
  x=1
\end{equation}

\begin{equation}
  x=1
\end{equation}
\begin{equation}
  x=1
\end{equation}

\begin{equation}
  x=1
\end{equation}

\begin{equation}
  x=1
\end{equation}
\begin{equation}
  x=1
\end{equation}

\begin{equation}
  x=1
\end{equation}

\begin{equation}
  x=1
\end{equation}
\begin{equation}
  x=1
\end{equation}

\begin{equation}
  x=1
\end{equation}

\begin{equation}
  x=1
\end{equation}

\begin{equation}
  x=1
\end{equation}

\begin{equation}
  x=1
\end{equation}

\begin{equation}
  x=1
\end{equation}

\begin{equation}
  x=1
\end{equation}

\begin{equation}
  x=1
\end{equation}

\begin{equation}
  x=1
\end{equation}
\begin{equation}
  x=1
\end{equation}

\begin{equation}
  x=1
\end{equation}

\begin{equation}
  x=1
\end{equation}
\begin{equation}
  x=1
\end{equation}

\begin{equation}
  x=1
\end{equation}

\begin{equation}
  x=1
\end{equation}
\begin{equation}
  x=1
\end{equation}

\begin{equation}
  x=1
\end{equation}

\begin{equation}
  x=1
\end{equation}

\begin{equation}
  x=1
\end{equation}

\begin{equation}
  x=1
\end{equation}

\begin{equation}
  x=1
\end{equation}

\begin{equation}
  x=1
\end{equation}

\begin{equation}
  x=1
\end{equation}

\begin{equation}
  x=1
\end{equation}
\begin{equation}
  x=1
\end{equation}

\begin{equation}
  x=1
\end{equation}

\begin{equation}
  x=1
\end{equation}
\begin{equation}
  x=1
\end{equation}

\begin{equation}
  x=1
\end{equation}

\begin{equation}
  x=1
\end{equation}
\begin{equation}
  x=1
\end{equation}

\begin{equation}
  x=1
\end{equation}

\begin{equation}
  x=1
\end{equation}

\end{document}

答案1

请参阅底部的改进版本,以及一些解释。

到目前为止的初步版本 - 它似乎可以工作,但页码不应该改变,所以这是目前的一个瓶颈。

稍后我会添加一些解释,尝试改进代码。如果页面中根本没有方程式,那么它就不是万无一失的!

\documentclass{book}

\usepackage{fancyhdr}
\usepackage{mathtools}
\usepackage{blindtext}

\usepackage{etoolbox}


\usepackage{xparse}

\ExplSyntaxOn

\seq_new:N \l_equation_number

\ior_new:N \l_enr_file

\newcommand{\equationnumber}[1]{%
  \tl_set:Nx \l_tmpa_tl {#1}
  \seq_gput_right:NV \l_equation_number {\l_tmpa_tl}
}

\newcommand{\grabequationnumbers}{%
  \ior_open:Nn \l_enr_file {\jobname.enr}
  \ior_map_inline:Nn \l_enr_file {\equationnumber{##1}}
  \ior_close:N \l_enr_file
}

\newcommand{\showlist}{%
  \seq_use:Nn \l_equation_number {\par}
}


\newcommand{\geteqrange}[1]{%
  \seq_clear:N \l_tmpa_seq
  \int_set:Nn \l_tmpb_int {#1}
  \seq_map_inline:Nn \l_equation_number {%
    \seq_set_split:Nnn \l_tmpb_seq {;} {##1}
    \tl_set:Nx \l_tmpb_tl {\seq_item:Nn \l_tmpb_seq {2}}
    \int_compare:nNnT {\seq_item:Nn \l_tmpb_seq {1}} = {\l_tmpb_int} {%
      \seq_gput_right:NV \l_tmpa_seq {\l_tmpb_tl}
    }
  }
  \seq_if_empty:NF \l_tmpa_seq {%
    \int_set:Nn \l_tmpa_int { \seq_count:N \l_tmpa_seq }
    \tl_set:Nx \l_tmpa_tl {\seq_item:Nn \l_tmpa_seq {1}}
    \seq_item:Nn \l_tmpa_seq {1}\space --\space  \seq_item:Nn \l_tmpa_seq {\int_use:N \l_tmpa_int}
  }
}

\ExplSyntaxOff




\makeatletter


\let\latex@@refstepcounter\refstepcounter

\newwrite\equationfile

\AtBeginDocument{%
  \IfFileExists{\jobname.enr}{%
  \grabequationnumbers
  }{}
  \immediate\openout\equationfile=\jobname.enr
}

\AtEndDocument{%
  \immediate\closeout\equationfile%
}

\renewcommand{\refstepcounter}[1]{%
  \latex@@refstepcounter{#1}%
  \ifstrequal{#1}{equation}{%
    \immediate\write\equationfile{\the\numexpr\value{page};\theequation}%
  }{}
}
\makeatother

\fancypagestyle{plain}{%
  \fancyhf{}
  \fancyfoot[L]{\geteqrange{\the\numexpr\value{page}-0}}%
  \fancyfoot[C]{\thepage}
}

\pagestyle{plain}

\begin{document}
\chapter{First}
\begin{align}
  E=mc^2 \\
  E=mc^2 \\
  E=mc^2 \\
  E=mc^2 \\
  E=mc^2 \\
  E=mc^2 \\
  E=mc^2 \\
  E=mc^2 \\
  E=mc^2 \\
  E=mc^2 
\end{align}

\blindtext[5]\clearpage

\begin{align}
  E=mc^2 \\
  E=mc^2 \\
  E=mc^2 \\
  E=mc^2 \\
  E=mc^2 \\
  E=mc^2 \\
  E=mc^2 \\
  E=mc^2 \\
  E=mc^2 \\
  E=mc^2 
\end{align}
\blindtext

\begin{align}
  E=mc^2 \\
\end{align}



\blindtext[3]

\begin{equation}
  a^2+b^2 = c^2
\end{equation}


\end{document}

更新,使用更安全的\label方程:

这是基本思想:为每个已编号的方程式提供一个自动标签(即,有一个\refstepcounter钩子,使用“唯一”的,它具有正确的页面信息。使用和(包)\label再次读取此信息并将其存储到一个特殊文件中,该文件使用方法进行处理以获取页面的当前范围。\getpagerefnumber\getrefnumberrefcountexpl3equation

单个方程式显示为单个方程式编号,因此没有(编号)方程式的页面将有一个空的页脚插槽。

\documentclass{book}

\usepackage{fancyhdr}
\usepackage{mathtools}
\usepackage{blindtext}
\usepackage{refcount}
\usepackage{etoolbox}
\usepackage{xassoccnt}

\usepackage{xparse}

\usepackage{hyperref}

\newcounter{totalequations}

\DeclareAssociatedCounters{equation}{totalequations}  % Step the equations to get the full equation number

% Personal display style
% #1 -> first equation 'number'
% #2 -> second equation 'number'
\newcommand{\equationrangeformat}[2]{%
  #1 $\longleftrightarrow$ #2% 
}

\ExplSyntaxOn

\seq_new:N \l_equation_number

\ior_new:N \l_enr_file

% Mapping function
\newcommand{\equationnumber}[1]{%
  \tl_set:Nx \l_tmpa_tl {#1}
  \seq_gput_right:NV \l_equation_number {\l_tmpa_tl}
}

% Load the stored equation numbers
\newcommand{\grabequationnumbers}{%
  \ior_open:Nn \l_enr_file {\jobname.enr}
  \ior_map_inline:Nn \l_enr_file {\equationnumber{##1}}
  \ior_close:N \l_enr_file
}

\newcommand{\geteqrange}[1]{%
  \seq_clear:N \l_tmpa_seq
  \int_set:Nn \l_tmpb_int {#1}
  \seq_map_inline:Nn \l_equation_number {%
    \seq_set_split:Nnn \l_tmpb_seq {;} {##1}
    \tl_set:Nx \l_tmpb_tl {\seq_item:Nn \l_tmpb_seq {2}}
    \int_compare:nNnT {\seq_item:Nn \l_tmpb_seq {1}} = {\l_tmpb_int} {%
      \seq_gput_right:NV \l_tmpa_seq {\l_tmpb_tl}
    }
  }
  \seq_if_empty:NF \l_tmpa_seq {%
    \int_set:Nn \l_tmpa_int { \seq_count:N \l_tmpa_seq }
    \tl_set:Nx \l_tmpa_tl {\seq_item:Nn \l_tmpa_seq {1}}
    % Check whether there's only one equation marker
    \int_compare:nNnTF {\int_use:N \l_tmpa_int} = {1} {
      \seq_use:Nn \l_tmpa_seq {} % Just display the one-element sequence
    } {%
      \equationrangeformat{\seq_item:Nn \l_tmpa_seq {1}}{\seq_item:Nn \l_tmpa_seq {\int_use:N \l_tmpa_int}}%
    }
  }
}

\ExplSyntaxOff




\makeatletter

% We need to hook into `\refstepcounter` since this is increasing the equation number 
\let\latex@@refstepcounter\refstepcounter
\newwrite\file@equation

\AtBeginDocument{%
  % Prevent loading errors by checking for existence first, read the information then.
  \IfFileExists{\jobname.enr}{%
    \grabequationnumbers%
  }{}
  % Open the equation number file for writing again, for update purposes
  \immediate\openout\file@equation=\jobname.enr
}



\newcommand{\eqmarkerlabel}{%
  eqmarker:\number\value{totalequations}%
}

\renewcommand{\refstepcounter}[1]{%
  \latex@@refstepcounter{#1}
  \ifstrequal{#1}{equation}{%
    \label{\eqmarkerlabel}% Generate an automatic label
    \immediate\write\file@equation{\getpagerefnumber{\eqmarkerlabel};\getrefnumber{\eqmarkerlabel}}% Store the label information to another file
  }{}%
}

\AtEndDocument{%
  \immediate\closeout\file@equation% 
}


\makeatother

\fancypagestyle{plain}{%
  \fancyhf{}
  \fancyfoot[L]{\geteqrange{\number\value{page}}}%
  \fancyfoot[C]{\thepage}
}

\pagestyle{plain}

\begin{document}
\chapter{First}
\begin{align}
  E=mc^2 \\
  E=mc^2 \\
  E=mc^2 \\
  E=mc^2 \\
  E=mc^2 \\
  E=mc^2 \\
  E=mc^2 \\
  E=mc^2 \\
  E=mc^2 \\
  E=mc^2 
\end{align}

\blindtext[5]

\begin{align}
  E=mc^2 \\
  E=mc^2 \\
  E=mc^2 \\
  E=mc^2 \\
  E=mc^2 \\
  E=mc^2 \\
  E=mc^2 \\
  E=mc^2 \\
  E=mc^2 \\
  E=mc^2 
\end{align}
\blindtext

\begin{align}
  E=mc^2 
\end{align}



\blindtext[2]

\begin{equation}
  a^2+b^2 = c^2
\end{equation}

\chapter{Foobar}
\blindtext[2]

\begin{equation}
  a^2+b^2 = c^2
\end{equation}

\begin{equation}
  a^2+b^2 = c^2
\end{equation}

\begin{equation}
  a^2+b^2 = c^2
\end{equation}

\begin{equation}
  a^2+b^2 = c^2
\end{equation}

\begin{align*}
  E=mc^2 
\end{align*}

\begin{align}
  E=mc^2 
\end{align}


\end{document}

在此处输入图片描述

相关内容