Fortschritt von LaTex Projekten anschaulich machen

Wenn man längere Texte mit LaTex schreibt und zu unterschiedlichen Zeitpunkten einen Zwischenstand erzeugt, dann kann es oft wünschenswert sein, diesen Zwischenstand mit einem anderen zu vergleichen.
Um dies zu erreichen kann man das Tool latexdiff benutzen (http://tug.ctan.org/tex-archive/support/latexdiff). Dieses vergleicht zwei LaTex Dateien und erzeugt aus ihnen eine neue LaTex Datei, die die Änderungen kenntlich macht.

Jetzt gibt es aber oft das Szenario, dass das LaTex Projekt nicht in einer einzelnen Datei gepflegt wird, sondern in mehreren Dateien, die mittels include oder input in die Hauptdatei eingebunden werden.
Um solche Projekte dennoch mit latexdiff verarbeiten zu können, müssen sie zuerst in eine einzelne Datei kopiert werden, dafür gibt es ebenfalls ein Tool, nämlich latexpand (http://www.ctan.org/pkg/latexpand).

Das dritte Programm in dieser Reihe ist ein Versionierungssystem, in meinem Fall Subversion.
Um also den Fortschritt zwischen zwei Revisionen des LaTex Projektes in der resultierenden PDF Datei zu veranschaulichen, müssen alle .tex Dateien in ein Dokument kopiert werden (zwei Mal, ein Mal pro Revision), dazu müssen noch zwei unterschiedliche Revisionen ausgecheckt werden, und diese beiden Dokumente dann miteinander verglichen werden, damit das resultierende Dokument erstellt werden kann.
Per Hand ist das sehr viel Arbeit, daher habe ich ein Script geschrieben, dass diese Arbeit auf die Eingabe einer Revisionsnummer reduziert.

Das Script

Um das Script zu nutzen, müssen einige Voraussetzungen erfüllt sein:

  • Linux System
  • LaTex
  • Subversion
  • Zugriff auf alle Dateien der Revisionen
  • Zugriff auf SVN
  • Das Script latexpand.pl von http://www.ctan.org/pkg/latexpand muss im selben Verzeichnis sein wie dieses Script.

Das Script selbst muss nur ein wenig angepasst werden:

  • mainTex – der Name der Hauptdatei im LaTex Projekt
  • newRep – Pfad zum aktuellen Repository (working copy)
  • oldRep – Pfad zum älteren Repository (beliebige Revision, das Script aktualisiert auf die gewünschte Revision)

Achtung! Das Script nutzt Update und Commit von SVN. Damit es funktioniert und die working copy von SVN nicht ändert, sollte das Repository in einem anderen Verzeichnis erneut ausgecheckt werden, dies muss vor der Ausführung des Scripts geschehen, da es ein zweites Verzeichnis voraussetzt. Auch sollte das Script in einem eigenen Verzeichnis ausgeführt werden, um Dateinamenskonflikte zu vermeiden.
Das Script aktualisiert zum Schluß das SVN Repository, fügt die Datei aber nicht hinzu, dies muss einmalig manuell geschehen. Der Name der neuen Datei ist AlterDateiname.diff (also zum Beispiel main.tex.diff).

Eine letzte Hürde gibt es noch, sollte das Paket Hyperref genutzt werden, funktioniert es nicht auf Anhieb, es gibt zwei mögliche Lösungen:
Entweder das Paket Hyperref und alle, die es benutzen, auskommentieren (vor Nutzung des Scripts), oder in der resultierenden .tex.diff Datei die Zeilen

providecommand{DIFadd}[1]{{protectcolor{blue}uwave{#1}}} %DIF PREAMBLE
providecommand{DIFdel}[1]{{protectcolor{red}sout{#1}}} %DIF PREAMBLE

ersetzen durch

providecommand{DIFadd}[1]{{protectcolor{blue}#1}} %DIF PREAMBLE
providecommand{DIFdel}[1]{{protectcolor{red}protectscriptsize{#1}}}

(nach Nutzung des Scripts). Grund ist die Inkompatibilität des latexdiff Scripts mit dem Hyperref Package.

Nutzung des Scripts: ./createLatexSVNDiff.sh rev
Wobei rev die ältere Revisionsnummer ist, zum Beispiel: ./createLatexSVNDiff 42

Code Highlight von http://quickhighlighter.com

  1. #!/bin/bash
  2.  
  3. # This script takes two svn repository revisions and creates two big files,
  4. # both monolithic latex files with all includes and inputs merged into one large file.
  5. # The script then creates one latex file with the differences highlighted.
  6. # Other scripts used are latexdiff (see http://tug.ctan.org/tex-archive/support/latexdiff)
  7. # and latexpand (see http://www.ctan.org/pkg/latexpand).
  8.  
  9. # To accomplish this task, two concurrent repository revisions are needed, one with head revision, one with a custom revision.
  10. # The user executing this script has to have access to the subversion repositories and svn commands.
  11.  
  12. # Usage: createLatexSVNDiff rev
  13. # where ‚rev‘ is the revision number of the older repository, e.g. createLatexSVNDiff 42
  14. # The repositorys used are hardcoded into this file, you have to edit them up to your needs.
  15. # (Together with the name of the main latex file, that includes other.)
  16.  
  17. # Repository variables
  18. mainTex=file.tex
  19. oldRep=/full/path/to/2nd/repo/
  20. newRep=/full/path/to/working/copy/
  21. pathToScript=$(pwd)
  22.  
  23. echo $0 will update $newRep to head revision and $oldRep to revision $1
  24.  
  25. cd $oldRep
  26. svn up -r $1
  27. cd $newRep
  28. svn up
  29.  
  30. echo creating monolithic latex files
  31. cd $oldRep
  32. $pathToScript/latexpand.pl $oldRep$mainTex > old.tex
  33. mv old.tex $pathToScript/old.tex
  34. cd $newRep
  35. $pathToScript/latexpand.pl $newRep$mainTex > new.tex
  36. mv new.tex $pathToScript/new.tex
  37.  
  38. echo creating diff file
  39. cd $pathToScript
  40. latexdiff old.tex new.tex > $mainTex
  41. rm old.tex
  42. rm new.tex
  43.  
  44. echo moving diff file to repository and committing it
  45. mv $mainTex $newRep/$mainTex.diff
  46. cd $newRep
  47. svn ci $mainTex.diff -m "$mainTex.diff updated by $0"

Das Script kann heruntergeladen werden: createLatexSVNDiff.sh