Améliorer l'ergonomie de votre document

avec des onglets de navigation

Vous pouvez commenter l'article en suivant le lien suivant : Commentez Donner une note à l'article (5), alors après votre lecture, n'hésitez pas.

Article lu   fois.

L'auteur

Profil Pro

Liens sociaux

Viadeo Twitter Facebook Share on Google+   

I. Préambule

Dans une entreprise, la rédaction des documents demande du temps et des efforts pour le chargé d'affaires, mais aussi pour ceux qui liront son mémoire technique. Or, de ce lecteur, en réalité, nous ne savons rien de lui.

Utilise-t-il une impression papier, couleur, noir et blanc ou plutôt un format informatique (PDF) ?

Sait-il bien utiliser son lecteur PDF (navigation, recherche, etc.) ?

Est-il parfaitement au fait des techniques exposées ?

La réflexion ayant motivé cette macro, c'est de vouloir se mettre à la place du lecteur inconnu. Que faire pour rendre sa lecture plus fluide et agréable, rendant ainsi notre document plus pertinent sans forcément inventer la roue à chaque page, mais simplement en mettant en valeur le contenu ? Une lecture en « diagonale » peut faire des ravages quand il s'agit de juger un document, surtout si la note finale en est affectée. Et dans le cas d'une entreprise, cela peut signifier la perte d'un marché au profit d'un concurrent qui aura su mettre en valeur son document. Sachant que les entreprises sont notées pour déterminer l'attribution des lots et, parmi les notes attribuées, la présentation des documents en fait partie, il devient évident qu'une réflexion sur l'ergonomie, voire l'esthétique est un sage préalable.

Donc, que faire ? Quand un document fait 300 pages, un joli sommaire ne suffit plus. Une réponse parmi d'autres, c'est de permettre au lecteur de naviguer dans le document plus facilement. Dans les dossiers d'appels d'offres, les documents sont fournis au format PDF, en majorité.

LibreOffice étant bien équipé pour fournir des documents PDF, le choix est fait de travailler le document final avec Writer. Dans les outils disponibles, Draw est un atout indéniable. Malheureusement pour la facilité de ce choix, Word est encore présent dans l'entreprise et les réticences classiques ne tardent pas à refaire surface. Cela fait deux outils à gérer, l'objectif se corse et se résume ainsi :

  • Rédacteurs :

    • laisser les rédacteurs libres de l'outil tout en les aidant à migrer,
    • trouver des procédures de travail fluides qui ne pénalisent pas leur temps de production ;
  • Lecteurs :

    • trouver une ergonomie esthétique et pratique,
    • produire un document PDF exploitable sur toutes sortes d'équipement bureautique et versions de lecteurs PDF.

Les réponses trouvées…

  • Rédacteurs :

    • Word si besoin, mais nous finalisons le document avec LibreOffice. L'usage des styles est obligatoire,
    • réaliser un index vertical qui se propage automatiquement avec l'entête ;
  • Lecteurs :

    • un index vertical esthétiquement comparable aux intercalaires à onglets,
    • abandon des technologies récentes pour rester sur un document rustique à hyperliens.
Image non disponible
Illustration 1 : Le meilleur résultat obtenu avec un index…

Le résultat ? LibreOffice peut effectivement « propager » un index dans tout le document. L'astuce consiste à poser un index dans un cadre de texte, l'accrocher dans l'entête et le disposer sur le côté de la page. Le problème c'est que le passage en PDF met le bazar dans les hyperliens des index dupliqués. Défaut constaté en collaboration avec le forum LibreOffice. Nous pouvons contourner le problème en copiant un index sur autant de pages que nécessaire. Nous pouvons colorier les entrées selon une charte graphique, mais ce formatage appliqué sur un style est perdu en cas d'actualisation. Et pour 300 pages, il faut compter 296 index…

Je ne suis pas certain que les index soient faits pour cela. De plus si une actualisation s'impose après copie, c'est autant d'index à gérer !

L'esthétique d'un index étant trop basique même en le coloriant, malgré ses avantages et devant ses inconvénients, l'index dans l'entête (ou pas) est laissé de côté. Nous nous tournons vers une barre à onglets dessinée dans Draw.

I-A. Le choix

La version Draw est bien plus esthétique. Elle est plus souple et sujette aux variations. Un texte sur chaque onglet, le tout groupé et collé dans le document Writer avec un ancrage à la page et le tour de passe-passe est joué !

Pour les hyperliens, LibreOffice est plutôt rapide. La boite de dialogue est bien faite, nous ne la quittons pas tant que tous les hyperliens soient posés. C'est rapide et les rédacteurs l'ont vite adopté.

Nous la copions page suivante, nous collons… C'est simple, mais sur 300 pages c'est rédhibitoire.

À la rescousse, reste le morceau de bravoure : la macro.

Image non disponible
Illustration 2 : La version avec une barre d'onglets dessinés dans Draw.

II. La macro enregistrée

Ayant toujours refusé d'utiliser les macros, car incompétent en code malgré des essais jadis, j'ai utilisé l'enregistreur de macro. Mais cette macro était incapable de déterminer le nombre de pages du document et de calculer combien de copies il fallait réaliser.

