我想创建一个类似字典的标题,在偶数页的左上角和奇数页的右上角显示方程编号:左上角是该页面上出现的第一个方程的方程编号,右上角是最后一个方程编号。
我知道我可以用\marks
这个emarks
包来实现这一点。现在我的“解决方案”需要手动将新的方程编号推到标记上,例如
\marksthe{EqNumTracker}{\theequation}
每次我写一个新方程式,这似乎不太理想。
进一步的复杂化是equation
计数器也受到其他一些东西的影响(例如,使用ntheorem
我已经要求定理计数在同一个计数器上)。
问题equation
:每次计数器增加时自动“标记”方程编号的最佳方法是什么?
一个最小可能工作的例子:
\documentclass{book}
\usepackage[pagestyles]{titlesec}
\usepackage{emarks}
\usepackage{amsmath,amssymb}
\usepackage[amsmath,thmmarks,thref,hyperref]{ntheorem}
\usepackage{hyperref}
\usepackage{lipsum}
% Pagestyle using the marks.
\makeatletter
\newpagestyle{wwwfancy}{\headrule%
\setmarks{chapter}{section}
\sethead[\thefirstmarks{www@equation@mark}]%
[][]%
{\footnotesize\slshape\ifthechapter{\chaptertitlename\ %
\thechapter.\ \chaptertitle}{}}{}%
{\thebotmarks{www@equation@mark}}%
\setfoot[][\thepage][]{}{\thepage}{}}
\pagestyle{wwwfancy}
% Redefining refstepcounter
\let\www@old@refstepcounter\refstepcounter
\def\refstepcounter#1{%
\www@old@refstepcounter{#1}%
\marksthecs{www@#1@mark}{the#1}}
\makeatother
% Define a theorem style
\theoremstyle{break}
\theoremheaderfont{\normalfont\bfseries}
\theorembodyfont{\itshape}
\theoremseparator{}
\theoremindent0cm
\theoremnumbering{arabic}
\theoremsymbol{\ensuremath{_\blacksquare}}
\newtheorem{thm}[equation]{Theorem}
\numberwithin{equation}{section}
\begin{document}
\chapter{A chapter}
\lipsum[1-5]
\begin{equation}
E = mc^2
\end{equation}
\lipsum[6]
\begin{thm}\label{testref}
\lipsum[7]
\end{thm}
\lipsum[8-12]
A reference \thref{testref}.
\lipsum[1-4]
\end{document}
我应该注意什么吗?
(注意,在上面我定义了一个标记每一个equation
计数器使用得非常有效。我认为 32,768 可能就足够了……但我也欢迎可以让我仅跟踪而不做其他任何事情的改进。)
答案1
OP 的代码已经可以运行,也可以使用hyperref
,但是每次计数器被重新步进时它都会放置一个标记。
我已经放置了一些expl3
代码来“注册”计数器名称,以便于跟踪该序列,并在重新定义的\refstepcounter
命令中执行检查,确保只放置相关标记。
\documentclass{book}
\usepackage[pagestyles]{titlesec}
\usepackage{emarks}
\usepackage{amsmath,amssymb}
\usepackage[amsmath,thmmarks,thref,hyperref]{ntheorem}
\usepackage{xparse}
\usepackage{hyperref}
\usepackage{lipsum}
\ExplSyntaxOn
\seq_new:N \l_williewong_counter_seq
\newcommand{\RegisterMarkCounters}[1]{%
\seq_set_from_clist:Nn \l_williewong_counter_seq {#1}
\seq_remove_duplicates:N \l_williewong_counter_seq
}
\newcommand{\IsInMarkListT}[2]{%
\seq_if_in:NnT \l_williewong_counter_seq {#1} {#2}
}
\ExplSyntaxOff
% Pagestyle using the marks.
\makeatletter
\newpagestyle{wwwfancy}{\headrule%
\setmarks{chapter}{section}
\sethead[\thefirstmarks{www@equation@mark}]%
[][]%
{\footnotesize\slshape\ifthechapter{\chaptertitlename\ %
\thechapter.\ \chaptertitle}{}}{}%
{\thebotmarks{www@equation@mark}}%
\setfoot[][\thepage][]{}{\thepage}{}}
\pagestyle{wwwfancy}
\RegisterMarkCounters{equation}
\let\www@old@refstepcounter\refstepcounter
\def\refstepcounter#1{%
\www@old@refstepcounter{#1}%
\IsInMarkListT{#1}{\marksthecs{www@#1@mark}{the#1}}
}
\makeatother
% Define a theorem style
\theoremstyle{break}
\theoremheaderfont{\normalfont\bfseries}
\theorembodyfont{\itshape}
\theoremseparator{}
\theoremindent0cm
\theoremnumbering{arabic}
\theoremsymbol{\ensuremath{_\blacksquare}}
\newtheorem{thm}[equation]{Theorem}
%\newtheorem{thm}{Theorem}
\numberwithin{equation}{section}
\begin{document}
\chapter{A chapter}
\section{Foo}
\begin{equation}
E = mc^2
\end{equation}
\lipsum[1-3]
\begin{equation}
E = mc^2
\end{equation}
\lipsum[6]
\begin{equation}
E = mc^2
\end{equation}
\begin{thm}\label{testref}
\lipsum[7]
\end{thm}
\lipsum[8-12]
A reference \thref{testref}.
\lipsum[1-4]
\begin{thm}\label{othertestref}
\lipsum[7]
\end{thm}
\begin{equation}
E = mc^2
\end{equation}
\lipsum[6]
\begin{equation}
E = mc^2
\end{equation}
\lipsum[8-12]
\end{document}
答案2
\stepcounter
我们可以在using处添加一个钩子etoolbox
。如果没有amsmath
补丁,则可能会
\apptocmd{\stepcounter}{\csname action@#1\endcsname}{}{}
但amsmath
已经发生了变化。
\documentclass{book}
\usepackage[pagestyles]{titlesec}
\usepackage{emarks}
\usepackage{amsmath,amssymb}
\usepackage[amsmath,thmmarks,thref,hyperref]{ntheorem}
\usepackage{etoolbox}
\usepackage{hyperref}
\usepackage{lipsum}
% add a hook to \stepcounter
\patchcmd{\stepcounter}
{\fi}
{\csname action@#1\endcsname\fi}
{}{}
\makeatletter
\newcommand{\definecounteraction}[2]{\@namedef{action@#1}{#2}}
\makeatother
% Pagestyle using the marks.
\makeatletter
\newpagestyle{wwwfancy}{\headrule%
\setmarks{chapter}{section}
\sethead[\thefirstmarks{www@equation@mark}]%
[][]%
{\footnotesize\slshape\ifthechapter{\chaptertitlename\ %
\thechapter.\ \chaptertitle}{}}{}%
{\thebotmarks{www@equation@mark}}%
\setfoot[][\thepage][]{}{\thepage}{}}
\pagestyle{wwwfancy}
\definecounteraction{equation}{%
\typeout{=== Stepping equation ===}%
\marksthe{www@equation@mark}{\theequation}%
}
% Define a theorem style
\theoremstyle{break}
\theoremheaderfont{\normalfont\bfseries}
\theorembodyfont{\itshape}
\theoremseparator{}
\theoremindent0cm
\theoremnumbering{arabic}
\theoremsymbol{\ensuremath{_\blacksquare}}
\newtheorem{thm}[equation]{Theorem}
\numberwithin{equation}{section}
\begin{document}
\chapter{A chapter}
\lipsum[1-5]
\begin{equation}
E = mc^2
\end{equation}
\lipsum[6]
\begin{thm}\label{testref}
\lipsum[7]
\end{thm}
\lipsum[8-12]
A reference \thref{testref}.
\lipsum[1-4]
\end{document}