使用其他章节标题精确计算公式编号

使用其他章节标题精确计算公式编号

我想以这种方式使用书籍类别和数字方程:

该方程必须只包含方程数没有 章节号。我使用

    \renewcommand{\theequation}{\arabic{equation}}

然后当使用\ref命令时我希望

  1. 如果\ref在方程的同一章中引用,则引用只是(equation)
  2. 如果\ref在方程的另一章中调用,则引用为(equation)\textsubscript{name-of-the-chapter-containing-equation}

这是我尝试使用zref

\documentclass{book}
\usepackage{amsmath}
\usepackage{hyperref}
\usepackage{zref-user}
\makeatletter
\zref@newprop{chapter}{\thechapter}
\zref@addprop{main}{chapter}
\makeatother
\numberwithin{equation}{section}
\renewcommand{\theequation}{\arabic{equation}}
\newcommand{\myref}[1]{\ifnum\thechapter=\zref[chapter]{#1} (\zref{#1}) \else (\zref{#1})\textsubscript{something} \fi}
\begin{document}
 \chapter{First}
 \ifnum\myref[chapter]{eq:1}=1 a \else b \fi
  \myref{eq:1}, \myref{eq:2}, \myref{eq:3}, \myref{eq:4}
 \section{First First}
 \begin{equation}\zlabel{eq:1}
 E=\gamma m
 \end{equation}
 \section{First Second}
 \begin{equation}\zlabel{eq:2}
 0=0
 \end{equation}
 \chapter{Second}
  \myref{eq:1}, \myref{eq:2}, \myref{eq:3}, \myref{eq:4}
 \begin{equation}\zlabel{eq:3}
 e^{i\pi}+1=0
 \end{equation}
 \chapter{Third}
  \myref{eq:1}, \myref{eq:2}, \myref{eq:3}, \myref{eq:4}
 \begin{equation}\zlabel{eq:4}
 f(w) = \frac{1}{2i\pi}\oint_{C_w}\frac{f(z)\mathrm{d}z}{z-w}
 \end{equation}
 \chapter{Last}
 \myref{eq:1}, \myref{eq:2}, \myref{eq:3}, \myref{eq:4}
\end{document}

我对以下定义有两个疑问:\myref

  1. \ifnum无法正常工作,因为可能\zref[chapter]{#1}不返回数字,因此无法与“\thechapter”进行比较

  2. 我必须找到一个命令来获取与数字相对应的章节名称(或者可能使用\nameref

我该如何解决它们?

答案1

您可以按如下方式执行此操作。首先使用\zrefused\zref@extract获取要比较的值以触发额外的格式化。

现在,该包zref-titleref为您提供了如何获取标题字段的想法,但它不仅在章节中更新,还在部分等处更新。因此,我们编写了一个修改版本的代码zref-titleref,只需抓取章节标题。

示例输出 第二个示例

\documentclass{book}

\usepackage{amsmath}
\usepackage{zref-user,gettitlestring}
\usepackage{hyperref}

\newcommand{\setcurrentchaptername}[1]{\GetTitleStringNonExpand{#1}\edef\currentchaptername{\detokenize\expandafter{\GetTitleStringResult}}}
\def\currentchaptername{}
\makeatletter
\zref@newprop{chapter}{\thechapter}
\zref@addprop{main}{chapter}
\zref@newprop{chaptername}{\currentchaptername}
\zref@addprop{main}{chaptername}
\ZREF@patch{@chapter}{\def\@chapter[#1]{\setcurrentchaptername{#1}%
  \ZREF@org@@chapter[{#1}]}}
\makeatother

\numberwithin{equation}{chapter}
\renewcommand{\theequation}{\arabic{equation}}

\makeatletter
\newcommand{\myref}[1]{\zrefused{#1}%
\ifnum\zref@extract{#1}{chapter}=\thechapter\relax
(\zref{#1}) \else (\zref{#1})\textsubscript{\zref@extract{#1}{chaptername}}\fi}
\makeatother

\begin{document}
\chapter{First}
\myref{eq:1}, \myref{eq:2}, \myref{eq:3}, \myref{eq:4}
\section{First First}
\begin{equation}\zlabel{eq:1}
  E=\gamma m
\end{equation}
\section{First Second}
\begin{equation}\zlabel{eq:2}
  0=0
\end{equation}
\chapter{Second}
\myref{eq:1}, \myref{eq:2}, \myref{eq:3}, \myref{eq:4}
\begin{equation}\zlabel{eq:3}
  e^{i\pi}+1=0
\end{equation}
\chapter{Third}
\myref{eq:1}, \myref{eq:2}, \myref{eq:3}, \myref{eq:4}
\begin{equation}\zlabel{eq:4}
  f(w) = \frac{1}{2i\pi}\oint_{C_w}\frac{f(z)\mathrm{d}z}{z-w}
\end{equation}
\chapter{Last}
\myref{eq:1}, \myref{eq:2}, \myref{eq:3}, \myref{eq:4}
\end{document}

就像在您的代码中一样,\zref@newprop用于设置要跟踪的新属性。这些需要有一种在\zlabel调用命令时获取正确数据的方法。对于章节号,它位于 中\thechapter,您已经使用了。对于章节标题,我们将其存储在 中\currentchaptername并修改\chapter命令以便设置此名称。如果您希望使用不同的(例如更短的)名称,则可以在命令\currentchaptername后立即重新定义\chapter。现在在引用命令 中,我们通过首先发出然后获取特定字段来\myref获取标签数据。\zrefused\zref@extract

我已将方程的相对编号改为在chapters 内,而不是sections,否则您将获得重复的标签。如果您确实希望在每个部分重置,那么您还应该引用相关部分标题,并且可能可以zref-titleref直接使用。

上述代码仅抓取编号章节的标题。您可以根据需要对\chapter*via应用类似的补丁,或者在这种情况下直接自行设置。@schapter\currentchatpername

相关内容