Hyperref 包影响 varwidth 内的枚举

Hyperref 包影响 varwidth 内的枚举

在以下示例中,为什么hyperref包会影响enumerate(但不会影响itemize)内部varwidth环境?这是一个错误吗?

\documentclass{article}

\usepackage{varwidth}
\usepackage{hyperref} % removing it solves the problem 

\begin{document}

\fbox{\begin{varwidth}{\textwidth}
  \begin{itemize}
    \item One
    \item Two
  \end{itemize}
\end{varwidth}}

\fbox{\begin{varwidth}{\textwidth}
  \begin{enumerate}
    \item One
    \item Two
  \end{enumerate}
\end{varwidth}}

\end{document}

在此处输入图片描述

评论:我用PDFLaTeX或者LuaLaTeX编译代码时结果是错误的,但用XeLaTeX编译结果是正确的。

答案1

varwidth如果在段落开头有一个创建 whatsits 的原语,则会出现问题。

varwidth包含这种情况的代码(\@vwid@wrap)并使用它来处理\special\pdfliteral因此例如\colors有效(但仅限于 xelatex 和 pdflatex,lualatex 失败)。

但这里底层的原语是,\pdfdest并且这会失败。

以下应该有效。我可能会向 hyperref 添加这样的配置点,以便 varwidth 可以使用它:

\documentclass{article}

\usepackage{varwidth,etoolbox}
\usepackage{hyperref,color}

\makeatletter

\newcommand\hyper@configure@raisedlink@vmode[1]{#1}
\patchcmd\Hy@raisedlink{\ifvmode #1}{\ifvmode \hyper@configure@raisedlink@vmode{#1}}{}{\fail}
\appto\@vwid@setup{\let\hyper@configure@raisedlink@vmode\@vwid@wrap}
\makeatletter

\begin{document}
abc

\fbox{\begin{varwidth}{\textwidth}
  \begin{enumerate}
    \item One
    \item Two
  \end{enumerate}
\end{varwidth}}

\end{document}

相关内容