有些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 可以完全跳过处理此类惩罚。