巧妙引用方程式

巧妙引用方程式

这个问题作者表达了以下愿望

如果推论 1.2 包含部分 (a) 和 (b),\cref那么在引用该定理部分时,我希望输出“推论 1.2(a)”。但是,在证明和类似情况下,我希望能够引用“部分 (a)”,而不在前面加上“1.2”。

还请注意,各部分是自动编号的(a)(b)而不是1.2(a)1.2(b)

我希望达到同样的效果,但只使用方程而不是部分方程。换句话说,我希望方程的编号不参考它们所在的定理等,此外,当引用同一定理等时,我希望能够通过其简单编号来引用方程,但当引用不同定理时,我希望使用其“完整签名”。

当前不理想的状况是:

\documentclass{amsart}
\usepackage[nameinlink]{cleveref}
\newtheorem{definition}{Definition}[section]
\newtheorem{theorem}[definition]{Theorem}
\numberwithin{equation}{definition}
\begin{document}

\section{The Theory}

\begin{definition}
We define $x$ by the following equation.
\begin{equation}\label{eq:1}
x = 1
\end{equation}
\end{definition}

\begin{theorem}
If $y = 1$, we have
\begin{equation}\label{eq:2}
y = x.
\end{equation}
\end{theorem}
\begin{proof}
By~\cref{eq:1}, $x = 1$. Since, by assumption $y = 1$, we obtain~\ref{eq:2}.
\end{proof}
\end{document}

方程式编号过于冗长(不好)

期望的状态:

方程式的简洁编号(好)

顺便说一句,正如“期望”示例所示,我还想摆脱eq.巧妙引用中的自动前缀,并且希望常规引用用括号将数字括起来。

附言 虽然上面的例子使用了amsart文档类,但我想知道如何使用scrbook文档类来实现同样的效果。

答案1

如果您查看 aux 文件,您会发现所需的信息根本没有存储/可用。此解决方案根本不使用 cleveref。

\documentclass{scrbook}
\usepackage{amsmath,amsthm}

\usepackage{hyperref}

\newtheorem{definition}{Definition}[chapter]
\newtheorem{theorem}[definition]{Theorem}
\numberwithin{equation}{definition}

