我需要使用哪个命令 \protect 才能使 latexdiff 正常工作?

我需要使用哪个命令 \protect 才能使 latexdiff 正常工作?

我已经使用了在 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将解决您的问题。

相关内容