使用此代码
\documentclass{article}
\usepackage[]{amsmath, amssymb, amsthm}
\usepackage{mathtools}
\usepackage{hyperref}
\renewcommand{\thesection}{\arabic{section}}
\newtheorem{theorem}{Theorem}[section]
\newtheorem{proposition}[theorem]{Proposition}
\begin{document}
\begin{proposition}\label{A}
A
\end{proposition}
\begin{equation}
E = mc^{2} \label{B}
\end{equation}
\begin{align*}
a &\xLeftrightarrow{\ref{A}} b \\
&\xLeftrightarrow{\eqref{B}} c
\end{align*}
\end{document}
如果我注释掉\usepackage{hyperref}
,我会得到这个
最后,如果我使用给出的技巧来回答这个问题问题,即
\makeatletter
\renewcommand*{\eqref}[1]{%
\hyperref[{#1}]{\textup{\tagform@{\ref*{#1}}}}%
}
\makeatother
但是,当我使用时,我希望它的尺寸与第二张图片相同hyperref
。该怎么做?
答案1
不要使用\textup
,而要使用组合\text{\upshape ...}
。
在评论中,您说您的输出是 dvi,然后转换为 pdf。
此示例是用 dvi 输出生成的,用 acrobat 转换为 pdf,而不是您采用的 ps2pdf 路线。但是,我已经使用 dvips + ps2pdf 重现了实验并获得了相同的结果。两个参考都是链接的,尽管这在所示的输出中不可见。
\documentclass{article}
\usepackage[]{amsmath, amssymb, amsthm}
\usepackage{mathtools}
\usepackage{hyperref}
\renewcommand{\thesection}{\arabic{section}}
\newtheorem{theorem}{Theorem}[section]
\newtheorem{proposition}[theorem]{Proposition}
\begin{document}
\begin{proposition}\label{A}
A
\end{proposition}
\begin{equation}
E = mc^{2} \label{B}
\end{equation}
\begin{align*}
a &\xLeftrightarrow{\ref{A}} b \\
&\xLeftrightarrow{\eqref{B}} c
\end{align*}
\begin{align*}
a &\xLeftrightarrow{\text{\upshape\ref{A}}} b \\
&\xLeftrightarrow{\text{\upshape\eqref{B}}} c
\end{align*}
\end{document}
正如 GuM 在评论中指出的那样,使用\textup
相当于\text{\upshape}
何时amsmath
或甚至只是amstext
使用。
答案2
我仍然发现@barbarabeeton 的回答有点令人困惑:首先,它声称解决方案的关键是使用\text{\upshape ...}
而不是\textup{...}
,然后,在最后一段中,它指出\text{\upshape ...}
相当于加载包\textup{...}
时amsmath
。因此,我希望如果我为了清楚起见添加这个新答案,我不会受到责备。
问题
首先,让我们简单描述一下问题的根源。正如 Loop Space 几年前在他们出色的回答到当使用 hyperref 编译为 dvi 时,如何使下标中的引用具有正确的大小?,这是驱动程序的一个已知问题hdvips
,该驱动程序是软件包hyperref
在要求 DVI 输出时通常使用的驱动程序。基本上,此驱动程序使用命令在框中排版链接\hbox
,这会导致 TeX 以“文本的当前字体”排版它,这通常是数学公式开始之前的当前字体,不论“当前数学风格”(即文本风格 vs. 脚本风格 vs. scriptscript 风格)的差异。这解释了为什么在
\xLeftrightarrow{\ref{A}}
参考点设置为 10 点,而不是 7 点,因为这对于上标来说是合适的。要理解为什么使用 时情况并非如此,我们首先要讨论(或)\eqref
的使用如何影响上述结果。\text
\textup
\text
与兄弟姐妹一起解决
该amstext
包(由 自动合并amsmath
)定义了方便的命令\text
,粗略地说,它在“当前文本字体”已被重新定义的上下文中排版其参数,以便将其大小调整为“当前数学样式”(这过于简单化了实际情况,TeX 专家无疑会对此皱眉);这特别意味着当\text{...}
出现在上标或下标中时将使用较小的尺寸。
请注意,\text{..}
仅调整尺寸“当前文本字体”,保留所有其他属性(例如、粗细、形状)不变。但是,amstext
LaTeX 内核允许该包“挂接”内核定义的命令,用于以特定形状、粗细或系列排版一段文本,例如\textit
、\textup
、\textbf
、\texttt
等,从而赋予它们以下能力:当它们在数学模式下使用时,调整尺寸字体的“当前数学样式”,与所做的操作完全相同\text
。这意味着,例如,\textup{...}
将产生,在数学模式下使用时,与 的输出完全相同\text{\upshape ...}
。
我强调了“在数学模式下使用时”的条件,因为那\text{\upshape ...}
是解决方案的关键,而不是使用 代替 的事实\textup{...}
:您可以使用任一构造(因为,我再说一遍,它们彼此等效),但为了使其产生所需的大小调整效果,您必须在数学模式下发出它;如果您在 生成的文本“内部”发出它\ref
,它将出现在驱动程序放置该文本的框内hdvips
,即已经处于文本模式;并且包对它们操作的“祝福” - 显然! - 当在文本模式下使用amstext
该系列的命令时无效。\text??
现在让我们看看这确实解释了 OP 在问题中提到的所有情况下所获得的输出。
为什么amsmath
效果\eqref
很好
该amsmath
包定义\eqref
命令如下:
\newcommand{\eqref}[1]{\textup{\tagform@{\ref{#1}}}}
这意味着
\xLeftrightarrow{\eqref{B}}
扩展为
\xLeftrightarrow{\textup{\tagform@{\ref{B}}}}
现在,hdvips
驱动程序将生成的引用放入\ref{B}
,\hbox
但重要的是该\textup
命令发生在数学模式下,因此将当前字体的大小调整为当前数学样式,即脚本样式;随后的\hbox
命令将选择这个更新的当前字体,因此大小将适合下标。
为什么重新\eqref
定义不是工作顺利
现在让我们看看当重新定义\eqref
命令时会发生什么,如下所示:
\makeatletter
\renewcommand*{\eqref}[1]{%
\hyperref[{#1}]{\textup{\tagform@{\ref*{#1}}}}%
}
\makeatother
在这种情况下,
\xLeftrightarrow{\eqref{B}}
变成
\xLeftrightarrow{\hyperref[{B}]{\textup{\tagform@{\ref*{B}}}}}
我们看到,现在在数学模式下执行的是\hyperref
命令:此命令将其强制参数生成的文本转换为指向与可选参数中指定的标签相关联的位置的链接。但我们知道驱动程序hdvips
使用 来\hbox
作为链接,因此它执行强制参数\textup{\tagform@{\ref*{B}}}
里面以此\hbox
来获取组成相关链接的文本:这意味着该\textup
命令是在文本模式下执行的,它不会调整字体大小(回想一下\ref*{B}
,使用 *
,排版为普通的,IE,非主动,参考\label{B}
)。另一方面,如果你移出\textup
命令\hyperref
,也就是说,如果你说
\makeatletter
\renewcommand*{\eqref}[1]{%
\textup{\hyperref[{#1}]{\tagform@{\ref*{#1}}}}%
}
\makeatother
您会看到参考文献被排版为所需的较小尺寸(同时被制作成活动链接)。
示例程序
我们现在将通过一个例子来解释我们迄今为止所说的内容。
考虑以下代码
% My standard header for TeX.SX answers:
\documentclass[a4paper]{article} % To avoid confusion, let us explicitly
% declare the paper format.
\usepackage[T1]{fontenc} % Not always necessary, but recommended.
% End of standard header. What follows pertains to the problem at hand.
\usepackage{mathtools} % also loads amsmath
\usepackage{amsthm}
\usepackage{hyperref}
\makeatletter
\newcommand*{\myeqref}[1]{%
\hyperref[{#1}]{\textup{\tagform@{\ref*{#1}}}}%
}
\makeatother
\newtheorem{proposition}{Proposition}[section]
\begin{document}
\begin{proposition}\label{A}
A nifty claim.
\end{proposition}
\begin{proof}
We start from Einstein's famous equation
\begin{equation}
E = mc^{2}
\label{B}
\end{equation}
and deduce that blah blah blah\ldots
\end{proof}
Without \verb|\textup|:
\begin{align*}
a &\xLeftrightarrow{\ref{A}} b \\
&\xLeftrightarrow{\eqref{B}} c \\
&\xLeftrightarrow{\myeqref{B}} d
\end{align*}
With \verb|\textup|:
\begin{align*}
a &\xLeftrightarrow{\textup{\ref{A}}} b \\
&\xLeftrightarrow{\textup{\eqref{B}}} c \\ % pointless
&\xLeftrightarrow{\textup{\myeqref{B}}} d % inner "\textup" unneeded
\end{align*}
\end{document}
以及它产生的输出(通过latex
→ dvips
→ ps2pdf
):
此代码比较了在其他方面相同的上下文中使用和不使用环境时三种不同构造( 、 以及 OP 提出的重新定义版本,此处称为 )\ref
的输出\eqref
:您可以看到,使用外部时输出始终正确。但是,在 的情况下,使用外部是多余的(注释说“毫无意义”);另一方面,在 的情况下,内部的,即 的定义内的,是不需要的,如上所述。还应注意,使用 时,引用周围的括号成为链接的一部分。\eqref
\myeqref
\textup
\textup
\textup
\eqref
\textup{\myeqref{B}}
\textup
\myeqref
\myeqref