Je me suis également penché sur les styles personnalisés mais j'ai abandonné l'idée car, comme vous l'avez dit, la méthode n'a pas fonctionné (pas même les échantillons de code finaux à la fin de chaque page).
J'ai fini par utiliser Visual Basic, car vous pouvez accéder aux données de la bibliographie de cette manière. Vous pouvez donc peut-être reproduire le comportement des citations en utilisant VBA et des contrôles de contenu. (Je n'ai pas reproduit les citations mais la bibliographie)
Pour utiliser les contrôles de contenu, vous devez activer les outils de développement dans les paramètres. Désormais, au lieu des citations réelles, vous insérez des contrôles de contenu avec des titres et des balises qui correspondent à la source à laquelle vous voulez faire référence. (Par exemple, donnez-lui un titre tel que cit_auto
et une balise correspondant à votre balise source) Vous devez activer le "mode d'édition" ( ?) dans les outils de développement pour accéder aux propriétés des contrôles.
Maintenant, pour accéder aux Sources du document actuel, vous pouvez utiliser ActiveDocument.Bibliography.Sources
. Pour obtenir TOUTES les sources, vous pouvez utiliser Application.Bibliography.Sources
.
Notez que Bibliography.Sources
est un Sources
et non un objet Source
le tableau.
Un problème similaire se produit avec les contrôles de contenu. La fonction ActiveDocument.SelectContentControlsByTitle
renvoie un ContentControls
au lieu d'un objet ContentControl
le tableau.
Les deux peuvent être itérés et accédés en utilisant leurs indices, cependant vous ne pouvez pas les passer comme paramètre pour leur tableau correspondant, dans le cas où vous voulez modulariser le code.
Vous pouvez itérer les ContentControls
dans un For Each
sélectionnez l'option correspondante Source
en faisant correspondre les ContentControl.Tag
avec le Source.Field("Tag")
et définir les ContentControl.Range.Text
au format que vous souhaitez :
Public Sub FillSources()
'assign variable types to get some form of autocomplete
Dim cc As ContentControl
Dim src As Source
Dim srcs As Sources
'get sources
Set srcs = ActiveDocument.Bibliography.Sources
'iterate through the 'cit-auto' controls
For Each cc In ActiveDocument.SelectContentControlsByTitle("cit_auto")
On Error GoTo catch 'pseudo Try
For Each src In srcs 'look for the source of the citation
If (src.field("Tag") = cc.Tag) Then
cc.Range.text = _ 'results in: lastname, firstname: title (day.month.year)
src.field("Author/b:Author/b:NameList/b:Person:b/Last") & ", " & _
src.field("Author/b:Author/b:NameList/b:Person:b/First") & ": " & _
src.field("Title") & " (" & _
src.field("Day") & "." & _
src.field("Month") & "." & _
src.field("Year") & ")"
End For 'source found, skip to next control
End If
Next
GoTo finally
catch: 'pseudo Catch
Debug.Print "source " & cc.Tag & " not found"
finally:'pseudo Finally
Next
Debug.Print "done"
End Sub
Notez que je n'ai pas testé cela et que cela peut probablement être mieux fait.
Si les champs sont manquants, la méthode Source.Field() déclenchera une erreur et sera ignorée. Vous pouvez probablement créer un wrapper pour la méthode afin d'insérer une valeur par défaut en cas d'erreur et l'utiliser pour construire votre style.
Si vous avez besoin d'accéder à d'autres champs de la source, vous pouvez regarder dans sa rubrique .XML
qui contient toutes les données disponibles. Vous n'avez pas besoin d'ajouter la propriété b:
-sur les noms de la première couche du fichier xml, comme l'indique le préfixe .field()
l'ajoute automatiquement si elle est manquante.
De plus, je n'ai aucune idée de la façon de gérer les auteurs multiples, mais peut-être que quelqu'un d'autre le sait.