II-A. Premier jet

Affecter cette macro à un bouton dans une barre d'outils n'arrange pas le problème, car autant de clics que de pages… Bref !

Se documenter, faire des essais, cela ne permet pas de rattraper des années passées à ignorer le codage.

 
Sélectionnez
sub Copie
dim document   as object
dim dispatcher as object
document   = ThisComponent.CurrentController.Frame
dispatcher = createUnoService("com.sun.star.frame.DispatchHelper")
dispatcher.executeDispatch(document, ".uno:Copy", "", 0, Array())
dispatcher.executeDispatch(document, ".uno: PageDown", "", 0, Array())
dispatcher.executeDispatch(document, ".uno: Paste", "", 0, Array())
dispatcher.executeDispatch(document, ".uno: PageDown", "", 0, Array())
end sub

Texte 1 : La macro de départ, brut de décoffrage.

Le plus raisonnable étant de demander de l'aide, je me suis tourné vers Developpez.com, que je connaissais du temps où j'avais espéré me former au Basic.

II-B. Un coup de pouce

Une première réponse me met sur le chemin.

 
Sélectionnez
Sub Zoom61()
    Dim monDocument As Object
    Dim PageEncours As Object
    Dim PageActive As Integer, PageFin As Integer
    monDocument = ThisComponent
    PageEncours = monDocument.CurrentController.ViewCursor
    PageActive = PageEncours.Page
    PageEncours.jumpToLastPage
    PageFin = PageEncours.Page
    PageEncours.jumpToPage(PageActive)
    Print "Page en cours : " & PageActive & " - Nombre de pages : " & PageFin
End Sub

Texte 2 : La macro qui trace le chemin.

Compter les pages depuis la page courante, puis afficher le résultat. Les données de type « Integer » sont stockées dans des variables et, donc, sont exploitables pour calculer le nombre de copies à faire.

Mais comment associer les deux macros dans un code correct ? Là aussi le forum apporte une réponse bienvenue d'autant que le résultat de mes recherches est trop général ou spécifique pour en tirer un enseignement utile rapidement.

 
Sélectionnez
Dim I 
For I = 1 To 10
  ' ...  Inner part of loop 
Next I

Texte 3 : Le code à cogiter.

Dans le principe il est facile de déduire que la structure du code sera de cette veine :

 
Sélectionnez
Var1 = N° de la page en cours
Var2 = Nombre de pages
Var3 = Var2-Var1 nombre de copies à réaliser
Objet1 = objet présélectionné
Boucle
PageDown compteur + 1
Coller
Compteur = Var3 = Non je boucle Oui goto fin
Fin

Mais nous sommes loin de la syntaxe exacte.

III. La macro

III-A. Premier essai

Là encore le forum vient à ma rescousse et Zoom61 me propose ce code :

 
Sélectionnez
Sub Zoom61()
    Dim monDocument As Object
    Dim PageEncours As Object
    Dim Compteur As integer
    Dim PageActive As Integer, PageFin As Integer, PageNb As Integer
    dispatcher = createUnoService("com.sun.star.frame.DispatchHelper")
    monDocument = ThisComponent
    PageEncours = monDocument.CurrentController.ViewCursor
    PageActive = PageEncours.Page
    PageEncours.jumpToLastPage
    PageFin = PageEncours.Page
    PageNb = PageFin-PageActive 
    PageEncours.jumpToPage(PageActive)
    

document   = ThisComponent.CurrentController.Frame
rem : C'est dans la macro enregistrée je laisse
    dispatcher = createUnoService("com.sun.star.frame.DispatchHelper")
rem -----Copie de l'objet sélectionné C'est dans la macro enregistrée je laisse
    dispatcher.executeDispatch(document, ".uno:Copy", "", 0, Array())
For Compteur = PageActive+1 To PageFin

    PageEncours.jumpToPage(Compteur)
    dispatcher = createUnoService("com.sun.star.frame.DispatchHelper")
rem -----Collage de l'objet sélectionné C'est dans la macro enregistrée je laisse
    dispatcher.executeDispatch(document, ".uno:Paste", "", 0, Array())
  Next Compteur
    Print "Page en cours : " & PageActive & " - Nombre de pages : " & PageFin & " - Nombre de copies : " & PageNb
End Sub

Texte 4 : La macro de la dernière ligne droite… le but est proche

Mais bizarrement, cela fonctionne sur les zones de texte qui contiennent les index, mais pas sur la barre réalisée dans Draw.

Au lieu d'être copiée sur toutes les pages, toutes les copies se font sur une page. Pour effacer les copies, il faut annuler la copie autant de fois…

Une fois de plus le forum me vient en aide.

III-B. La variable Anchor

C'est jurassic pork qui trouve le problème. Un objet dessin de Draw est affecté par une option AnchorPageNo. Donc en gérant cette variable d'ancrage à la page, la copie peut se propager dans tout le document.

Maintenant, que faire de ce code ?

