我已经使用了在 cleveref 的 \crefformat 中访问原始标签访问引用的标签。在我进入游戏cleveref
之前,这一直都很好用。现在,我高度简化的 diff 结果如下所示:latexdiff
\documentclass{article}
\usepackage{graphicx}
\usepackage{hyperref}
\usepackage{cleveref}
% https://tex.stackexchange.com/questions/319410/
\usepackage{xpatch}
\makeatletter
\apptocmd{\cref@getref}{\xdef\@lastusedlabel{#1}}{}{error}
\crefformat{section}{the #2``\nameref*{\@lastusedlabel}''#3 section}
\makeatother
% latexdiff preamble
\RequirePackage[normalem]{ulem}
\providecommand{\DIFadd}[1]{\texorpdfstring{\DIFaddtex{#1}}{#1}}
\providecommand{\DIFaddtex}[1]{\uwave{#1}}
\begin{document}
\section{\DIFadd{Foo}}
\label{foo}
\DIFadd{\mbox{\cref{foo}}}
\end{document}
错误信息是! Dimension too large. \UL@on ...UL@height \advance \UL@height -\ULdepth
我猜我需要\protect
其中一个命令,但我真的不知道是哪一个。
答案1
您需要\DIFadd
在 内部进行保护\section
。这是因为\section
将其参数写入文件.aux
以允许支持目录之类的内容,但如果您在 的参数中使用了任何计数器或本地定义\section
,则希望在写入目录时正确定义它们。因此,\section
首先递归扩展其参数,然后再将其写入文件.aux
。但是,\DIFadd
不喜欢递归扩展。说\section{\protect\DIFadd{foo}}
或定义\DIFadd
使用\DeclareRobustCommand
将解决您的问题。