Hyperref 和 ulem 命令不能组合

Hyperref 和 ulem 命令不能组合

有些hyperref命令与命令不能很好地混合ulem。编译此 MWE

\documentclass{article}

\usepackage[normalem]{ulem}
\usepackage{hyperref}

\begin{document}
\sout{\hypertarget{label}{text}}
\end{document}

导致以下错误:

! Undefined control sequence.
<recently read> \put@me@back 

l.7 \sout{\hypertarget{label}{text}}

如果我们sout用其他 ulem 命令(例如uwave或 )替换,情况也是如此xout。 这个问题有解决办法吗? 最好使用删除线来表示已删除的文本(如果指定了正确的选项,Latexdiff 会这样做)

答案1

ulem对参数内部可使用的内容有限制。因此\hypertarget不能直接使用。

可以通过以下方式保护\mbox

\sout{\mbox{\hypertarget{...}{...}}

或者更好的解决方案是切换\sout\hypertarget

\hypertarget{label}{\sout{text}}

完整示例:

\documentclass{article}

\usepackage[normalem]{ulem}
\usepackage{hyperref}

\begin{document}
\sout{\mbox{\hypertarget{label}{text}}}
\hypertarget{label2}{\sout{text2}}
\end{document}

结果

答案2

是的,这是一个很老的问题,但现在才看到。ulem.sty 的新版本(2020 年 4 月)将解决此问题。

的违规部分\hypertarget\penalty,它导致\sout关闭一个框并启动另一个框,并在它们之间设置惩罚。这导致\hypertarget无法跟踪其本地上下文。但使用的惩罚是 10000(无中断),因此 ulem 可以完全跳过处理此类惩罚。

相关内容