TeX-Dokumentstrukturen visualisieren mit Graphviz und Python
Hier ein Code-Schnipsel, um die Inputs und Includes von LaTeX-Dokumenten zu visualisieren. Ist noch ein wenig rudimentär und hardcoded, in den nächsten Tagen werde ich den Code mal in ein Github-Repo packen und dann ein wenig aufräumen. Aktuell wird eine Datei Master.tex
erwartet, eine Graph.dot
Datei wird als Output geschrieben. Das Skript geht rekursiv durch die TeX-Dateien durch und sucht nach \input
, \include
, \includegraphics
und \lstinputlisting
Befehlen.
# -*- coding: utf-8 -*- import re nodes = [] # which commands indicate following commandsToFollow = ('input', 'include') def find_ext_references(somefile): with open(somefile) as file: filecontent = file.readlines() for i in filecontent: search_results = re.findall(r"(\\)(includegraphics|include|lstinputlisting|input)(\[?.*\]?{)(.+?)(})", i) for j in search_results: print(j) nodes.append((somefile, j[3], j[1])) if j[1].endswith(commandsToFollow): find_ext_references(j[3]+'.tex') # assume that no extension is used for input/include find_ext_references('Master.tex') print(nodes) if len(nodes)>0: with open('graph.dot','w') as output: output.write('digraph IncludesInputs {\n') output.write('node [shape=box];\n\n') for k in nodes: if k[2].endswith(commandsToFollow): output.write('"'+k[0] + '"->"' + k[1] + '.tex" [color="green"];\n') elif k[2].endswith('graphics'): output.write('"'+k[0] + '"->"' + k[1] + '" [color="blue"];\n') elif k[2].endswith('listing'): output.write('"'+k[0] + '"->"' + k[1] + '" [color="red"];\n') output.write('}') |
Übersetzt man die Graph.dot
dann mit der dot.exe
aus Graphviz, so erhält man für ein kleines Beispiel den folgenden Graphen. (Beispielaufruf: dot -Tpng Graph.dot
)