问题

问题

使用此代码

\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}

我明白了版本 1

如果我注释掉\usepackage{hyperref},我会得到这个

版本 2

最后,如果我使用给出的技巧来回答这个问题问题,即

\makeatletter
\renewcommand*{\eqref}[1]{%
  \hyperref[{#1}]{\textup{\tagform@{\ref*{#1}}}}%
}
\makeatother

我明白了版本 3

但是,当我使用时,我希望它的尺寸​​与第二张图片相同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{..}仅调整尺寸“当前文本字体”,保留所有其他属性(例如、粗细、形状)不变。但是,amstextLaTeX 内核允许该包“挂接”内核定义的命令,用于以特定形状、粗细或系列排版一段文本,例如\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

相关内容