在以下示例中,为什么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}