Das folgende Skript habe ich mir gebastelt, um Word-Aufzählungen in LaTeX zu konvertieren. Gerade wenn es mehrere Ebenen sind, ist es in Word einfach jedes Mal wieder nervig, die Ebenen zu koordinieren. Als das aktuelle (!) Word 2007 es dann doch geschafft hat, Einzüge zu machen, wo sie keinen Sinn machen, hat es gereicht und ordentlicher Textsatz musste her — LaTeX.
Hier das AutoIt-Skript, dass die Konvertierung besorgt:
#include <File.au3> #include <Array.au3> ; Definitions Global $lvlMatch[4] = ["^\s*\d*\.\s*(.*)", "^\s*[a-z]\.\s*(.*)", "^\s*[ivx]*\.\s*(.*)", "^\s*\d*\.\s*(.*)"] Global $data _FileReadToArray(@ScriptDir & "\input.txt", $data) _ArrayDelete($data, 0) Global $levels[UBound($data)] ; Levels herausfinden For $i = 0 To UBound($data) - 1 $levels[$i] = -1 ; Default (= no explicit match) For $j = UBound($lvlMatch) - 1 To 0 Step -1 ; zu hoch raten im Notfall If StringRegExp($data[$i], $lvlMatch[$j], 0) Then $levels[$i] = $j $data[$i] = StringRegExpReplace($data[$i], $lvlMatch[$j], "\1", 1) ContinueLoop 2 EndIf Next Next ; 0/3-Fix _ArrayInsert($data, 0, "") _ArrayInsert($levels, 0, -1) For $i = 1 To UBound($data) - 2 ; ! If (($levels[$i] = 3) And ($levels[$i + 1] = 1)) OR (($levels[$i] = 3) And (StringRegExp($data[$i - 1], "^\s*$", 0))) Then $levels[$i] = 0 EndIf Next ; Fix für Ende _ArrayAdd($data, "") _ArrayAdd($levels, 0) ; Output generieren $currLevel = -1 $output = "" For $i = 0 To UBound($data) - 1 $newLevel = $levels[$i] If $newLevel <> -1 Then ; runter if $newLevel > $currLevel Then $output = $output & "\begin{enumerate}" & @CRLF EndIf ; (u.U. mehrfach!) hoch while $newLevel < $currLevel $output = $output & "\end{enumerate}" & @CRLF $currLevel -= 1 WEnd $currLevel = $newLevel EndIf If StringRegExp($data[$i], "^\s*$", 0) = 0 Then if $levels[$i] = 0 Then $output = $output & "\item \hl{" & $data[$i] & "}" & @CRLF Else $output = $output & "\item " & $data[$i] & @CRLF EndIf else $output = $output & @CRLF EndIf Next $output &= "\end{enumerate}" ; verschönern $output = StringReplace($output, @CRLF & "\end{enumerate}", "\end{enumerate}" & @CRLF) ; schreiben $fhndl = FileOpen(@ScriptDir & "\output.txt", 2) FileWrite($fhndl, $output) FileClose($fhndl)
Das Skript erwartet eine input.txt in seinem Verzeichnis und schmeißt den LaTeX-Schnipsel in der Datei output.txt raus.
Die regulären Ausdrücke zur Erkennung der Aufzählungszeichen lassen sich oben anpassen.
Der Code steht unter der GPLv3-Lizenz.
Viel Spaß damit,
Johannes
Funktioniert super, habe es schon ausprobiert und bin froh, dass ich mein chaotisches Worddokument so leicht nach LaTeX retten konnte.
Danke, Johannes!