我想以这种方式使用书籍类别和数字方程:
该方程必须只包含方程数没有 章节号。我使用
\renewcommand{\theequation}{\arabic{equation}}
然后当使用\ref
命令时我希望
- 如果
\ref
在方程的同一章中引用,则引用只是(equation)
- 如果
\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
\ifnum
无法正常工作,因为可能\zref[chapter]{#1}
不返回数字,因此无法与“\thechapter”进行比较我必须找到一个命令来获取与数字相对应的章节名称(或者可能使用
\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
我已将方程的相对编号改为在chapter
s 内,而不是section
s,否则您将获得重复的标签。如果您确实希望在每个部分重置,那么您还应该引用相关部分标题,并且可能可以zref-titleref
直接使用。
上述代码仅抓取编号章节的标题。您可以根据需要对\chapter*
via应用类似的补丁,或者在这种情况下直接自行设置。@schapter
\currentchatpername