我遇到了 latexdiff 在\cite
命令周围添加的标记问题。下面的 MWE 应该是由 latexdiff 生成的,但却无法编译,因为 LaTeX 无法识别以下括号\DIFdel
:
ERROR: Extra }, or forgotten \endgroup.
罪魁祸首是\hspace{0pt}
:注释掉这个可以避免这个错误。
我已经通过从差异文件中手动删除出现的字符串解决了我当前的问题\hspace{0pt}
,但显然我不想每次都这样做。
我有两个问题:(1) 为什么 LaTeX 首先会发现这里的括号有问题,因为它们在我看来是匹配的(对 emacs 也是如此!)?(2) 有没有办法防止 latexdiff 生成以这种方式编译失败的代码?
LaTeX 的 MWE(请注意,我删除了大部分 latexdiff 前言)
\documentclass{article}
\usepackage{hyperref}
% DIF PREAMBLE EXTENSION ADDED BY LATEXDIFF
%DIF UNDERLINE PREAMBLE %DIF PREAMBLE
\RequirePackage[normalem]{ulem} %DIF PREAMBLE
\RequirePackage{color}\definecolor{RED}{rgb}{1,0,0}\definecolor{BLUE}{rgb}{0,0,1} %DIF PREAMBLE
\providecommand{\DIFdeltex}[1]{{\protect\color{red}\sout{#1}}} %DIF PREAMBLE
%DIF SAFE PREAMBLE %DIF PREAMBLE
\providecommand{\DIFdelbegin}{} %DIF PREAMBLE
\providecommand{\DIFdelend}{} %DIF PREAMBLE
%DIF HYPERREF PREAMBLE %DIF PREAMBLE
\providecommand{\DIFdel}[1]{\texorpdfstring{\DIFdeltex{#1}}{}} %DIF PREAMBLE
%DIF END PREAMBLE EXTENSION ADDED BY LATEXDIFF
\begin{document}
\DIFdelbegin \DIFdel{Some text\mbox{%DIFAUXCMD
\cite{reference}}\hspace{0pt}%DIFAUXCMD
, and some more text.}
\DIFdelend
\bibliography{my_bib}
\end{document}
latexdiff 的 MWE
old.tex
\documentclass{article}
\usepackage{hyperref}
\begin{document}
Some text \cite{reference}, and some more text.
\bibliography{my_bib}
\end{document}
new.tex
\documentclass{article}
\usepackage{hyperref}
\begin{document}
\bibliography{my_bib}
\end{document}
latexdiff old.tex new.tex > diff.tex
答案1
今年 (2020) LaTeX 经历了一些内部变化,导致与一些软件包不兼容。这似乎ulem.sty
是其中之一,当前版本ulem 2019/11/18
早于 LaTeX 格式的变化。
latexdiff
加载产生的差异文件ulem.sty
使用命令\sout
(删除),导致错误。
\RequirePackage[normalem]{ulem} %DIF PREAMBLE
...
\providecommand{\DIFdeltex}[1]{{\protect\color{red}\sout{#1}}} %DIF PREAMBLE
作为一种解决方法,直到不兼容性得到修复,latexdiff
使用选项运行-t CFONT
,以避免使用\sout
(由@Ant在评论中提出)。
或者,添加
\RequirePackage[2019/11/18]{latexrelease}
作为差异文件的第一行。这会将 LaTeX 格式恢复为兼容状态。
答案2
Germot 已经提供了一个很好的回答。但是,它并不完全令人满意。该-t CFONT
选项会更改格式(它仅使用颜色,删除删除线和下划线)。虽然将版本设置latexrelease
为 可以2019/11/18
很好地与 OP 的 MWE 配合使用,但它在更复杂的文档中失败了。
所以我试图除掉真正的罪魁祸首,\hspace{0pt}
。
自 v1.0.1 以来,latexdiff 将引文(以及其他一些内容,如 siunitx 命令)括在\mbox
命令中,以避免与 ulem 样式不兼容(默认使用\sout
和\uwave
)。但是,这意味着引文中的换行符不再起作用。此问题已在 v1.2.1 中通过在\hspace{0pt}
后添加 来修复\mbox
。变更日志指出“否则更改不应导致不良行为”。现在确实如此!
我的临时解决办法是编辑 latexdiff 源 ( texmf-dist/scripts/latexdiff/latexdiff.pl
),并将 替换为\hspace{0pt}
。\hskip0pt
生成的 PDF 与使用旧版本获得的 PDF 相同。
tl; dr:
latexdiff.pl
在你的 texlive 安装目录中找到脚本¹ ,或者latexdiff
在你的二进制目录中找到可执行文件并替换第 2734 行²:
push(@$retval,"\\mbox{$AUXCMD\n\\" . $1 . $2 . $3 ."}\\hspace{0pt}$AUXCMD\n" );
经过
push(@$retval,"\\mbox{$AUXCMD\n\\" . $1 . $2 . $3 ."}\\hskip0pt$AUXCMD\n" );
¹ 例如/usr/share/texmf-dist/scripts/latexdiff/latexdiff.pl
。²
假设您有 latexdiff v1.3.1.1。