Seite 1 von 2
Verzeichniseintäge in einem Dokument automatisch ändern?
Verfasst: So 8. Jun 2025, 18:00
von DrMartinus
Hallo, ich muss ein Dokument bearbeiten, das ich nicht selber erstellt habe und das sehr viele Verzeichniseinträge enthält. Das ist erstmal völlig in Ordnung. Nur sind die Verzeichniseinträge etwas merkwürdig: Die Stichworte (alle sollen im Stichwortverzeichnis stehen) sind immer in dem Feld "1. Schlüssel" eingetragen, während das Feld "Eintrag" leer ist. Entsprechend verbrauchen alle Einträge zwei Zeilen, wenn das Verzeichnis automatisch erstellt wird. Das ist aber noch nicht alles: An die Einträge im Feld "1. Schlüssel" sind mehrere Doppelpunkte angefügt, immer mit Leerstellen dazwischen, von 3 bis 5, also etwa so:
, manchmal aber auch so:
. Die Doppelpunkte erscheinen natürlich auch im Stichwortverzeichnis. Ich habe schon einige hundert händisch geändert, aber ich kriege langsam wunde Finger davon.
Besteht eine Möglichkeit, die in die Tausende gehenden Verzeichniseinträge mittels eines Skripts oder Makros zu ändern? Hat jemand schon mal so was ähnliches gemacht? Es müsste der Eintrag aus "1. Schlüssel" in "Eintrag" verschoben und die " : " bzw. ": " müssten entfernt werden. Ich kann zwar programmieren, habe aber noch nichts in Sachen Makro gemacht.
ich freue mich über konstruktive Vorschläge!

