5

I was wondering if it is possible to have latexdiff ignore all lstlistings from my documents when finding diffs. Most of my listings contain special characters. That works rather nicely within an lstlisting but when latexdiff tries to compare, such listings end up outside of the lstlisting and therefore need to be escaped manually. Is there a way to go around that?

1 Answer 1

3

You can use the approach given in https://tex.stackexchange.com/a/73649/15925 to tell latexdiff to ignore the lstlisting environment. Placing

 PICTUREENV=(?:picture|DIFnomarkup|lstlisting)[\w\d*@]*

in ld.cfg and running latexdiff -c ld.cfg j1.tex j2.tex >diff.tex where j1.tex is

\documentclass{article}

\usepackage{listings}

\begin{document}

Text.

\begin{lstlisting}
  for $a do
\end{lstlisting}

Text.

\end{document}

and j2.tex is

\documentclass{article}

\usepackage{listings}

\begin{document}

Text changed.

\begin{lstlisting}
  for $a do y
\end{lstlisting}

Text.

\end{document}

produces diff.tex containing:

\documentclass{article}
%DIF LATEXDIFF DIFFERENCE FILE
%DIF DEL j1.tex   Wed Oct 16 16:53:10 2013
%DIF ADD j2.tex   Wed Oct 16 16:53:33 2013

\usepackage{listings}
%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}

Text \DIFaddbegin \DIFadd{changed}\DIFaddend .

\DIFdelbegin %DIFDELCMD < \begin{lstlisting}
%DIFDELCMD <   for $a do
%DIFDELCMD < \end{lstlisting}
%DIFDELCMD < %%%
\DIFdelend \DIFaddbegin \begin{lstlisting}
  for $a do y
\end{lstlisting}
\DIFaddend 

Text.

\end{document}

and compiling to give:

Sample output

As you can see changes in the text are highlighted, whereas the code is just that from the second file.

EDIT As asmeurer points out, you can avoid a config file by writing the command line

latexdiff --config='PICTUREENV=(?:picture|DIFnomarkup|lstlisting)[\w\d*@]*'

and this may be particularly relevant in a script or a makefile.

4
  • You don't have to create a config file. You can also just use latexdiff -c 'PICTUREENV=(?:picture|DIFnomarkup|lstlisting)[\w\d*@]*'.
    – asmeurer
    Commented Oct 6, 2016 at 21:01
  • @asmeurer True, but I prefer storing the option in a reusable config file. Commented Oct 7, 2016 at 10:49
  • If you are calling latexdiff from a script or a Makefile, it's more convenient to not have an unnecessary separate file.
    – asmeurer
    Commented Oct 7, 2016 at 17:52
  • @asmeurer Good point - I have added you one line version to the answer. Commented Oct 8, 2016 at 14:50

You must log in to answer this question.

Not the answer you're looking for? Browse other questions tagged .