La solution finale
Sélectionnez
Sub Zoom61()
rem : Retouche par Jurassic Pork 
    Dim monDocument As Object
    Dim PageEncours As Object
    Dim oSel As Object
    Dim Compteur As integer
    Dim PageActive As Integer, PageFin As Integer, PageNb As Integer
    dispatcher = createUnoService("com.sun.star.frame.DispatchHelper")
    monDocument = ThisComponent
    PageEncours = monDocument.CurrentController.ViewCursor
    PageActive = PageEncours.Page
    PageEncours.jumpToLastPage
    PageFin = PageEncours.Page
    PageNb = PageFin-PageActive 
    PageEncours.jumpToPage(PageActive)
 
document   = ThisComponent.CurrentController.Frame
rem : C'est dans la macro enregistrée je laisse
    dispatcher = createUnoService("com.sun.star.frame.DispatchHelper")
rem -----Copie de l'objet sélectionné C'est dans la macro enregistrée je laisse
    dispatcher.executeDispatch(document, ".uno:Copy", "", 0, Array())
For Compteur = PageActive+1 To PageFin
 
    PageEncours.jumpToPage(Compteur)
    dispatcher = createUnoService("com.sun.star.frame.DispatchHelper")
rem -----Collage de l'objet sélectionné C'est dans la macro enregistrée je laisse
    dispatcher.executeDispatch(document, ".uno:Paste", "", 0, Array())
    oSel = monDocument.CurrentController.Selection.getByIndex(0)
    oSel.AnchorPageNo = Compteur
  Next Compteur
    Print "Page en cours : " & PageActive & " - Nombre de pages : " & PageFin & " - Nombre de copies : " & PageNb
End Sub

Texte 5 : La macro de la dernière chance. Adaptée pour copier les objets dessins de Draw.

IV. Conclusion

Bien que béotien de la programmation, les recherches effectuées et l'aide reçue ont vraiment changé mon avis sur la programmation. Certes c'est une programmation basique dans le sens où l'objectif n'est pas de réaliser un logiciel complet, mais pour un amateur, cela reste un cap difficile à franchir.Je dirais donc qu'il faut prendre le temps de lire le code. Les termes employés sont compréhensibles avec un petit effort. Ce n'est pas de la prose, certes, mais ce n'est pas opaque non plus.

Un peu de recherche personnelle pour comprendre où nous allons et acquérir du « vocabulaire », un peu d'aide par la bonne volonté des intervenants du forum et nous avançons.

V. Intégration dans votre menu Writer

D'abord il faut importer la macro sur votre poste. Ouvrez le gestionnaire des macros :

  1. « Outils > Macros > Gérer les macros > LibreOffice.Basic » ;
  2. Déroulez « Mes macros », sélectionnez « Module1 » et cliquez sur « Éditer » ;
  3. Collez le code de la macro sous la partie déjà en place. Le code sera reconnu et colorié selon les règles standard du langage Basic.

La macro est prête à être utilisée. Vous pouvez la lancer depuis « Outils > Macros > Exécuter la macro ».

Image non disponible
Image non disponible
Image non disponible
Dessin 1 : Importez votre macro

Ajoutez votre macro dans le menu Outils du traitement de texte. Ouvrez l'utilitaire de personnalisation (« Outils > Personnalisation »).

  1. Onglet : Menus.
  2. Menu : Outils.
  3. Contenu du menu : positionnez la sélection sur macro (ou ailleurs).
  4. Cliquez sur Ajouter. Une fenêtre de sélection apparaît.
  5. Sélectionnez la macro (Macros LibreOffice>Mes macros>Standard>Module1).
  6. Cliquez sur Ajouter puis Fermer.
  7. La macro est insérée dans le menu. Sa position dans le menu peut être modifiée.
  8. Le nom dans le menu peut être modifié.
Image non disponible
Dessin 2 : Personnalisez le menu Outils

VI. La macro au travail

Pour copier la barre d'onglets dans tout votre document :

  1. Sélectionnez la barre, puis copiez (CTRL+C) ;
  2. Déroulez le menu « Outils », puis cliquez sur la macro (CopieBarre) ;
  3. La commande copie la barre d'onglets, depuis la page en cours autant de fois qu'il reste de pages pour atteindre la fin du document. À la fin de son exécution, la commande vous donne le résultat du travail effectué.
Image non disponible
Dessin 3 : La macro en action.

VII. Remerciement

Je remercie Claude Leloup pour la relecture orthographique.

Vous avez aimé ce tutoriel ? Alors partagez-le en cliquant sur les boutons suivants : Viadeo Twitter Facebook Share on Google+   

  

Les sources présentées sur cette page sont libres de droits et vous pouvez les utiliser à votre convenance. Par contre, la page de présentation constitue une œuvre intellectuelle protégée par les droits d'auteur. Copyright © 2015 Patrick Guimberteau. Aucune reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents, images, etc. sans l'autorisation expresse de l'auteur. Sinon vous encourez selon la loi jusqu'à trois ans de prison et jusqu'à 300 000 € de dommages et intérêts.