Re: Verzeichniseintäge in einem Dokument automatisch ändern?
Verfasst: So 8. Jun 2025, 18:28
von miesepeter
Hallo,
du könntest die CONTENT.XML mit einem Editor (Notepad++ oder Notepadqq u. a.) öffnen und suchst dann Einträge, wie z. B.
Code: Alles auswählen
<text:alphabetical-index-mark text:string-value="Lorem: : : :"/>
Hier wäre es mit SUCHEN&ERSETZEN schon mal möglich, die Doppelpunkte und Leerzeichen zu eliminieren.
Mit Notepadqq konnte ich in einer Beispieldatei mit folgendem Suchbegriff ( ☒ reguläre Ausdrücke) alle vorkommenden Kombinationen von Doppelpunkt und Leerzeichen markieren:
Weiteres könntest du selbst herausfinden.
Wenn dir jemand noch weiter helfen soll, so wäre die Mindestanforderung, einen Beispieldatei mit einigen Seiten, die das Problem enthält, hochzuladen.
Ciao
PS: Möglicherweise ist es eleganter, Makro(s) anzuwenden. Hier muss ich aber passen. Nicht mein Gebiet.
Re: Verzeichniseintäge in einem Dokument automatisch ändern?
Verfasst: So 8. Jun 2025, 18:48
von mikele
Hallo,
magst du uns einen Ausschnitt der Datei zur Verfügung stellen? Dann ließe sich ein Makro gezielter entwickeln.
Re: Verzeichniseintäge in einem Dokument automatisch ändern?
Verfasst: Mo 9. Jun 2025, 08:53
von DrMartinus
mikele hat geschrieben: ↑So 8. Jun 2025, 18:48
Hallo,
magst du uns einen Ausschnitt der Datei zur Verfügung stellen? Dann ließe sich ein Makro gezielter entwickeln.
Das würde ich sehr gerne machen, aber die Datei enthält vertrauliche Daten, das wird schwierig bis unmöglich. Der Abschnitt, in dem nicht Vertrauliches drin ist, wurde von mir schon überarbeitet (bzw. da habe ich Verzeichniseinträge selbst und richtig gesetzt). Ich schau mal, ob ich noch was brauchbares ohne vertrauliche Daten finde. Es ist ja eine ziemlich große Datei...
Re: Verzeichniseintäge in einem Dokument automatisch ändern?
Verfasst: Mo 9. Jun 2025, 11:22
von mikele
Hallo,
ich habe mal versucht, ein solches Dokument zu erzeugen. Das gelingt allerdings nicht, da es unmöglich scheint, einen Verzeichiseintrag zu erstellen, bei dem der Eintrag leer ist. Da scheint einiges in der Datei kaputt zu sein.
Versuche mal, einen Absatz (natürlich ohne persönliche Daten) mit einem solchen Eintrag zu isolieren, alles andere zu löschen, abzuspeichern und hier hochzuladen.
Die Schlüssel per Makro zu ändern ist einfach, aber den Eintrag korrekt zu setzen ist schwieriger, denn der ist nicht nur so ein Wort, sondern ist immer an den Text gebunden. Man müsste also, wenn der Eintrag (wie auch immer) leer ist, den Schlüssel auslesen, von : befreien, dann dieses Wort im Text suchen, dort dann jeweils einen Verzeichiseintrag setzen.
Re: Verzeichniseintäge in einem Dokument automatisch ändern?
Verfasst: Mo 9. Jun 2025, 14:31
von mikele
Hallo,
ich habe mal ein bisschen gespielt.
Folgendes Makro durchsucht das gesamte Dokument nach Einträgen für das Stichwortverzeichnis. Der Eintrag sollte normalerweise dem Wort entsprechen wo der Eintrag gesetzt ist. Ist kein Wort hinterlegt, wird der (vielleicht gesetzte) alternative Text benutzt. wenn auch der nicht da ist, wird der 1. Schlüssel als Text verwendet (wobei alles nach dem ersten : entfernt wird). Die Stichworte werden um führende und folgende Leerzeichen bereinigt.
Anschließend werden zunächst alle Stichworteinträge gelöscht und dann werden für alle ursprünglich gefundenen Worte neue Stichworteinträge gesetzt.
Probier' das Ganze mal an (einer Kopie!) deiner Datei.
Code: Alles auswählen
Sub stichworte_reinigen
oDoc=ThisComponent
For i=0 to oDoc.DocumentIndexes.Count-1
oIndex=oDoc.DocumentIndexes(i)
'Test, ob Stichwortverzeichnis
If oIndex.supportsService("com.sun.star.text.DocumentIndex") Then
'Durchlauf durch alle Stichworte
'Stichworte erfassen und alte Einträge entfernen
n = ubound(oIndex.DocumentIndexmarks)
anz=-1
Dim aStichworte()
For k=n to 0 Step -1
oMark=oIndex.DocumentIndexMarks(k)
key1=oMark.PrimaryKey
key2=oMark.SecondaryKey
eintrag=trim(oMark.Anchor.String)
alternativ=oMark.AlternativeText
'Stichwort lesen: aus Text, sonst Alternativtext, sonst 1. Schlüssel (bereinigt um :)
if trim(eintrag)="" then
if trim(alternativ)<>"" then
eintrag=trim(alternativ)
else
eintrag=trim(split(key1,":")(0))
end if
end if
'Stichworte ohne Duplikate in Array schreiben
z=0
do while z<=anz and eintrag<>""
if aStichworte(z)=eintrag then
eintrag=""
end if
z=z+1
loop
if eintrag<>"" then
anz=anz+1
Redim Preserve aStichworte(anz)
aStichworte(anz)=eintrag
end if
'Verzeichniseintrag löschen
oMark.Anchor.Text.removeTextContent(oMark.Anchor.DocumentIndexMark)
Next
msgbox n+1 & " Einträge gelöscht"
msgbox anz+1 & " Stichworte gefunden"
'Stichwortverzeichnis aktualisieren (enthält nun gerade nichts mehr)
oIndex.update
'Stichworte neu setzen
oDescriptor = oDoc.createSearchDescriptor()
gesetzt=0
for z=0 to anz
With oDescriptor
.SearchString = aStichworte(z)
End With
'Finde alle Wortvorkommen und setze jeweils einen Verzeichniseintrag
oFound = oDoc.findFirst(oDescriptor)
Do While Not IsNull(oFound)
oMark = oDoc.createInstance("com.sun.star.text.DocumentIndexMark")
oCurs = oFound.getText().createTextCursorByRange(oFound)
oFound.Text.insertTextContent (oCurs,oMark,True)
gesetzt = gesetzt+1
oFound = oDoc.findNext(oFound.End, oDescriptor)
Loop
next
msgbox gesetzt & " Verzeichniseinträge gesetzt"
'Stichwortverzeichnis aktualisieren
oIndex.update
End If
Next
End Sub
Re: Verzeichniseintäge in einem Dokument automatisch ändern?
Verfasst: Mo 9. Jun 2025, 16:35
von mikele
Hallo,
und das Ganze mit Python
Code: Alles auswählen
from apso_utils import msgbox
def stichworte_reinigen():
oDoc=XSCRIPTCONTEXT.getDocument()
for oIndex in oDoc.DocumentIndexes:
#Test, ob Stichwortverzeichnis
if oIndex.supportsService("com.sun.star.text.DocumentIndex"):
#Durchlauf durch alle Stichworte
#Stichworte erfassen und alte Einträge entfernen
n=len(oIndex.DocumentIndexMarks)
aStichworte=set()
for oMark in oIndex.DocumentIndexMarks[::-1]:
key1=oMark.PrimaryKey
key2=oMark.SecondaryKey
eintrag=oMark.Anchor.String.strip()
alternativ=oMark.AlternativeText.strip()
#Stichwort lesen: aus Text, sonst Alternativtext, sonst 1. Schlüssel (bereinigt um :)
if eintrag == "":
eintrag=alternativ
if eintrag == "":
eintrag=key1.split(":")[0].split()
#Stichworte ohne Duplikate in Set schreiben
if eintrag != "":
aStichworte.add(eintrag)
#Verzeichniseintrag löschen
oMark.Anchor.Text.removeTextContent(oMark.Anchor.DocumentIndexMark)
oIndex.update()
msgbox(f"{n} Einträge gelöscht")
msgbox(f"{len(aStichworte)} Stichworte gefunden")
#Stichwortverzeichnis aktualisieren (enthält nun gerade nichts mehr)
#Stichworte neu setzen
oDescriptor = oDoc.createSearchDescriptor()
gesetzt=0
for wort in aStichworte:
oDescriptor.SearchString = wort
#Finde alle Wortvorkommen und setze jeweils einen Verzeichniseintrag
oFound = oDoc.findFirst(oDescriptor)
while oFound is not None:
oMark = oDoc.createInstance("com.sun.star.text.DocumentIndexMark")
oCurs = oFound.getText().createTextCursorByRange(oFound)
oFound.Text.insertTextContent (oCurs,oMark,True)
gesetzt += 1
oFound = oDoc.findNext(oFound.End, oDescriptor)
#Stichwortverzeichnis aktualisieren
oIndex.update()
msgbox(f"{gesetzt} Verzeichniseinträge gesetzt")
Re: Verzeichniseintäge in einem Dokument automatisch ändern?
Verfasst: Mo 9. Jun 2025, 19:50
von juribel
@DrMartinus: Leider hast du nicht angegeben, unter welchem Betriebssystem du arbeitest. Windows? Dann müsstest du für externe Skriptlösungen wohl Python oder Perl oder was immer nachinstallieren. Oder ist Python als Makrosprache in LibreOffice bereits enthalten?
@miesepeter: Walls DrMartinus eine solche Lösung in Betracht zieht, ist es auf jeden Fall einfacher, die LibreOffice-Datei im Format .fodt zu speichern und dann diese mit einem Skript zu bearbeiten. fodt-Dateien sind einfache (naja

) flache Textdateien ohne interne Ordnerhierarchien wie .odt-Dateien, und müssen auch nicht aus- und wieder eingepackt werden. Da sie nicht gezippt sind, sind sie halt nur ein bisschen

