我想知道是否有可能实现以下类似字典的功能:
在每一页上添加标记,标出该页中出现的第一个和最后一个编号环境/方程的编号。
因此,如果页面中第一个编号的环境/方程式是 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
\getrefnumber
refcount
expl3
equation
单个方程式显示为单个方程式编号,因此没有(编号)方程式的页面将有一个空的页脚插槽。
\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}