\autoref 不会在行首自动扩展缩写

\autoref 不会在行首自动扩展缩写

假设有一个等式:

\begin{equation}
r^2 = x^2 + y^2 \text{.} \label{eq:circ}
\end{equation}

我可以autoref使用以下方法更改标签:

\def\equationautorefname{Eq.}

现在,使用

\autoref{eq:circ} something something \autoref{eq:circ}.

给出Eq. 1 something something Eq. 1.

但是,如果缩写版本位于行首,我希望它们能够展开。本质上,我希望得到以下结果:(Equation 1 something something Eq. 1.当然,所有结果都是超链接)。我该如何实现?

答案1

不幸的是,\autoref无法区分您是否位于行首......

但是我们可以定义一个大写命令\Autoref来实现这个效果(模拟使用包做\cref什么):\Crefcleveref

\newcommand{\Autoref}[1]{%
  \begingroup%
  \renewcommand\equationautorefname{Equation}%
  \autoref{#1}%
  \endgroup%
  }

请注意,我已将定义括在\begingroup...中\endgroup,以便仅在本地进行定义。

\documentclass{report}
\usepackage{amsmath}

\usepackage[colorlinks]{hyperref}

\renewcommand\equationautorefname{Eq.}

\newcommand{\Autoref}[1]{%
  \begingroup%
  \renewcommand\equationautorefname{Equation}%
  \autoref{#1}%
  \endgroup%
  }

\begin{document}

\begin{equation}
r^2 = x^2 + y^2 \text{.} \label{eq:circ}
\end{equation}

\Autoref{eq:circ} something something \autoref{eq:circ}.

\end{document} 

输出:

在此处输入图片描述

答案2

基本问题是检测句子的开头(我想,你的意思是句子而不是行?)。可以使用以下启发式方法:

  • 垂直模式,即\autoref开始一个新段落。
  • \spacefactor:如果 TeX 认为前面的字符结束了一个句子,则空间因子大于千。

\myautoref先前的启发式方法在以下示例中 实现。如果启发式方法可能失败,则允许手动指定完整版本和缩写版本\fullautoref\autoref

\documentclass[a5paper]{article}
\usepackage{amstext}
\usepackage[colorlinks]{hyperref}

\makeatletter
\newif\ifautorefabbr
\autorefabbrtrue

\renewcommand*{\equationautorefname}{%
  \ifautorefabbr
    Eq.\@%
  \else   
    Equation%
  \fi
}
\newcommand*{\fullautoref}{%
  \@ifstar{\@fullautoref{*}}{\@fullautoref{}}%
}
\newcommand*{\@fullautoref}[2]{%
  \begingroup
    \autorefabbrfalse
    \autoref#1{#2}%  
  \endgroup
}

\newcommand*{\myautoref}{%
  \@ifstar{\@myautoref{*}}{\@myautoref{}}%
}
\newcommand*{\@myautoref}[2]{%
  \begingroup
    \ifvmode % \myautoref starts a new paragraph
      \autorefabbrfalse
    \else
      \ifnum\spacefactor>1000 %
        \autorefabbrfalse
      \fi
    \fi  
    \autoref#1{#2}%
  \endgroup
}
\makeatother

\begin{document}
  \begin{equation}
    r^2 = x^2 + y^2 \text{.} \label{eq:circ}
  \end{equation}   

  \fullautoref{eq:circ} something something \autoref{eq:circ}.
  \fullautoref{eq:circ} something.

  \myautoref{eq:circ} something something \autoref{eq:circ}.
  \myautoref{eq:circ} something.
\end{document}

结果

评论:

  • 星号形式创建没有链接的引用。

答案3

您可能想要使用cleveref包的交叉引用命令。该包的主要交叉引用命令称为\cref;默认情况下,变体命令\Cref将对象的第一个字母更改为大写避免使用缩写。(这些默认设置可以完全自定义。)

如下所示,\cref自动\Cref在交叉引用的方程编号周围插入括号。这非常类似于包\eqref的命令amsmath。如果您不喜欢此设置,也可以修改它。

在此处输入图片描述

\documentclass{article}
\usepackage{amsmath}
\usepackage[colorlinks=true]{hyperref}
\def\equationautorefname{Eq.}
\usepackage[nameinlink]{cleveref} % 'nameinlink' used to mimic \autoref's behavior of
                                  % including the cross-reference's name in the link
\setlength\textwidth{4in} % just for this example
\begin{document}
\begin{equation}
r^2 = x^2 + y^2 \text{.} \label{eq:circ}
\end{equation}
\autoref{eq:circ} something something \autoref{eq:circ}. (\verb+\autoref+)

\noindent
\Cref{eq:circ} something something \cref{eq:circ}. 
(\verb+\Cref+ and \verb+\cref+)
\end{document}

相关内容