\renewcommand{\theequation}{\arabic{equation}}
\makeatletter
\@ifpackageloaded{hyperref}%
  {\newcommand{\mylabel}[1]{\refstepcounter{equation}%
    \tag{\theequation}%
    \label{#1}%
    {\protected@write\@auxout{}{\string\newlabel{#1.def}%
      {{\thedefinition.\@currentlabel}{\thedefinition}{\@currentlabelname}{\@currentHref}{}}}}}}%
  {\newcommand{\mylabel}[1]{\refstepcounter{equation}%
    \tag{\theequation}%
    \label{#1}%
    {\protected@write\@auxout{}%
      {\string\newlabel{#1.def}{{\thedefinition.\@currentlabel}{\thedefinition}}}}}}%
\makeatother
\newcommand{\myref}[1]{(\ref{#1.def})}% \pageref{#1.def) returns \thedefinition
\begin{document}
\chapter{A Chapter}
\section{A Section}

\begin{theorem}
A theorem.
\end{theorem}
\begin{proof}
\begin{align}
a &= b\mylabel{eq:1}\\
&= c\mylabel{eq:2}
\end{align}
\end{proof}

\begin{definition}
See~\myref{eq:2}. \ref{eq:2}
\end{definition}
\end{document}

答案2

在此处输入图片描述

这解决了删除前缀的部分eq.,同时仍然获得与之兼容的交叉引用hyperref

使用下面的代码为一种特殊类型的方程标签定义一个新的交叉引用方案equationX

\crefformat{equationX}{#2(#1)#3}
\crefrangeformat{equationX}{#3(#1)#4 to #5(#2)#6}
\crefmultiformat{equationX}{#2(#1)#3}{ and #2(#1)#3}{, #2(#1)#3}{ and #2(#1)#3}
\crefrangemultiformat{equationX}{#3(#1)#4 to #5(#2)#6}{ and #3(#1)#4 to #5(#2)#6}{, #3(#1)#4 to #5(#2)#6}{ and #3(#1)#4 to #5(#2)#6}

对于任何你想引用而不带eq.前缀的方程式,请使用标签\label[equationX]{<equation label>}

\documentclass{amsart}
\usepackage[x11names]{xcolor}

\usepackage{hyperref}
\hypersetup{linkcolor=DodgerBlue3, colorlinks=true}

\usepackage[nameinlink]{cleveref}
\newtheorem{definition}{Definition}[section]
\newtheorem{theorem}[definition]{Theorem}
\numberwithin{equation}{definition}


\crefformat{equationX}{#2(#1)#3}
\crefrangeformat{equationX}{#3(#1)#4 to #5(#2)#6}
\crefmultiformat{equationX}{#2(#1)#3}{ and #2(#1)#3}{, #2(#1)#3}{ and #2(#1)#3}
\crefrangemultiformat{equationX}{#3(#1)#4 to #5(#2)#6}{ and #3(#1)#4 to #5(#2)#6}{, #3(#1)#4 to #5(#2)#6}{ and #3(#1)#4 to #5(#2)#6}

\begin{document}

\section{The Theory}

\begin{definition}
We define $x$ by the following equation.
\begin{equation}\label[equationX]{eq:1}
x = 1
\end{equation}
\end{definition}

\begin{theorem}
If $y = 1$, we have
\begin{equation}\label{eq:2}
y = x.
\end{equation}
\end{theorem}
\begin{proof}
By~\cref{eq:1}, $x = 1$. Since, by assumption $y = 1$, we obtain~\ref{eq:2}.
\end{proof}
\end{document}

虽然我不建议将其用于长文档,但如果您仍想更改方程标签的表示形式,请删除\numberwithin{equation}{definition}

在此处输入图片描述

definition要重置每个或theorem环境中的方程编号,请使用

\usepackage{etoolbox}
\BeforeBeginEnvironment{definition}{\setcounter{equation}{0}}
\BeforeBeginEnvironment{theorem}{\setcounter{equation}{0}}

在此处输入图片描述

\documentclass{amsart}
\usepackage{etoolbox}
\BeforeBeginEnvironment{definition}{\setcounter{equation}{0}}
\BeforeBeginEnvironment{theorem}{\setcounter{equation}{0}}

\usepackage[x11names]{xcolor}

\usepackage{hyperref}
\hypersetup{linkcolor=DodgerBlue3, colorlinks=true}

\usepackage[nameinlink]{cleveref}
\newtheorem{definition}{Definition}[section]
\newtheorem{theorem}[definition]{Theorem}


\crefformat{equationX}{#2(#1)#3}
\crefrangeformat{equationX}{#3(#1)#4 to #5(#2)#6}
\crefmultiformat{equationX}{#2(#1)#3}{ and #2(#1)#3}{, #2(#1)#3}{ and #2(#1)#3}
\crefrangemultiformat{equationX}{#3(#1)#4 to #5(#2)#6}{ and #3(#1)#4 to #5(#2)#6}{, #3(#1)#4 to #5(#2)#6}{ and #3(#1)#4 to #5(#2)#6}



\begin{document}

    \section{The Theory}

    \begin{definition}
        We define $x$ by the following equation.
        \begin{equation}\label[equationX]{eq:1}
        x = 1
        \end{equation}
        \begin{equation}
        e = m c^{2}
        \label[equationX]{eq:e}
        \end{equation}
    \end{definition}

    \begin{theorem}
        If $y = 1$, we have
        \begin{equation}\label{eq:2}
        y = x.
        \end{equation}
    \end{theorem}
    \begin{proof}
        By~\cref{eq:1}, $x = 1$. Since, by assumption $y = 1$, we obtain~\ref{eq:2}.
    \end{proof}

    We can also refer to \ref{eq:e} as a test of the {\color{DodgerBlue3}hyperref} compatibility.

\end{document}

笔记:上面的输出并不完全符合您的要求,因为您希望标签具有与其交叉引用的输出不同的形式。您当然可以更改诸如是否需要括号或某些前缀或后缀之类的内容。但是,在交叉引用该项目后再更改标签太复杂了。原因如下

格式定义中的输入#1和代表了您所指的整个标签。因此,如果不对的原始代码进行过多的侵入性修改,您就无法访问和里面的内容。我的建议是通过交叉引用方程然后引用它所在的定理来解决这个问题。例如,您可以写:我们在中获得。否则,您必须非常小心,并确切地知道自己在做什么,以避免交叉引用中出现一些意外异常。#2\cref#1#2cleveref\cref{<label of the equation>}\cref{<label of the theorem that has the equation>}

相关内容