
Emlatexdiff
, o padrão é proteger os comandos de citação com um \mbox
para que sejam impressos corretamente no estilo padrão. Como posso adicionar outros comandos a serem protegidos por um \mbox
, como \SI{}{}
ou \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}
Saída de latexdiff --append-safecmd="SI"
(a compilação falha, mas a adição de um \mbox
comando aos siunitx
comandos é bem-sucedida):
% 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}
Responder1
Outros comandos são tratados de forma equivalente aos comandos de citação se definidos na seguinte opção:
--append-mboxsafecmd="cmd1,cmd2,..."
(requer latexdiff versão 1.1.0 ou superior). Se o pacote siunitx for detectado, isso será feito automaticamente para arquivos \SI
.
Responder2
Não existe uma maneira fácil de fazer isso. Os comandos de citação estão atualmente (1.0.4) codificados. Você teria que modificar o código fonte do latexdiff para incluir \cref nesta lista. Procure as seguintes linhas no 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)';
};
e altere as linhas na cláusula else para
$citpatsafe=qr/^(?:cite.*|cref)$/;
$citpat='(?:cite\w*|nocite|cref)';
(não testado, mas deve funcionar). Para \SI, isso não funcionará, pois o algoritmo espera que os comandos de 'citação' tenham exatamente um argumento não opcional.
O problema com os comandos de citação surge de uma incompatibilidade com o pacote ulem, e talvez o mesmo seja verdade para o siunitx. Como solução alternativa, eu poderia sugerir tentar um estilo de marcação diferente (por exemplo, CFONT, opção -t CFONT) e então definir \SI,\cref como comandos seguros.
Como uma solução alternativa extremamente suja, use esta linha única para pós-processar a saída latexdiff antes de alimentá-la em latex/pdflatex para proteger os comandos \SI:
perl -pne 's/\\SI\{(.*?)}{(.*?)\}/\\mbox{\\SI{$1}{$2}}/g' file-diff.tex > file-diff-mod.tex
Observe que isso envolverá todas as instâncias de \SI com um comando \mbox, incluindo aquelas fora dos blocos adicionados ou excluídos. Além disso, isso resultará em erros se o argumento para qualquer comando \SI estiver aninhado, ou seja, contiver chaves, ou se houver espaços ou novas linhas entre os argumentos de SI
Responder3
Você pode resolver isso no final do LaTeX com uma espécie de hack
\makeatletter
\AtBeginDocument{
\let\UL@SI\SI
\renewcommand\SI[3][]{\mbox{\UL@SI[#1]{#2}{#3}}}
}
\makeatother
que funcionará para a maioria dos casos 'simples'.