假设有一个等式:
\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
什么):\Cref
cleveref
\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}