[Writer] Signes doubles et espaces insécables en typographie

Vos meilleures macros et portions de code sont publiées dans cette section.
Aucun support sur une question de programmation ici !

Modérateur : Vilains modOOs

Règles du forum
Aucune question dans cette section !
Celle-ci rassemble les meilleures macros et portions de code. Vous pouvez en revanche commenter ou argumenter le code exposé. Vous pouvez même remercier l'auteur (cela fait toujours plaisir) en indiquant par exemple dans quel cadre ou contexte vous en avez eu l'utilité.
Si vous avez à poster quelque chose, faites-le depuis la section Macros et API et demandez à un modérateur de l'y déplacer.
Avatar de l’utilisateur
Sébastien C
Membre hOOnoraire
Membre hOOnoraire
Messages : 157
Inscription : 28 avr. 2008 23:21
Localisation : Meymac (19250)

[Writer] Signes doubles et espaces insécables en typographie

Message par Sébastien C »

Bonjour à tous,

La typographie française répond à des normes très strictes et il n’est pas ici le lieu de faire l’énumération de ses règles. Toutefois, on sait que les quatre signes doubles « ! », « ? », « : » et « ; » doivent être précédés d’un espace et que celui-ci, à fortiori, se doit d’être insécable pour coller au mot qui les précède et donc, ne pas se retrouver sur la ligne suivante. OpenOffice Writer gère depuis déjà fort longtemps les guillemets français, ouvrants et fermants, respectivement suivis et précédés d’un espace insécable. Il en va tout autrement des quatre signes doubles « ! », « ? », « : » et « ; » dont l’espace insécable n’est géré correctement qu’avec l’adjonction d’une extension, elle-même téléchargeable sur cette page. Cette extension permet, en cours de frappe, de positionner les espaces insécables avant les signes doubles, prenant en compte si un espace a été tapé au clavier avant le signe et, s’il n’est pas insécable, le remplace très judicieusement.

Grand amateur de corrections de textes, souvent issus d’OCR, je me trouve fréquemment face a des textes où ces conventions typographiques sont posées aléatoirement, voire sont complètement absentes. En pratique, il peut y avoir (principalement car il y a évidemment toujours des exceptions) trois possibilités dans un texte qui puissent subir ce genre de traitements :
  1. des signes doubles qui ne sont précédés ni d’espaces insécables, ni d’espaces normaux.
  2. des signes doubles précédés d’espaces normaux.
  3. des signes doubles déjà correctement précédés d’espaces insécables.
La règle est la même pour ce qui regarde le signe des guillemets français ouvrant, si ce n’est qu’il faut l’appliquer à l’inverse sachant que l’insécable doit évidemment suivre le signe et non le précéder.

La correction des mises en place est relativement fastidieuse à faire « à la main » et une macro permet évidemment, de mâcher le travail pour ce type de corrections :

