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
-
#!/bin/bash
-
-
# This script takes two svn repository revisions and creates two big files,
-
# both monolithic latex files with all includes and inputs merged into one large file.
-
# The script then creates one latex file with the differences highlighted.
-
# Other scripts used are latexdiff (see http://tug.ctan.org/tex-archive/support/latexdiff)
-
# and latexpand (see http://www.ctan.org/pkg/latexpand).
-
-
# To accomplish this task, two concurrent repository revisions are needed, one with head revision, one with a custom revision.
-
# The user executing this script has to have access to the subversion repositories and svn commands.
-
-
# Usage: createLatexSVNDiff rev
-
# where ‚rev‘ is the revision number of the older repository, e.g. createLatexSVNDiff 42
-
# The repositorys used are hardcoded into this file, you have to edit them up to your needs.
-
# (Together with the name of the main latex file, that includes other.)
-
-
# Repository variables
-
mainTex=file.tex
-
oldRep=/full/path/to/2nd/repo/
-
newRep=/full/path/to/working/copy/
-
pathToScript=$(pwd)
-
-
echo $0 will update $newRep to head revision and $oldRep to revision $1
-
-
cd $oldRep
-
svn up -r $1
-
cd $newRep
-
svn up
-
-
echo creating monolithic latex files
-
cd $oldRep
-
$pathToScript/latexpand.pl $oldRep$mainTex > old.tex
-
mv old.tex $pathToScript/old.tex
-
cd $newRep
-
$pathToScript/latexpand.pl $newRep$mainTex > new.tex
-
mv new.tex $pathToScript/new.tex
-
-
echo creating diff file
-
cd $pathToScript
-
latexdiff old.tex new.tex > $mainTex
-
rm old.tex
-
rm new.tex
-
-
echo moving diff file to repository and committing it
-
mv $mainTex $newRep/$mainTex.diff
-
cd $newRep
-
svn ci $mainTex.diff -m "$mainTex.diff updated by $0"
Das Script kann heruntergeladen werden: createLatexSVNDiff.sh