Wie schütze ich Mbox-Befehle in Latexdiff?

Wie schütze ich Mbox-Befehle in Latexdiff?

Inlatexdiff, standardmäßig werden Zitatbefehle mit einem geschützt, \mboxdamit sie im Standardstil richtig gedruckt werden. Wie kann ich andere Befehle hinzufügen, die durch ein geschützt werden sollen \mbox, beispielsweise \SI{}{}oder \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}

Ausgabe von latexdiff --append-safecmd="SI"(das Kompilieren schlägt fehl, aber das Hinzufügen eines \mboxum die siunitxBefehle ist erfolgreich):

% 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}

Antwort1

Andere Befehle werden gleichwertig zu den Zitierbefehlen behandelt, wenn sie in der folgenden Option definiert sind:

--append-mboxsafecmd="cmd1,cmd2,..."

(erfordert Latexdiff Version 1.1.0 oder höher). Wenn das siunitx-Paket erkannt wird, geschieht dies automatisch für \SI.

Antwort2

Es gibt keine einfache Möglichkeit, dies zu tun. Die Zitierbefehle sind derzeit (1.0.4) fest codiert. Sie müssten den Quellcode von latexdiff ändern, um \cref in diese Liste aufzunehmen. Suchen Sie im Code nach den folgenden Zeilen:

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)';
};

und ändern Sie die Zeilen in der else-Klausel in

  $citpatsafe=qr/^(?:cite.*|cref)$/;
  $citpat='(?:cite\w*|nocite|cref)';

(ungetestet, sollte aber funktionieren). Für \SI funktioniert dies nicht, da der Algorithmus erwartet, dass die „Zitations“-Befehle genau ein nicht optionales Argument haben.

Das Problem mit den Zitatbefehlen entsteht durch eine Inkompatibilität mit dem ulem-Paket, und vielleicht gilt das Gleiche auch für siunitx. Als Workaround könnte ich vorschlagen, einen anderen Markup-Stil auszuprobieren (z. B. CFONT, Option -t CFONT) und dann \SI,\cref als sichere Befehle zu definieren.

Als äußerst schmutzige Problemumgehung können Sie diesen Einzeiler verwenden, um die Latexdiff-Ausgabe nachzubearbeiten, bevor Sie sie an Latex/PDFLatex weitergeben, um die \SI-Befehle zu schützen:

perl -pne 's/\\SI\{(.*?)}{(.*?)\}/\\mbox{\\SI{$1}{$2}}/g' file-diff.tex > file-diff-mod.tex

Beachten Sie, dass dadurch alle Instanzen von \SI mit einem \mbox-Befehl umgeben werden, auch die außerhalb hinzugefügter oder gelöschter Blöcke. Außerdem führt dies zu Fehlern, wenn das Argument eines \SI-Befehls verschachtelt ist, also geschweifte Klammern enthält, oder wenn sich zwischen den Argumenten von SI Leerzeichen oder Zeilenumbrüche befinden.

Antwort3

Sie können dies am LaTeX-Ende mit einem Hack beheben

\makeatletter
\AtBeginDocument{
  \let\UL@SI\SI
  \renewcommand\SI[3][]{\mbox{\UL@SI[#1]{#2}{#3}}}
}
\makeatother

das funktioniert in den meisten „einfachen“ Fällen.

verwandte Informationen