🙏 Bitte helfen Sie uns das LibreOffice Forum zu erhalten. 🙏
Ihre Spende wird für die Deckung der laufenden Kosten sowie den Erhalt und Ausbau 🌱 des LibreOffice Forums verwendet.

🍀 Wir hoffen auf Ihre Unterstützung - vielen Dank!🍀

❤️ DANKE >> << DANKE ❤️

>> Dank Ihrer Unterstützung -> Keine Werbung für alle registrierten LibreOffice-Forum User! <<
🤗 Als Dankeschön werden Sie im Forum als LO-SUPPORTER gekennzeichnet. 🤗

Verzeichniseintäge in einem Dokument automatisch ändern?

WRITER hat alles, was Sie von einer modernen, voll ausgestatteten Textverarbeitung erwarten.
DrMartinus
Beiträge: 41
Registriert: So 10. Jul 2011, 06:35

Verzeichniseintäge in einem Dokument automatisch ändern?

Beitrag von DrMartinus » So 8. Jun 2025, 18:00

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:

Code: Alles auswählen

Eintrag : : : : : 
, manchmal aber auch so:

Code: Alles auswählen

Eintrag: : : :
. 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! :)

Benutzeravatar
miesepeter
* LO-Experte *
Beiträge: 2135
Registriert: So 19. Dez 2010, 18:16
Wohnort: Bayern

Re: Verzeichniseintäge in einem Dokument automatisch ändern?

Beitrag von miesepeter » So 8. Jun 2025, 18:28

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:

Code: Alles auswählen

(: )+
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.

mikele
* LO-Experte *
Beiträge: 1929
Registriert: Mo 1. Aug 2011, 20:51

Re: Verzeichniseintäge in einem Dokument automatisch ändern?

Beitrag von mikele » 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.
Gruß,
mikele

DrMartinus
Beiträge: 41
Registriert: So 10. Jul 2011, 06:35

Re: Verzeichniseintäge in einem Dokument automatisch ändern?

Beitrag von DrMartinus » Mo 9. Jun 2025, 08:53

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...

mikele
* LO-Experte *
Beiträge: 1929
Registriert: Mo 1. Aug 2011, 20:51

Re: Verzeichniseintäge in einem Dokument automatisch ändern?

Beitrag von mikele » Mo 9. Jun 2025, 11:22

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.
Gruß,
mikele

mikele
* LO-Experte *
Beiträge: 1929
Registriert: Mo 1. Aug 2011, 20:51

Re: Verzeichniseintäge in einem Dokument automatisch ändern?

Beitrag von mikele » Mo 9. Jun 2025, 14:31

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
Gruß,
mikele

mikele
* LO-Experte *
Beiträge: 1929
Registriert: Mo 1. Aug 2011, 20:51

Re: Verzeichniseintäge in einem Dokument automatisch ändern?

Beitrag von mikele » Mo 9. Jun 2025, 16:35

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")

Gruß,
mikele

juribel
Beiträge: 234
Registriert: Mi 6. Mai 2020, 15:48

Re: Verzeichniseintäge in einem Dokument automatisch ändern?

Beitrag von juribel » Mo 9. Jun 2025, 19:50

@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.

mikele
* LO-Experte *
Beiträge: 1929
Registriert: Mo 1. Aug 2011, 20:51

Re: Verzeichniseintäge in einem Dokument automatisch ändern?

Beitrag von mikele » Mo 9. Jun 2025, 20:27

Hallo,
Oder ist Python als Makrosprache in LibreOffice bereits enthalten?
So ist es 8-) und mit der Erweiterung apso gut nutzbar.
Gruß,
mikele

brainstuff2
Beiträge: 175
Registriert: Do 9. Jul 2020, 12:25

Re: Verzeichniseintäge in einem Dokument automatisch ändern?

Beitrag von brainstuff2 » So 15. Jun 2025, 11:38

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


An alle, die das LibreOffice-Forum gern nutzen und unterstützen wollen:


Bitte helfen Sie uns mit 7 Euro pro Monat.
Durch Ihren Beitrag tragen Sie dazu bei, unsere laufenden Kosten für die kommenden Monate zu decken.
Unkompliziert per Kreditkarte oder PayPal.
Als ein kleines Dankeschön werden Sie im LO-Forum als SUPPORTER gekennzeichnet.



Antworten