Forum: PC-Programmierung LaTeX File parsen


von Oscon (Gast)


Lesenswert?

Hallo,
ich möchte in C++ folgendes tun:

gegeben sei eine LaTeX-Datei main.tex. Dort werden per \input{} weitere 
Files includiert, und diese können wiederum mit \input{} weiteres 
includieren. Was ich jetzt tun möchte, ist, die Struktur dieser 
Includierungen heraus zu finden und in einem Baum abzuspeichern. Ich 
habe mir überlegt, einfach mittels Rekursion ein File nach \input{} zu 
durchsuchen, und dann die inkludierten Files ebenso. Aber das Problem 
ist dann ja: wenn im normalen Text irgendwo auch \input vorkommt, dann 
würde mein "Parser" ja eine vermeintliche Datei finden... also, ganz so 
einfach scheint es nicht zu sein. Habt ihr kluge Ideen?

von Rolf (Gast)


Lesenswert?

Fang doch erstmal einfach an: Finde ein input in einer Datei und weise 
den Dateinamen einer Variablen zu.

Wenn das läuft, kommt der Rest über Rekursion ganz einfach angeflogen.

von Frank K. (fchk)


Lesenswert?

Nicht nur Dein Parser würde eine "Datei" finden, der von TeX würde 
genauso reagieren.

Also alles im grünen Bereich.

fchk

von Yalu X. (yalu) (Moderator)


Lesenswert?

Frank K. schrieb:
> Nicht nur Dein Parser würde eine "Datei" finden, der von TeX würde
> genauso reagieren.

Auch dann, wenn \input{datei} in einer verbatim-Umgebung steht?

Wobei man diesen Fall auch noch relativ leicht abfangen könnte. Damit
hätte man wahrscheinlich 99,99% aller Fälle abgedeckt. Wenn's 100% sein
sollen, bleibt wohl nicht viel anderes übrig, als den Original-Parser zu
verwenden, dessen Quellcode ja öffentlich ist.

von Oscon (Gast)


Lesenswert?

Yalu,

genau das dachte ich auch.
Ich versuche jetzt mal, die Datei Zeilenweise einzulesen. Wenn in einer 
Zeile \begin{verbatim} steht, setze ich ein Flag, und lese so lange 
weiter, bis \end{verbatim} steht, und resete dann das Flag.
Und nur wenn das Flag nicht gesetzt ist, suche ich nach \input. Kann man 
das so machen?

Hmm ich werde mir mal den originalen Source ansehen.

von Läubi .. (laeubi) Benutzerseite


Lesenswert?

Oscon schrieb:
> kann man
> das so machen?
Man kann vieles machen, die Frage ist: Lohnt der Aufwand? Wie oft hat 
man bitte diesen Fall? Und wie "schlimm" ist es wenn in einem von 1000 
Files mal ein falsches include angezeigt wird?

von Oscon (Gast)


Lesenswert?

Stimmt, ja da hast du recht.
Noch eine Frage zur Vorgehensweise: ich hätte das jetzt mit einer 
rekursiven Funktion erledigt. So kann ich den Baum unglaublich elegant 
aufbauen und es wird alles sehr einfach.
Frage: darf man das so machen? Im Prinzip bin ich ein Gegner der 
rekursion; normalerweise programmiere ich Mikrocontroller und dort 
sollte man das ja aufgrund des begrenzten Stack nicht machen...

von D. I. (Gast)


Lesenswert?

Nein Rekursion wird mit Geldstrafe zu 90 Tagessätzen oder alternativ mit 
bis zu 2 Jahren Freiheitsstrafe geahndet. Lass dich dabei nicht 
erwischen!

von Frank M. (aktenasche)


Lesenswert?

rekursion ist halt ultraschlecht lesbar, aber manche probleme lassen 
sich dadurch sehr elegant lösen

von Jürgen W. (lovos)


Lesenswert?

Du solltest den (fehlerhaften) Fall abfangen, dass eine LaTex-Datei sich 
selbst mit 'include' einfügt ("inkludiert").
Ansonsten stürzt das rekursive Programm ab.

von Yalu X. (yalu) (Moderator)


Lesenswert?

Wenn das Programm "vernünftig" angewandt wird, also mit realistischen
LaTeX-Dokumenten, sollte die Rekursion kein Problem darstellen, da der
Programmstack auf PCs typischerweise ein paar Megabytes groß ist und bei
Bedarf auch noch vergrößert werden kann.

Wenn der Anwender das Programm aber auf Herz und Nieren testen wird,
würde ich auf die Rekursion verzichten und stattdessen dynamischen
Speicher verwenden. Auch der Speicher wird irgendwann überlaufen, das
ist von der Software aber leichter zu erkennen, so dass sich das
Programm dann kontrolliert mit Fehlermeldung beenden kann.

Ich würde das Ganze auch nicht als Baum, sondern als allgemeinen
gerichteten Graphen darstellen. Das wird übersichtlicher, wenn eine
Datei mehrfach inkludiert wird, die ihrerseits weitere Dateien
inkludiert. Dann enthält der Baum mehrere gleiche Unterbäume, was ihn
unnötig aufbläht. Im gerichteten Graphen hingegen taucht jede Datei
genau einmal auf. Zudem können damit auch die von Jürgen angesprochenen
rekursiven Inklusionen problemlos dargestellt werden. Da bei der
Generierung des gerichteten Graphen ein rekursiver Algorithmus nicht
einfacher als ein iterativer ist, stellt sich die Frage nach der
Legitimität der Rekursion gar nicht erst.

In den meisten LaTeX-Dokumenten wird jede Datei nur einmal inkludiert,
so sich der gerichtete Graph nicht vom Baum unterscheiden wird. Da die
Programmierung des Graphen nicht schwieriger ist, würde ich diesen
vorziehen.

Lediglich die grafische Darstellung des Graphen wird aufwendiger, aber
dafür gibt es ja bspw. das Graphviz-Paket.

von Georg (Gast)


Lesenswert?

es soll ja noch dinge wie grep, sed und awk geben mit denen man 
textdateien parsen kann, wenn man kann

auch graphviz wäre recht simpel um eine darstellung zu erzeugen weil man
einfach schreiben kann: a -> b und a -> c , usw
da braucht man keinen baum basteln das macht das tool schon

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.