计数器增加时自动设置标记

计数器增加时自动设置标记

我想创建一个类似字典的标题,在偶数页的左上角和奇数页的右上角显示方程编号:左上角是该页面上出现的第一个方程的方程编号,右上角是最后一个方程编号。

我知道我可以用\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}

在此处输入图片描述

相关内容