Я хотел бы использовать класс книги и численное уравнение таким образом:
Уравнение должно содержать только номер уравнениябез Номер главы. Я получаю это с помощью
\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
самостоятельно в таких обстоятельствах.