ich habe vor einiger Zeit mit etwas Unterstützung durch das Forum ein kleines Makro geschrieben, das bestimmte Textbausteine nach einem Muster in Feldbefehle umwandelt
Das klappt ganz prima. Nun möchte ich jedoch für für ein spezifisches Muster\cite{...}
\cite{_3_...}
den Text des Musters löschen und nur den Feldbefehl ('ReferenceMark') behalten.
Es ist m.E. nur ein kleiner Schritt, aber ich habe leider längere Zeit nicht mehr mit der Makrofunktion gearbeiten, so dass ich mir nicht selbst zu helfen weiß. Evtl. hat jemand einen Tipp für mich.
Meine Idee bisher ist in der Routine subCreate einzusetzen und einen leeren String einzufügen. Aber damit bekomme ich bisher leider nur den Feldbefehl modifiziert und nicht den Text im Dokument.
Code: Alles auswählen
REM ***** BASIC *****
private sSelection as string 'Selected text
private oDoc as object 'Points to the current document
private oRefMarks as object 'Document references
private b as integer
private dia As Object
private frm As Object
'************************* Replace JabRef reference field with cite key***************************
'example Jabref field-->\cite{_1_Mehringer965}
Sub Main
BasicLibraries.LoadLibrary("JabRefConverterLib")
DialogLibraries.LoadLibrary("JabRefConverterLib")
frm = DialogLibraries.JabRefConverterLib.JabRefConvert
dia = CreateUnoDialog(frm)
dia.Execute()
End Sub
Sub FromTextToReference
Dim SearchDesc As Object
Dim Doc As Object
dim j as integer ' counter for message box
dim l as integer ' counter for message box
dim k as integer ' counter for message box
Doc = ThisComponent
Dim SearchDescRegExp As Object
SearchDescRegExp = Doc.createSearchDescriptor
SearchDescRegExp.SearchString = "\\cite\{[^\}]+\}"
SearchDescRegExp.SearchRegularExpression = True
Found = Doc.findFirst (SearchDescRegExp)
J=0
l=0
k=0
b=100
' b necessary for plain \cite{key} to prevent a mix up with existing jabref citations because jabref has an internal identifier for every instance of a citation
' eg. JR_cite_1_Simmel ...JR_cite0_1_Simmel ....
' by using b we start with JR_cite100_1_Simmel to prevent double usage.
Do Until IsNull(Found)
Controller = Doc.CurrentController
VC = Controller.ViewCursor
VC.gotoRange(Found,False)
subEventReference(j,l,k)
Found = Doc.findNext( Found.End, SearchDescRegExp)
Loop
If Not IsNull(dia) then
dia.endExecute()
End If
Msgbox ("Conversion to JabRef Reference successful " & chr(13) & + CStr(k) + " (in-text) citations " & chr(13) & + CStr(j) + " empty citations " & chr(13) & + CStr(l) + " manually added \cite{keys} " & chr(13) & chr(13) & " Now you can refresh the fields using Jabref. ", ,"OK")
End Sub
Sub FromReferenceToText
dim temp as string
Dim i As Integer, oRefmarks, oRefmarkNames()
dim j as integer
dim l as integer
oRefmarks = ThisComponent.getReferenceMarks()
oRefmarkNames = oRefmarks.getElementNames()
j=0
l=0
' insert a string at every reference mark
For i = 0 To Ubound( oRefmarkNames )
ref = oRefmarkNames(i)
If instr(ref, "JR_cite") Then
temp=ref
if left(temp,7)="JR_cite" then
temp = mid(temp,8)
end if
if instr(temp, "_3_")=0 Then
anchor = oRefmarks.getByName( ref).getanchor
rr= anchor.gettext.createtextcursorbyrange(anchor)
rr.string="\cite{" +temp + "}"
J=j+1
else
' for empty citations.
anchor = oRefmarks.getByName( ref).getanchor
rr= anchor.gettext.createtextcursorbyrange(anchor)
rr.string="\cite{" +temp + "}"
l=l+1
end if
End if
Next
'problem: empty citations don't get disposed.
' solution: a) dispose all remaining jabref references. in a second loop
For i = 0 To Ubound( oRefmarkNames )
ref = oRefmarkNames(i)
If instr(ref(i), "JR_cite") Then
On Error Resume Next
oRefmarks.getByName( ref ).dispose()
End if
Next
If Not IsNull(dia) then
dia.endExecute()
End If
Msgbox ("Conversion to plain text code successful " & chr(13) & + CStr(j) + " (in-text) citations " & chr(13) & CStr(l) + " empty citations ", ,"OK")
End Sub
'************************* Create a reference that JabRef can process ***************************
'example \cite{_1_Mehringer965}-> to Jabref field
'example \cite{Mehringer965}-> to JabRef field
Sub subEventReference(j,l,k as integer)
dim oRefField as object
Dim i As Integer, oRefmarks, oRefmarkNames()
oDoc = ThisComponent
oRefMarks = oDoc.Referencemarks
oRefmarkNames = oRefmarks.getElementNames()
oRefField = oDoc.createInstance("com.sun.star.text.ReferenceMark")
oSel = oDoc.getCurrentSelection().getByIndex(0)
if left(oSel.getString,6)="\cite{" then
sSelection = "JR_cite"+mid(oSel.getString,7)
sSelection = left (sSelection,len(sSelection)-1)
' just count empty citations
if InStr(oSel.getString, "_3_")<>0 then
j=j+1
end if
if InStr(oSel.getString, "_2_")<>0 or InStr(oSel.getString, "_1_") then
k=k+1
end if
' routine to handle plain \cite{key} -> ad an unique identifiy (a)
if InStr(oSel.getString, "_1_")=0 and InStr(oSel.getString, "_2_")=0 and InStr(oSel.getString, "_3_")=0 then
sSelection = "JR_cite"+CStr(b)+"_1_"+mid(oSel.getString,7)
sSelection = left (sSelection,len(sSelection)-1)
' routine to prevent doubling of the same JR_cite[b]
For i = 0 To Ubound( oRefmarkNames )
If instr(oRefmarkNames(i),sSelection) Then
b=b+1
sSelection = "JR_cite"+CStr(b)+"_1_"+mid(oSel.getString,7)
sSelection = left (sSelection,len(sSelection)-1)
End if
Next
l=l+1
end if
end if
subCreate(oRefField,sSelection)
End sub
'********************* Create the field (sub routine) ***********************
Sub subCreate(oField as object, sText as string)
dim sRefname as string
oField.setName(sText, oRefField)
oDoc.currentController.ViewCursor.Text.insertTextContent(oDoc.currentController.ViewCursor, oField, True)
End sub