¿Cómo proteger los comandos de mbox en latexdiff?

¿Cómo proteger los comandos de mbox en latexdiff?

Enlatexdiff, el valor predeterminado es proteger los comandos de citas con un \mboxpara que se impriman correctamente en el estilo predeterminado. ¿Cómo puedo agregar otros comandos para que estén protegidos por un \mbox, como \SI{}{}o \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}

Salida de latexdiff --append-safecmd="SI"(la compilación falla, pero se logra agregar un \mboxalrededor de los siunitxcomandos):

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

Respuesta1

Otros comandos se tratan de manera equivalente a los comandos de citas si se definen en la siguiente opción:

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

(requiere latexdiff versión 1.1.0 o superior). Si se detecta el paquete siunitx, esto se hace automáticamente para \SI.

Respuesta2

No existe una manera fácil de hacer esto. Los comandos de citas están actualmente codificados (1.0.4). Tendría que modificar el código fuente de latexdiff para incluir \cref en esta lista. Busque las siguientes líneas en el código:

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

y cambie las líneas en la cláusula else a

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

(no probado, pero debería funcionar). Para \SI, esto no funcionará, ya que el algoritmo espera que los comandos de 'cita' tengan exactamente un argumento no opcional.

El problema con los comandos de citas surge de una incompatibilidad con el paquete ulem, y quizás lo mismo ocurra con siunitx. Como solución alternativa, podría sugerir probar con un estilo de marcado diferente (por ejemplo, CFONT, opción -t CFONT) y luego definir \SI,\cref como comandos seguros.

Como solución alternativa extremadamente sucia, use esta frase para posprocesar la salida de latexdiff antes de enviarla a latex/pdflatex para proteger los comandos \SI:

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

Tenga en cuenta que esto rodeará todas las instancias de \SI con un comando \mbox, incluidas aquellas fuera de los bloques agregados o eliminados. Además, esto producirá errores si el argumento de cualquier comando \SI está anidado, es decir, contiene llaves, o si hay espacios o nuevas líneas entre los argumentos de SI.

Respuesta3

Puedes solucionar esto al final de LaTeX con una especie de truco.

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

que funcionará para la mayoría de los casos "simples".

información relacionada