grösser als .odt-Dateien.
Re: Verzeichniseintäge in einem Dokument automatisch ändern?
Verfasst: Mo 9. Jun 2025, 20:27
von mikele
Hallo,
Oder ist Python als Makrosprache in LibreOffice bereits enthalten?
So ist es

und mit der Erweiterung apso gut nutzbar.
Re: Verzeichniseintäge in einem Dokument automatisch ändern?
Verfasst: So 15. Jun 2025, 11:38
von brainstuff2
Der Miesepeter hat Dir nicht gesagt, wo Du die CONTENT.XML Datei findest ... ich weiss auch nicht, ob er die so findet, wie ich sie finde ... und ob er die gleiche Datei meint. Falls dass Du das nicht findest, gehe wie folgendermassen vor:
- mache Dir erst einmal eine Kopie von der Datei, die Du bearbeiten willst, damit nichts kaputtgeht, wenn etwas nicht klappt.
- dann änderst Du die Endung von dem Dateinamen von .odt auf zum Beispiel .odt1
= irgendwas anderes wie eine bestehende Dateiendung. Wenn Du dann auf die Datei klickst, wird sie, wie eine ZIP Datei geöffnet ... das ist dann ein Ordner, in dem die CONTENT.XML zu finden ist. Die kannst Du dann herauskopieren und bearbeiten und dann später wieder reinkopieren.
Ob das auf dem Explorer geht, habe ich noch nicht ausprobiert (den verwende ich nur extrem selten) ich nehme dazu Totalcommander der behandelt dann so eine Datei mit falscher Endung automatisch wie so einen Ordner, von einer ZIP-Datei.
Es ist ein ganz extrem gutes Feature, von LibreOffice, dass die Dateien anscheinend komprimierte Ordner sind.
Danke
brainstuff2