![如何在 latexdiff 中保护或 mbox 命令?](https://linux22.com/image/477073/%E5%A6%82%E4%BD%95%E5%9C%A8%20latexdiff%20%E4%B8%AD%E4%BF%9D%E6%8A%A4%E6%88%96%20mbox%20%E5%91%BD%E4%BB%A4%EF%BC%9F.png)
在latexdiff
,默认情况下,引用命令会使用 进行保护,\mbox
以便以默认样式正确打印。如何添加其他命令以使用 进行保护\mbox
,例如\SI{}{}
或\cref{}
?
new.tex
% arara: pdflatexmk
\documentclass{article}
\usepackage{siunitx}
\begin{document}
This is the new text \SI{300}{\meter\per\second}
\end{document}
old.tex
% arara: pdflatexmk
\documentclass{article}
\usepackage{siunitx}
\begin{document}
This is the old text \SI{600}{\meter\per\second}
\end{document}
输出(编译失败,但在命令周围latexdiff --append-safecmd="SI"
添加成功):\mbox
siunitx
% arara: pdflatexmk
%DIF LATEXDIFF DIFFERENCE FILE
%DIF DEL test_old.tex Sun Dec 21 11:40:33 2014
%DIF ADD test.tex Sun Dec 21 11:40:38 2014
\documentclass{article}
\usepackage{siunitx}
%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{\DIFadd}[1]{{\protect\color{blue}\uwave{#1}}} %DIF PREAMBLE
\providecommand{\DIFdel}[1]{{\protect\color{red}\sout{#1}}} %DIF PREAMBLE
%DIF SAFE PREAMBLE %DIF PREAMBLE
\providecommand{\DIFaddbegin}{} %DIF PREAMBLE
\providecommand{\DIFaddend}{} %DIF PREAMBLE
\providecommand{\DIFdelbegin}{} %DIF PREAMBLE
\providecommand{\DIFdelend}{} %DIF PREAMBLE
%DIF FLOATSAFE PREAMBLE %DIF PREAMBLE
\providecommand{\DIFaddFL}[1]{\DIFadd{#1}} %DIF PREAMBLE
\providecommand{\DIFdelFL}[1]{\DIFdel{#1}} %DIF PREAMBLE
\providecommand{\DIFaddbeginFL}{} %DIF PREAMBLE
\providecommand{\DIFaddendFL}{} %DIF PREAMBLE
\providecommand{\DIFdelbeginFL}{} %DIF PREAMBLE
\providecommand{\DIFdelendFL}{} %DIF PREAMBLE
%DIF END PREAMBLE EXTENSION ADDED BY LATEXDIFF
\begin{document}
This is the \DIFdelbegin \DIFdel{old text \SI{600}{\meter\per\second}
}\DIFdelend \DIFaddbegin \DIFadd{new text \SI{300}{\meter\per\second}
}\DIFaddend\end{document}
答案1
如果在以下选项中定义,其他命令将被视为与引用命令等效:
--append-mboxsafecmd="cmd1,cmd2,..."
(需要 latexdiff 1.1.0 或更高版本)。如果检测到 siunitx 包,则会自动执行此操作\SI
。
答案2
没有简单的方法可以做到这一点。引用命令目前(1.0.4)是硬编码的。您必须修改 latexdiff 的源代码以将 \cref 包含在此列表中。在代码中查找以下几行:
if ( defined $packages{"apacite"} ) {
print STDERR "DEBUG apacite citation commands\n" if $debug;
$citpatsafe=qr/^(?:mask)?(?:full|short)?cite(?:A|author|year)?(?:NP)?$/;
$citpat='(?:mask)?(?:full|short|no)?cite(?:A|author|year|meta)?(?:NP)?';
} else {
# citation command pattern for all other citation schemes
$citpatsafe=qr/^cite.*$/;
$citpat='(?:cite\w*|nocite)';
};
并将 else 子句中的行更改为
$citpatsafe=qr/^(?:cite.*|cref)$/;
$citpat='(?:cite\w*|nocite|cref)';
(未经测试,但应该可以工作)。对于 \SI,这不会起作用,因为算法期望“引用”命令恰好有一个非可选参数。
引用命令的问题源于与 ulem 包的不兼容,siunitx 可能也存在同样的问题。作为一种解决方法,我建议尝试不同的标记样式(例如 CFONT,选项 -t CFONT),然后将 \SI,\cref 定义为安全命令。
作为一种极其肮脏的解决方法,使用这一行代码对 latexdiff 输出进行后处理,然后再将其提供给 latex/pdflatex,以保护 \SI 命令:
perl -pne 's/\\SI\{(.*?)}{(.*?)\}/\\mbox{\\SI{$1}{$2}}/g' file-diff.tex > file-diff-mod.tex
请注意,这将用 \mbox 命令包围 \SI 的所有实例,包括添加或删除的块之外的实例。此外,如果任何 \SI 命令的参数是嵌套的(即包含花括号),或者 SI 的参数之间有空格或换行符,这将导致错误
答案3
你可以在 LaTeX 端使用某种 hack 来解决这个问题
\makeatletter
\AtBeginDocument{
\let\UL@SI\SI
\renewcommand\SI[3][]{\mbox{\UL@SI[#1]{#2}{#3}}}
}
\makeatother
这适用于大多数“简单”情况。