Code : Tout sélectionner

     Sub ponctuationDouble
      Dim Document As Object, Replace As Object
      Dim RechRemp(1,7), chaineImpossible As String
      Dim i As Integer

      Document = ThisComponent : Replace = Document.CreateReplaceDescriptor()
      chaineImpossible = "ireazfdnqsbfjqsghk"

      ' Marquer tous les ESPACES NORMAUX devant les caractères "»", "!", "?", ":" et ";".
      RechRemp(0, 0) = "(" & chr(32) & ")([»!?:;])"  : RechRemp(1, 0) = chaineImpossible & "&"

      ' Marquer tous les ESPACES INSÉCABLES devant les caractères "»", "!", "?", ":" et ";".
      RechRemp(0, 1) = "(" & chr(160) & ")([»!?:;])" : RechRemp(1, 1) = chaineImpossible & "&"

      ' Supprimer tous les ESPACES MARQUÉS devant les caractères "»", "!", "?", ":" et ";".
      RechRemp(0, 2) = chaineImpossible & "."        : RechRemp(1, 2) = ""

      ' RAJOUTER un espace insécable devant les caractères "»", "!", "?", ":" et ";".
      RechRemp(0, 3) = "([»!?:;])"                   : RechRemp(1, 3) = chr(160) & "&"

      ' *** Traitement spécifique du caractère "«" ***
      ' Marquer tous les espaces normaux APRÈS le caractère "«".
      RechRemp(0, 4) = "(«)(" & chr(32) & ")"        : RechRemp(1, 4) = "&" & chaineImpossible

      ' Marquer tous les espaces insécables APRÈS le caractère "«".
      RechRemp(0, 5) = "(«)(" & chr(160) & ")"       : RechRemp(1, 5) = "&" & chaineImpossible

      ' Supprimer tous les espaces marqués APRÈS le caractère "«".
      RechRemp(0, 6) = "." & chaineImpossible        : RechRemp(1, 6) = ""

      ' RAJOUTER un espace insécable APRÈS le caractère "«".
      RechRemp(0, 7) = "(«)"                         : RechRemp(1, 7) = "&" & chr(160)


      For i = 0 to 7
       Replace.SearchRegularExpression = True
       Replace.SearchString = RechRemp(0, i) : Replace.ReplaceString = RechRemp(1, i)
       Document.replaceAll (Replace ())
      Next i
    End Sub
Enfin, on trouvera ici un fichier Writer qui, outre le fait qu’il contient la macro possède aussi les éléments textuels pour faire des essais.

Typographiquement vôtre,
8)
LibreOffice 3.5.3.2 sous GNU-Linux Mageia 2.
andréb
Fraîchement OOthentifié
Messages : 7
Inscription : 18 oct. 2008 06:16

Re: [Writer] Signes doubles et espaces insécables en typographie

Message par andréb »

notez que si le codage est Unicode (UTF-8 est de plus en plus commun), une espace inséquable est u2026 :)
OpenOffice 2.4.1 sous Mandriva 2008.1
Avatar de l’utilisateur
Sébastien C
Membre hOOnoraire
Membre hOOnoraire
Messages : 157
Inscription : 28 avr. 2008 23:21
Localisation : Meymac (19250)

Re: [Writer] Signes doubles et espaces insécables en typographie

Message par Sébastien C »

Je vous réponds très tard mais je vous réponds quand même...

Sans vouloir vous offenser, je ne sais pas dans quelle table vous avez pu voir que l’espace insécable pouvait avoir le code u2026 en utf8... Peut-être sur cette page, mais alors, vous vous serez trompé d’une ligne puisque le « NO-BREAK SPACE » est bien U00A0, soit en bonne notation décimale, 160...

Vous pouvez donc écrire « chr(clng ("&H00A0")) » à la place de « chr(160) » si vous aimez la complexité mais certainement pas « chr(clng ("&H2026")) » car vous obtiendrez alors une ellipse horizontale dont nous n’avons que faire...
:aie:
LibreOffice 3.5.3.2 sous GNU-Linux Mageia 2.
jjk
HédOOniste
HédOOniste
Messages : 1696
Inscription : 27 oct. 2008 14:30

Re: [Writer] Signes doubles et espaces insécables en typographie

Message par jjk »

Je viens de découvrir cette macro qui correspond parfaitement à mes besoins. Merci à son auteur.
Lorsque je passe la macro sur un document concernant Calc et donc contenant des adresses de plages comme A1:C4, un espace insécable est inséré mal à propos.
Voici un petit additif à placer juste avant la boucle For :

Code : Tout sélectionner

Dim RechRemp(1,8), chaineImpossible As String
...
' CAS des adresses de plages Calc : supprimer l'espace insécable avant le ":"
RechRemp(0, 8) = "([0-9])" & chr(160) & ":([A-Za-z])" : RechRemp(1, 8) = "$1:$2"
For i = 0 to 8
...
qui supprime tout espace insécable inséré par la macro devant un ":" compris entre un chiffre et une lettre.
Remarque : un élément a été ajouté au tableau RechRemp.
OpenOffice 3.1.1 sous XP-SP2 et LibreOffice 3.5.0 sous Win 7