![当使用 hyperref 编译为 dvi 时,如何使下标中的引用具有正确的大小?](https://linux22.com/image/239778/%E5%BD%93%E4%BD%BF%E7%94%A8%20hyperref%20%E7%BC%96%E8%AF%91%E4%B8%BA%20dvi%20%E6%97%B6%EF%BC%8C%E5%A6%82%E4%BD%95%E4%BD%BF%E4%B8%8B%E6%A0%87%E4%B8%AD%E7%9A%84%E5%BC%95%E7%94%A8%E5%85%B7%E6%9C%89%E6%AD%A3%E7%A1%AE%E7%9A%84%E5%A4%A7%E5%B0%8F%EF%BC%9F.png)
(在调查了原始问题之后,我冒昧地重写了它,因为我发现了 MWE 并因此隔离了问题,但我不知道解决方案。安德鲁·史黛西。)
场景如下:LaTeX 文档使用超链接并且由于某种原因,在某些方程式中引用了下标。编译为 PDF 时,它们的大小是正确的。编译为 DVI 时,它们的大小正常。它们仍然以数学模式排版,只是大小不正确。这是一个 MWE。我使用罗马标签来更好地显示它们是以数学方式排版的。
\documentclass{article}
\usepackage{hyperref}
\begin{document}
\begin{enumerate}
\renewcommand{\theenumi}{\roman{enumi}}
\item \label{ab} First
\item \label{cd} Second
\end{enumerate}
\[
M_{\ref{ab}} + M_i + M_{\mathrm{i}} + N_{\ref{cd}} + N_{ii} + N_{\mathrm{ii}}
\]
\end{document}
这是来自 DVI 的:
这是 PDF 中的一段:
这似乎是hdvips
驱动程序中的一个错误,因此显而易见的答案是修复它。然而,困难在于,这个问题是在上传到 arXiv 时发现的,根据日志,它使用 TL2009。(顺便说一句,上面的文档仍然显示 TL2011 存在错误。)所以问题是:
- 有没有办法从主文档中修复这个问题?
- 如果没有,并且驱动程序需要修复,是否有简单的修复方法,以及如何将其应用于上传到 arXiv 的文件没有让 arXiv 做任何事情?(对于那些不知道 arXiv 如何工作的人,可以随提交上传辅助文件。)
由于这是对问题的重大重写,因此现在遵循原始问题。
当我编译我的 LaTeX 时,所有下标的大小都小于文本的正常大小(包括参考下标),正如预期的那样。
但是,当 arXiv 编译我的 LaTeX 时,参考文献下标的大小与普通文本相同。
当下标不是参考时,则使用正确的字体大小。
我包括
- \usepackage{subfig}
- \usepackage{graphicx}
- \usepackage{hyperref}
- \usepackage{tikz}
- \usetikzlibrary{箭头、背景、计算、拟合}
- \usepackage{多行}
- \usepackage{tyson.sty} % 我的个人风格文件
arXiv LaTeX 所包含的软件包可以在其日志档案来自编译我的 LaTeX。
问题:我如何强制 arXiv 以正确的字体大小排版参考下标?
答案1
我已经将问题追溯到驱动程序pdfmark.def
包含的文件hdvips.def
。引用链接排版在一个框中,因此如果外部环境是数学的,它需要恢复框内的数学模式。不幸的是,正如我在问题中发现的那样数学模式中是否有针对不同风格的测试?TeX 无法确切知道它处于哪种数学模式。
可以\mathchoice
在这里添加一个宏来解决这个问题,但这会相当复杂,一个较小的破解方法是允许用户指定链接是否在下标中或者其他什么。
这需要进行pdfmark.def
一些修改以添加样式选择宏。与 TL2010 中的版本相比,补丁文件是:
=== modified file 'pdfmark.def'
--- pdfmark.def 2011-08-18 19:15:22 +0000
+++ pdfmark.def 2011-08-18 19:15:44 +0000
@@ -223,6 +223,7 @@
\hbox\bgroup
\Hy@RestoreSpaceFactor
\Hy@LinkMath
+ \Hy@mathstyle
\fi
\expandafter\Hy@colorlink\csname @#1color\endcsname
\literalps@out{H.S}%
@@ -517,6 +518,13 @@
\providecommand*{\Hy@setouterhbox}{\sbox}
\providecommand*{\Hy@breaklinksunhbox}{\unhbox}
\def\Hy@DEST{/DEST}
+\def\Hy@mathstyle{%
+\ifmmode
+\csname \Hy@currentmstyle\endcsname
+\fi
+}%
+\def\setmathstyle#1{\def\Hy@currentmstyle{#1style}}%
+\def\Hy@currentmstyle{textstyle}%
\def\pdf@rect#1{%
\begingroup
\chardef\x=1 %
@@ -548,6 +556,7 @@
\Hy@setouterhbox\pdf@box{%
\Hy@RestoreSpaceFactor
\Hy@LinkMath
+ \Hy@mathstyle
\Hy@AllowHyphens#1\Hy@xspace@end
\Hy@LinkMath
\Hy@SaveSpaceFactor
@@ -556,6 +565,7 @@
\sbox\pdf@box{%
\Hy@RestoreSpaceFactor
\Hy@LinkMath
+ \Hy@mathstyle
#1\Hy@xspace@end
\Hy@LinkMath
\Hy@SaveSpaceFactor
我们定义了一个新命令\Hy@mathstyle
,它是一个钩子,用于根据宏选择数学样式\Hy@currentmstyle
。因此,如果我们相应地设置该宏,超链接将以相应的样式排版。
然后在文档本身中,我们定义一个命令\subref
,将默认样式设置为script
,然后调用\ref
。我们检查setmathstyle
命令是否已定义,以便如果使用运行pdflatex
,例如,这只会调用\ref
。
\makeatletter
\def\subref{%
\@ifundefined{setmathstyle}{}{\setmathstyle{script}}\ref}
\makeatother
因此整个文档的内容为:
\documentclass{article}
\usepackage{hyperref}
% hdvips: hdvips.def, pdfmark.def
% hpdftex: hpdftex.def
\makeatletter
\def\subref{%
\@ifundefined{setmathstyle}{}{\setmathstyle{script}}\ref}
\makeatother
\begin{document}
\begin{enumerate}
\renewcommand{\theenumi}{\roman{enumi}}
\item \label{ab} First
\item \label{cd} Second
\end{enumerate}
\[
M_{\subref{ab}} + M_i + M_{\mathrm{i}} + N_{\subref{cd}} + N_{ii} + N_{\mathrm{ii}}
\]
\end{document}
来自 DVI 的结果:
要使此方法适用于 arXiv,您必须pdfmark.def
在提交时包含修改的内容。您可能还应该pdfmark.def
从 TL2009 获取文件并修改那因为 hyperref 文件会检查正确的版本。
答案2
从arXiv 帮助:
您可以通过在主 pdflatex 文件序言的前 5 行内设置 \pdfoutput=1 来确保 pdflatex 处理。
arXiv 帮助页面上有有关此设置的更多重要信息,因此请务必阅读。