Seite 1 von 3
Hyperlink für Stichworte
Verfasst: Mi, 29.03.2023 16:40
von 15Albert
Hyperlink für Stichworte.
Es gibt einen Button für Hyperlink.
Der funktioniert ganz einfach dem Inhaltsverzeichnis.
Dort ist er einfach da ohne dass ich was machen muss.
Was muss ich machen um den Hyperlink auch bei den Stichworten zu generieren?
Ich habe noch von Zyklade irgendwas.
Der konnte aber wohl nicht mit BAS arbeiten.
Das könnte ich noch hochladen.
Albert.
Re: Hyperlink für Stichworte
Verfasst: Mi, 29.03.2023 18:04
von 15Albert
Ich bekomme eine Nachricht ohne wirklich Antwort,
Warum?
Albert
Re: Hyperlink für Stichworte
Verfasst: Do, 30.03.2023 14:01
von quotsi
(Ich bin oder war Zyklade, aber ich kann mich nicht erinnern, dass ich einen erfolgreichen Beitrag zu diesem Wunsch geschrieben haben soll)
Tatsache ist, dass die Möglichkeit zum Hyperlink (zumindest bei LO, was ich derzeit bevorzuge) nur für das Inhaltsverzeichnis gegeben ist.
Habe soeben experimentiert, aber auch keine schnelle Lösung für das Stichwortverzeichnis gefunden.
Man müßte schauen, ob man an der Mustervorlage für die Einträge der Stichworte was ändern kann...
Mein Beitrag bezüglich Stichwortverzeichnis war, wie man aus einem konventionellen Stichwortverzeichnis die Daten gewinnen kann, um sie in eine Konkordanzdatei zu überführen, die man einfacher bearbeiten und dann später als Grundlage für ein neues Stichwortverzeichnis verwenden kann . Diesen Geistesblitz habe ich in diesem Forum unter der Abteilung Wissensarchiv hinterlegt.
Re: Hyperlink für Stichworte
Verfasst: Fr, 31.03.2023 10:20
von 15Albert
Hallo Quosti,
das hat schon in etwa funktioniert.
War aber nach meiner Ansicht sehr kompliziert.
Was mir fehlt ist eine Bas, so dass das in einem Zuge abläuft.
Ich schicke dir mal was ich noch habe.
Ich wäre Dir sehr dankbar, wenn Du das im obigen sinne fertig machtest.
Wenn das ein hoher Aufwand ist, dann meldet dich privat.
Ich kann dir auch das Muster schicken.
Ich kenne auch deinen Klarnamen, den werde ich hier nicht bekannt geben.
Albert
Re: Hyperlink für Stichworte
Verfasst: Sa, 01.04.2023 09:04
von quotsi
Ja, das ist von mir. Aber das betrifft genau die Stichwortsuche, um eine Konkordanzdatei zu erstellen, was ja auch aus der Namensgebung der 4 eingepackten Makros hervorgeht. Genau das Problem und der Weg zur Lösung wird in der von mir zitierten Quelle beschrieben.
Aber da wird kein Weg beschrieben, wie man "Hyperlinks" für jede Seite einzeln (!) und gezielt erhält.
Und leider geht mein Weg auch zusehens abwärts, wie bei allen. Vielleicht interessiert sich ein jüngerer hier im Forum für das Ziel.
Gruß
Re: Hyperlink für Stichworte
Verfasst: Sa, 01.04.2023 10:10
von 15Albert
Hallo Qosti,
ich schicke dir mal meine Datei.
Albert
Re: Hyperlink für Stichworte
Verfasst: Sa, 01.04.2023 17:41
von mikeleb
Hallo,
hier
viewtopic.php?t=71553 findet sich ein Makro für dieses Problem.
Re: Hyperlink für Stichworte
Verfasst: Sa, 01.04.2023 17:46
von quotsi
Vielleicht können Mondblatt24 oder andere Experten helfen. Ich kann es leider nicht, bin stets nur interessierter Laie auf dem Computer-Gebiet gewesen, mein Feld war die Chirurgie...
Re: Hyperlink für Stichworte
Verfasst: So, 02.04.2023 10:50
von quotsi
Ja, das Leben ist schon interessant! Ich wollte mich an der Frage, ob das Makro unter LO auch läuft, versuchen. Natürlich nicht!
Dann sucht man nach Ursachen und probiert es an AOO. Aber auch da läuft es in meinem Fall nicht!
Dann ist man frustriert, aber kann das nicht einsehen. Erst jetzt habe ich den Link zu der Diskussionsrunde genutzt und detailiert gelesen. Abgesehen von irgendwelchen Verzögerungen steht da doch eindeutig, dass das Makro nur zuschlägt, wenn es sich um Stichworte im Fließtext handelt !!!
Ich hatte auf die Schnelle (bin ja kein Schriftsteller, haha) eine Datei genommen, von der ich wußte, dass sie ein Stichwortregister hat, nämlich eine Küchenrezeptsammlung, wo jedes "Rezept" die genaue Beschreibung beinhaltet, was man braucht und wie man die Speise/den Kuchen/die Mahlzeit zubereitet. Natürlich waren das jeweils Abschnitte und da waren doch hauptsächlich die Überschriften von Interesse, sowohl für ein Inhaltsverzeichnis, als auch für ein alphabetisches Register (=Stichwortverzeichnis). ABER DA SIND die STICHWORTE NICHT IM FLIESSTEXT !!!
So kann es einem ergehen, wenn das "Kleingedruckte" nicht groß am Anfang steht.
Ob ich so viel Willen habe, mal zu sehen, ob man da noch was verbessern kann, und das nötige Wissen dazu? Ich weiß es nicht.
Re: Hyperlink für Stichworte
Verfasst: Mo, 03.04.2023 09:43
von quotsi
Ich bin mir völlig unsicher. Wenn ich das vorgeschlagene/verlinkte Makro einbaue, dann sind die DIM Zeilen doch außerhalb (vor dem sub) und wie kann man denn den Anfang sauber definieren?
Re: Hyperlink für Stichworte
Verfasst: Mo, 03.04.2023 11:05
von 15Albert
Hallo Quosti,
meien bekannter, der ist leider verstoben.
Der hatte mir gesagt, es müssten die anhängenden oxt installiert werden.
Die hänge ich an.
Du hattest geschrieben die Hyperlink müsten im Fließtext sein.
Die Ausganzpunkt sind natürlich der Fließtext
Die ich Dir gschickt habe sind im Vrzeichnis ganz unten.
Leider ist der gesamte Text so groß, dass der nicht angenommen wrd.
Wenn Du mir noch mal deine private Mailadresse schickst nach
discipuli@netcologne.de
Deine war so komisch irgand wie mit Zypern oder so.
Dann könnte ich Dir auf diesem Wege schicken.
In dem Text steckt nichts Geheimes.
Albert
Re: Hyperlink für Stichworte
Verfasst: Mo, 03.04.2023 15:38
von quotsi
->15Albert
Wozu soll man die 4 verschiedenen oxt. installieren? Was sollen die jeweils bewirken?
Hat denn bei dir das von mikeleb verlinkte Makro deinen Wunsch einer Seitenverlinkung im Stichwortverzeichnis (zumindest für im Fließtext positionierten Stichwörtern) funktioniert?
Re: Hyperlink für Stichworte
Verfasst: Mo, 03.04.2023 19:23
von mikeleb
Hallo,
da mich das Thema gereizt hat und ich nebenbei mal wieder einiges über Verzeichnisse und die Durchforstung eines Dokuments gelernt habe, habe ich das ursprüngliche Makro be- und umgearbeitet.
Wichtig dabei ist, dass das Stichwortverzeichnis korrekt erstellt ist. Bei größeren Dokumenten geht kein Weg an einer Konkordanzdatei vorbei.
Beim Erstellen der Querverweise/Links im Stichwortverzeichnis bin ich einen etwas anderen Weg gegangen:
1. Alle Stichwörter im Text bekommen ein Lesezeichen mit einem gewissen Präfix ("x_") um sie von ggf. vorhandenen anderen Lesezeichen zu unterscheiden.
2. Diese (alten) Lesezeichen werden zu Beginn des Makros gelöscht. Anschließend erhalten alle Stichworteinträge ein neues Lesezeichen. Alle diese Lesezeichen merke ich mir in einem Array (es erschien mir so am sinnvollsten, um nicht später ständig neu alles durchsuchen zu müssen)
Nun geht es die Bearbeitung des Verzeichnisses. Ein Verzeichniseintrag könnte so aussehen:
Arbeit....5, 9, 15, 18ff., 24, 28f., 34f., 40, 46
Die Punkte .... stehen für eine Tabulator, der zwingend existieren muss (ohne kann ich mir ein solches Verzeichnis auch nicht vorstellen)
3. Die Seitenzahlen werden entfernt und dann Schritt für Schritt durch Querverweise auf diese Seite ersetzt. Wenn ein Stichwort mehrmals auf einer Seite vorhanden ist, wird der Querverweis auf das erste Auftreten gesetzt (dazu habe ich mir im Array nicht nur die Seite, sondern auch die Position gemerkt, die nun ausgewertet werden, um das richtige Lesezeichen zu finden).
Das Gleiche gilt bei so etwas wie 18ff. bzw. 34f. Hier wird der Querverweis auf das erste Auftreten gesetzt.
4. Das Makro funktioniert auch, wenn die Zusammenfassung von Einträgen per "-" anstelle von "f., ff." erfolgt. Ist die Option "Zusammenfassen gleicher Einträge" nicht gewählt, macht das Makro nichts (die variante ist noch nicht implementiert).
Code: Alles auswählen
public warten_dialog as object
public abbruch_durch_benutzer 'kennzeichnet das Benutzer manuell abgebrochen hat
public raus 'beendet Hauptschleife Do-Loop
Const praefix="x_" 'Präfix für die Stichwortlesezeichen, zur Unterscheidung ggf. anderer Lesezeichen
Sub verweise_setzen()
'Originalautor: www.jm-schmidt.de
'be- und umgearbeitet im April 2023
startzeit = time()
fehler_log = ""
abbruch_durch_benutzer = 0
raus = 0
rueck = 0
rueck = Msgbox("Wollen Sie die Einträge im Stichwortverzeichnis verlinken? " & _
CHR(13) & CHR(13) & "ACHTUNG das Stichwortverzeichnis muss unmittelbar vor " & _
"dem Start des Makros hier, aktualisiert worden sein. Ansonsten klicken Sie bitte ab ""Abbrechen"" " & _
" und aktualisieren das Stichwortverzeichnis und starten Sie danach das Makro neu." & CHR(13) & " ", 33, "Stichwortverzeichnis bearbeiten")
If Not(rueck = 1) Then Exit Sub
oDoc=ThisComponent
cur = oDoc.Text.createTextCursor
oViewCursor = oDoc.CurrentController.getViewCursor
indexes = ThisComponent.getDocumentIndexes()
For i = 0 To Indexes.getCount() - 1
oIndex = Indexes.getByIndex(i)
If oIndex.supportsService("com.sun.star.text.DocumentIndex") Then
If oIndex.UseCombinedEntries then
erstelle_dialog
warten_dialog.setVisible(True)
warten_dialog.getControl("warten1").Text = "alte Lesezeichen werden gelöscht ..."
'Alle ursprünglichen Lesezeichen entfernen
oMarks=ThisComponent.Bookmarks
for k=oMarks.count-1 to 0 step -1
oMark=oMarks.getbyindex(k)
if left(oMark.Name,len(praefix))=praefix then
oMark.anchor.getText().removeTextContent(oMark)
end if
next
'Alle Stichwortvorkommen im Dokument einlesen und Lesezeichen setzen
oindex=odoc.documentindexes(1)
Dim aStichworte(ubound(oindex.documentindexmarks))
for n_sw=0 to ubound(aStichworte)
warten_dialog.getControl("warten1").Text = "Stichwörter werden eingelesen, Lesezeichen gesetzt ... " & n_sw+1 & " von " & ubound(aStichworte)+1
oMark=oindex.DocumentIndexMarks(n_sw)
'zur Textstelle gehen
oViewCursor.gotoRange(oMark.anchor, false)
aStichworte(n_sw)=DimArray(4)
aStichworte(n_sw)(0)=oMark.markEntry & oMark.anchor.string 'Text des Eintrages
aStichworte(n_sw)(1)=oViewCursor.getpage 'Seite des Vorkommens
aStichworte(n_sw)(2)=oviewcursor.position.x 'Position des Vorkommens
aStichworte(n_sw)(3)=oviewcursor.position.y
aStichworte(n_sw)(4)=praefix & aStichworte(n_sw)(0) & "-" & n_sw 'Name des Lesezeichens
'Lesezeichen erstellen
oBookmark = ThisComponent.createInstance("com.sun.star.text.Bookmark")
oBookmark.setName(aStichworte(n_sw)(4))
ocurtmp=oViewcursor.Text.createTextCursor
ocurtmp.gotoRange(oMark.anchor, false)
oViewCursor.Text.insertTextContent(ocurtmp, oBookmark, False)
next
warten_dialog.getControl("warten1").Text ="Querverweise werden erstellt ..."
cur.gotoRange(oIndex.getAnchor, false)
cur.CollapseToStart 'vorderste Position im Verzeichnis
'Anzahl Einträge ermitteln
anzahl_eintraege = 0
Do
IF cur.ParaStyleName = oIndex.ParaStyleLevel1 OR cur.ParaStyleName = oIndex.ParaStyleLevel2 OR cur.ParaStyleName = oIndex.ParaStyleLevel3 Then
anzahl_eintraege = anzahl_eintraege + 1
Elseif cur.ParaStyleName <> oIndex.ParaStyleHeading AND cur.ParaStyleName <> oIndex.ParaStyleSeparator Then
Exit Do
End If
cur.GotoNextParagraph(False)
Loop
cur.gotoRange(oIndex.getAnchor, false)
cur.CollapseToStart
dd = 0
Do While raus = 0 and dd<anzahl_eintraege
cur.GotoEndOfParagraph(False)
'Verzeichniseintrag?
IF cur.ParaStyleName = oIndex.ParaStyleLevel1 OR cur.ParaStyleName = oIndex.ParaStyleLevel2 OR cur.ParaStyleName = oIndex.ParaStyleLevel3 Then
dd = dd + 1
warten_dialog.getControl("warten1").Text ="Querverweise werden erstellt ... " & dd & " von " & anzahl_eintraege
cur.GotoStartOfParagraph(False)
cur.GotoEndOfParagraph(True)
'Auslesen des gesamten Eintrags in Array tmp()
'der Eintrag muss folgende Struktur haben: Eintrag#Tabulator#Seiten
tmp = Split(cur.String, CHR(9)) 'es wird das Vorhandensein eines Tabulators je Eintrag vorausgesetzt
'Finden aller Lesezeichen zu diesem Eintrag, sortiert
sEintrag=tmp(0)
n=-1
for z=0 to ubound(aStichworte)
warten_dialog.getControl("warten3").Text = sEintrag
if aStichworte(z)(0)=sEintrag then
n=n+1
ReDim preserve aEintrag(n)
aEintrag(n)=aStichworte(z)
tausch=1
k=n-1
do while tausch=1 and k>-1
if (aEintrag(k+1)(3)>aEintrag(k)(3)) or (aEintrag(k+1)(3)=aEintrag(k)(3) and aEintrag(k+1)(2)>aEintrag(k)(2)) then
tausch=0
else
swp=aEintrag(k)
aEintrag(k)=aEintrag(k+1)
aEintrag(k+1)=swp
end if
k=k-1
loop
end if
next
'Auslesen der ggf. mehreren Seitenzahlen
tmp2 = Split(tmp(1), ", ")
'.UseCombinedEntries ?
'.UsesDash ? .UsePP ?
'es können drei Fälle auftreten (.UsesCombinedEntries=True und .UsesDash=False und .UsePP=True):
' 45 Stichwort nur auf der Seite
' 45f. Stichwort auf der Seite und der folgenden
' 45ff. Stichwort auf der Seite und den folgenden
'der Link wird, in diesem Beispiel, immer nur zum Stichwort auf Seite 45 führen - ein Link zu mehreren Zielen ist nicht möglich
'es können zwei Fälle auftreten (.UsesCombinedEntries=True und .UsesDash=True und .UsePP=False):
' 45 Stichwort nur auf der Seite 45
' 45-47 Stichwort auf der Seite 45 bis einschließlich Seite 46
'
'wenn .UsesCombinedEntries=False oder .UsesDash=False und .UsePP=False, dann gibt es zu jedem Eintrag eine Liste nur einzelner Seiten
'der Fall muss nicht extra betrechtet werden
iF oIndex.UsePP then
sTrenner="f"
else
sTrenner="-"
end if
'aktuelle Zeile im Verzeichnis
cur.GotoStartOfParagraph(False)
'lösche alles hinter dem Tabulator
cur.goRight(LEN(tmp(0))+1, False)
cur.GotoEndOfParagraph(True)
cur.String = ""
'Aufspalten einer Seitennumer mit ggf. f. oder ff.
tmp3=split(tmp2(0),sTrenner)
'die Seitenzahl weg
nseite=val(tmp3(0))
tmp3(0)=""
'neuer Text ohne Seitenzahl
neu=join(tmp3,sTrenner)
'Suche das Lesezeichen auf der richtigen Seite
nr=0
do until aEintrag(nr)(1)=nseite or nr=ubound(aEintrag)
nr=nr+1
loop
'msgbox nr
if aEintrag(nr)(1)=nseite then 'Lesezeichen auf der Seite existiert
oReference = ThisComponent.createInstance("com.sun.star.text.textfield.GetReference")
oReference.SourceName = aEintrag(nr)(4)
oReference.SequenceNumber = 0
oReference.ReferenceFieldPart = com.sun.star.text.ReferenceFieldPart.PAGE
oReference.ReferenceFieldSource = com.sun.star.text.ReferenceFieldSource.BOOKMARK
oDoc.getText.insertTextContent(cur, oReference, False)
cur.GotoEndOfParagraph(False)
else 'Lesezeichen nicht vorhanden
cur.String = nSeite
cur.collapsetoend
end if
cur.String = neu
cur.collapsetoend
'falls noch mehr Seiten zu dem Eintrag
for j=1 to ubound(tmp2)
cur.String = ", "
cur.collapsetoend
tmp3=split(tmp2(j),sTrenner)
nseite=val(tmp3(0))
tmp3(0)=""
neu=join(tmp3,sTrenner)
do until aEintrag(nr)(1)=nseite or nr=ubound(aEintrag)
nr=nr+1
loop
'msgbox nr
if aEintrag(nr)(1)=nseite then 'Lesezeichen auf der Seite existiert, Querverweis setzen
oReference = ThisComponent.createInstance("com.sun.star.text.textfield.GetReference")
oReference.SourceName = aEintrag(nr)(4)
oReference.SequenceNumber = 0
oReference.ReferenceFieldPart = com.sun.star.text.ReferenceFieldPart.PAGE
oReference.ReferenceFieldSource = com.sun.star.text.ReferenceFieldSource.BOOKMARK
oDoc.getText.insertTextContent(cur, oReference, False)
cur.GotoEndOfParagraph(False)
else 'Lesezeichen nicht vorhanden, es wird der ursprüngliche Text gesetzt
cur.String =nSeite
cur.collapsetoend
end if
cur.String = neu
cur.collapsetoend
next
end if
cur.GotoNextParagraph(False)
loop
oviewcursor.gotoRange(oIndex.getAnchor, false)
oviewcursor.collapsetostart
end if
end if
next
ThisComponent.getTextfields.refresh()
warten_dialog.setVisible(False)
If abbruch_durch_benutzer = 1 Then
Msgbox "Bearbeitet wurden " & dd & " Einträge." & CHR(13) & CHR(13) & "Start: " & startzeit & CHR(13) & _
"Ende: " & time() & CHR(13) & CHR(13), 16, "Abbruch durch Benutzer"
Else
Msgbox "Bearbeitet wurden " & dd & " Einträge." & CHR(13) & CHR(13) & "Start: " & startzeit & CHR(13) & _
"Ende: " & time() & CHR(13) & CHR(13), 64, "Fertig"
End If
End Sub
Sub erstelle_dialog
'warten-Dialog--------------------------
warten_model = CreateUnoService("com.sun.star.awt.UnoControlDialogModel")
warten_model.setPropertyValue("Width", 200) '343
warten_model.setPropertyValue("Height", 65) '65
warten_model.SetPropertyValue("Title","Bitte etwas Geduld")
oMod_warten = warten_model.createInstance("com.sun.star.awt.UnoControlFixedTextModel")
With oMod_warten
.setPropertyValue("Name","warten1")
.setPropertyValue("PositionX",5) '192
.setPropertyValue("PositionY",5)
.setPropertyValue("Width",180)
.setPropertyValue("Height",15)
.setPropertyValue("MultiLine", True)
.setPropertyValue("Label","")
End With
warten_model.insertByName("warten1", oMod_warten)
oMod_warten2 = warten_model.createInstance("com.sun.star.awt.UnoControlButtonModel")
With oMod_warten2
.setPropertyValue("Name","but1")
.setPropertyValue("PositionX",70)
.setPropertyValue("PositionY",45) '45
.setPropertyValue("Width",60)
.setPropertyValue("Height",16)
.setPropertyValue("Label", "Stop")
.setPropertyValue("DefaultButton", True)
'.setPropertyValue("Enabled", False)
End With
warten_model.insertByName("but1", oMod_warten2)
oListbut = createUnoListener("butlist_","com.sun.star.awt.XActionListener")
oMod_warten3 = warten_model.createInstance("com.sun.star.awt.UnoControlFixedTextModel")
With oMod_warten3
.setPropertyValue("Name","warten3")
.setPropertyValue("PositionX",5) '192
.setPropertyValue("PositionY",20)
.setPropertyValue("Width",180)
.setPropertyValue("Height",15)
.setPropertyValue("MultiLine", True)
.setPropertyValue("Label","")
End With
warten_model.insertByName("warten3", oMod_warten3)
warten_dialog = CreateUnoService("com.sun.star.awt.UnoControlDialog")
warten_dialog.setModel(warten_model)
warten_dialog.getControl("but1").addActionListener(oListbut)
oWin2 = CreateUnoService("com.sun.star.awt.Toolkit")
warten_dialog.createPeer(oWin2, null)
End Sub
Sub butlist_ActionPerformed()
abbruch_durch_benutzer = 1
raus = 1
End Sub
Meine ersten Test sehen ganz vernünftig aus, aber man weiß ja nie ...
Zumindestens werden Stichwörter auch in Tabellen, Bildbeschriftungen, Überschriften korrekt verarbeitet. Bitte gern weiter testen und Erfahrungen teilen.
Re: Hyperlink für Stichworte
Verfasst: Mo, 03.04.2023 23:10
von 15Albert
Hallo,
Quosti,
ich bekomme das makro nicht zum Laufen.
Die 4 Otx, von denen weis ich nicht wozu die gehören.
Ich ernnere mich nur dass fao, so hieß der wohl, mir die instslliert hat.
Albert
Re: Hyperlink für Stichworte
Verfasst: Di, 04.04.2023 11:11
von 15Albert
Hallo Mikeleb,
Ist es unverschämt, wenn ich Dich bitte das für mich zu machen?
Als Buchautor bin ich da doch zimlich hilflos.
Albert