Aller au contenu

ConTeXt/Règles horizontales et verticales

Un livre de Wikilivres.

ConTeXt

 Page précédente : colonnes

Part. II, ch. 5  •  Règles horizontales et verticales  •  Sommaire

Page suivante : En-têtes et pieds de page 

Règles horizontales et verticales dans ConTeXt

[modifier | modifier le wikicode]

Cette page présente l’ensemble des mécanismes permettant d’obtenir des lignes horizontales et des lignes verticales dans ConTeXt : — règles typographiques simples, — règles décoratives, — règles automatiques (colonnes), — règles avancées programmées avec MetaPost.

L’objectif est de donner un panorama complet permettant de choisir le bon outil selon le contexte (texte courant, chapitres, tableaux, colonnes, zones graphiques, etc.).

Objectifs Objectifs de cette section

  • comprendre les différences entre règles horizontales simples (\thinrule, \hrule…) et solutions avancées ;
  • apprendre à insérer et configurer des règles verticales dans les colonnes ;
  • maîtriser les règles décoratives (\framed, frame=, filets de chapitres) ;
  • découvrir les techniques MetaPost pour tracer des règles conditionnellement ;
  • comprendre le fonctionnement des overlays et des systèmes de positions (\hpos, positionxy) ;
  • résoudre les problèmes récurrents signalés dans la mailing-list (notamment sur LMTX).

1. Règles horizontales simples

[modifier | modifier le wikicode]

ConTeXt fournit plusieurs commandes pour créer des filets horizontaux.

1.1. \hrule et variantes ConTeXt

[modifier | modifier le wikicode]

Commande TeX classique :

\hrule
\hrule height 0.6pt

ConTeXt propose des versions prêtes à l’emploi :

\thinrule    % filet fin
\hairline    % filet très fin
\blackrule   % filet épais noir

Exemple :

Texte avant.
\hairline
Texte après.

1.2. Règles centrées ou décalées

[modifier | modifier le wikicode]
\midaligned{\hairline}
\leftaligned{\thinrule}

1.3. Règles associées à des titres

[modifier | modifier le wikicode]
\setuphead[chapter][after={\hairline}]

Astuce
Pour espacer un filet d’un titre, placez \blank autour de \hairline :

\setuphead[chapter][after={\blank[small]\hairline\blank[medium]}]

1.3.1 codes que vous pouvez compiler pour tester

[modifier | modifier le wikicode]
  • A — lignes simples
\starttext
Texte avant.
\blank[small]
\hairline
\blank[medium]
Texte après.
\stoptext
  • B — Lignes associées à un titre
\setuphead[chapter][after={\blank[small]\hairline\blank[medium]}]

\starttext
\chapter{Titre de chapitre}
Texte du chapitre…
\stoptext

2. Règles verticales simples

[modifier | modifier le wikicode]

2.1. \vrule

Commande TeX classique :

\vrule width 0.4pt height 2cm

Pour l’insérer dans un flux horizontal :

Texte \vrule width 0.4pt\ texte.

Mais ce mécanisme est souvent insuffisant : → il ne s’adapte pas à la hauteur dynamique, → il ne suit pas les colonnes ou cadres.


3. Règles décoratives (cadres, filets autour du texte)

[modifier | modifier le wikicode]

3.1. Avec \framed

\framed[frame=on]{Texte}
\framed[bottomframe=on]{Texte}
\framed[topframe=on]{Titre}

3.2. \startframedtext

\startframedtext[frame=on,offset=1ex]
Ce bloc est encadré.
\stopframedtext

3.3. Filets sur les côtés

\framed[rightframe=on,leftframe=on]{Texte}

4. Règles dans les colonnes

[modifier | modifier le wikicode]

C’est le sujet le plus complexe et le plus souvent discuté dans la mailing-list.

On distingue quatre méthodes selon la sophistication souhaitée.


4.1. Méthode simple : \setupcolumns[rule=on]

[modifier | modifier le wikicode]
\setupcolumns[n=3,rule=on]
\startcolumns
\samplefile{lorem}
\stopcolumns

Limites :

  • règle sur toute la hauteur de la page,
  • aucune adaptation à la dernière page,
  • pas de contrôle fin.

4.2. Méthode intermédiaire : pagecolumns (déconseillé)

[modifier | modifier le wikicode]

Le système pagecolumns a été utilisé longtemps, mais il est :

  • moins maintenu avec LMTX,
  • difficile à combiner avec les positions,
  • source de nombreux messages d’erreur.

La mailing-list rapporte régulièrement :

  • règles invisibles,
  • coordonnées incorrectes,
  • impossibilité d’arrêter la règle avant le dernier paragraphe.

Recommandation : utiliser plutôt columnset.


Exemple : tracer une règle verticale entre colonnes avec MetaPost

[modifier | modifier le wikicode]
La solution la plus simple pour obtenir une règle verticale entre colonnes est d’utiliser

\setupcolumns[n=3,rule=on].

Cependant, cette commande ne permet pas toujours un contrôle fin : type de trait, épaisseur, décalage, compatibilité avec certains arrière-plans, etc.

L’exemple ci-dessous montre comment obtenir une règle verticale proprement alignée à droite de chaque colonne, sauf après la dernière, en utilisant un petit programme MetaPost appliqué comme « arrière-plan » des colonnes.

L’objectif est le suivant
  • dessiner automatiquement un filet entre les colonnes ;
  • éviter tout débordement du texte ;
  • ne jamais dessiner de règle après la dernière colonne ;
  • garder un code concis et robuste.

Le fonctionnement repose sur un principe simple : ConTeXt fournit, pour chaque colonne, une boîte locale nommée OverlayBox. MetaPost peut tracer directement sa bordure droite, ce qui garantit un alignement parfait. Voici le schéma qui montre ce qui est attendu :

Illustration générale de l’objectif
On souhaite obtenir automatiquement la présentation suivante :

Colonne 1      | Colonne 2      | Colonne 3
───────────────┼────────────────┼───────────────
texte          | texte          | texte
texte          | texte          | texte
               |                |

Le filet vertical apparaît entre les colonnes, mais jamais après la dernière. Il suit exactement la hauteur de la page et reste parfaitement aligné.


Illustration précise de l’objectif
On souhaite obtenir le comportement suivant pour une mise en page en trois colonnes :

Page 1 (colonnes entièrement remplies)
┌───────────────┬───────────────┬───────────────┐
│               │               │               │
│   texte       │   texte       │   texte       │
│   colonne 1   │   colonne 2   │   colonne 3   │
│               │               │               │
│               │               │               │
└───────────────┴───────────────┴───────────────┘
        │               │
        │   règles      │   verticales
        │   complètes   │

Page 2 (dernière page : colonne 3 incomplète)
┌───────────────┬───────────────┬───────────────┐
│               │               │               │
│   texte       │   texte       │   texte       │
│   colonne 1   │   colonne 2   │   colonne 3   │
│               │               │   (plus court)│
│               │               │               │
└───────────────┴───────────────┴───────────────┘
        │               │
        │   règle       │   règle tronquée
        │   complète    │   à la hauteur du
        │               │   dernier paragraphe

Ce comportement exige que la règle entre colonnes soit tracée :

  • pleinement sur les pages entièrement remplies ;
  • mais tronquée à la hauteur réelle du texte sur la dernière page.

  • Afin d'atteindre cet objectif, on écrira le code suivant :
% ============================================================
% Trois colonnes avec règles verticales entre colonnes.
% Exemple robuste utilisant pagecolumns + MetaPost.
% ============================================================

% Mise en page compacte : les colonnes occupent toute la largeur
\setuplayout[tight]

% ------------------------------------------------------------
% Programme MetaPost pour dessiner la règle verticale.
%
% ConTeXt fournit automatiquement :
%   - CurrentColumn : numéro de la colonne courante
%   - NOfColumns    : nombre total de colonnes
%   - OverlayBox    : boîte correspondant à la colonne courante
%
% On dessine le filet seulement si la colonne courante n'est pas la dernière.
%
% "rightboundary OverlayBox" = bordure droite de la colonne.
% ------------------------------------------------------------
\startuseMPgraphic{ColumnSeparator}
    if CurrentColumn < NOfColumns:
        draw rightboundary (OverlayBox rightenlarged \measure{ColumnOffset})% épaisseur du filet
            withpen pencircle scaled 0.4pt ; 
        % Ajuste l'espace de dessin à la colonne
        setbounds currentpicture to OverlayBox;
    fi
\stopuseMPgraphic

% Déclare l'overlay utilisable dans les colonnes
\defineoverlay[ColumnSeparator][\useMPgraphic{ColumnSeparator}]

% Mesure de séparation et décalage du filet
\definemeasure[ColumnDistance][1em]
\definemeasure[ColumnOffset]  [\measure{ColumnDistance}/2]

\starttext

% ------------------------------------------------------------
% Trois colonnes :
%   - n=3 : nombre de colonnes
%   - distance=... : espace entre colonnes
%   - background=ColumnSeparator : dessin MetaPost pour chaque colonne
% ------------------------------------------------------------
\startpagecolumns
  [n=3,
   distance=\measure{ColumnDistance},
   align={verytolerant,stretch},
   background=ColumnSeparator]

  % Texte de démonstration
  \dorecurse{10}{\samplefile{lorem}}

\stoppagecolumns

\stoptext
  • Ce qui produit l'image suivante après compilation :

Texte sur 3 colonnes dessinées avec MetaPost

Interprétation de l’exemple

  • L’image ci-dessus illustre le résultat du code MetaPost : trois colonnes équilibrées, avec un filet vertical placé exactement sur la bordure droite de chaque colonne, à l’exception de la dernière comme prévu.
  • Ce filet est généré automatiquement pour chaque colonne grâce à la variable OverlayBox, qui représente la zone occupée par la colonne courante.
  • Le dessin rightboundary OverlayBox garantit que le filet s’aligne parfaitement sur la hauteur de la colonne, sans débordement et sans intervention manuelle.
  • Ce mécanisme est robuste : que le texte occupe une ou plusieurs pages, les filets sont tracés exactement là où ils doivent être.

5. Règles verticales avancées avec columnsets et MetaPost

[modifier | modifier le wikicode]

L’exemple principal ci-dessus a montré comment tracer une règle verticale entre colonnes en utilisant un overlay MetaPost appliqué automatiquement à chaque colonne. Pour la plupart des mises en page, cette méthode suffit : elle est simple, robuste et entièrement compatible avec LMTX.

Cette section présente les principes généraux pour aller plus loin, sans réintroduire les mécanismes obsolètes des versions antérieures.

5.1 Principe général

[modifier | modifier le wikicode]

Lorsqu’un columnset est composé, ConTeXt attribue à chaque colonne une boîte interne appelée : OverlayBox

MetaPost peut dessiner directement sur les bordures de cette boîte : c’est ce qui permet de créer des règles verticales parfaitement alignées.

Dans l’exemple présenté précédemment (illustré par l’image png), la logique est la suivante :

  • identifier la colonne courante avec CurrentColumn ;
  • connaître le nombre total de colonnes avec NOfColumns ;
  • tracer un filet uniquement si l’on n’est pas dans la dernière colonne ;
  • utiliser rightboundary OverlayBox pour positionner le trait.

Cela donne une solution à la fois flexible et fiable.

5.2 Colonnes inégales et règles tronquées

[modifier | modifier le wikicode]

Certaines mises en page avancées (revues, maquettes complexes) exigent que les règles verticales :

  • ne descendent pas jusqu’en bas de la page finale ;
  • s’arrêtent exactement à la hauteur du dernier paragraphe d’une colonne.

Pour obtenir ce type de comportement, il faut combiner MetaPost et Lua :

  • mesure dynamique de la hauteur des colonnes ;
  • usage de marqueurs internes comme \hpos{} ;
  • tests conditionnels sur la dernière colonne réellement utilisée.

Ces techniques dépassent le cadre de cette page et s’adressent aux utilisateurs expérimentés.

Pour aller plus loin
Les exemples anciens trouvés sur diverses archives (StackExchange 2017–2022, anciens messages de listes) reposent sur pagecolumns ou sur des primitives MetaPost qui ne sont plus adaptées à LMTX. Il est recommandé de partir de l’exemple moderne présenté ci-dessus et de l’étendre progressivement.

6. Règles dessinées avec MetaPost (hors colonnes)

[modifier | modifier le wikicode]

Il est également possible d’utiliser MetaPost pour dessiner des lignes horizontales ou verticales indépendamment des colonnes.

Exemple : une règle horizontale pleine largeur :

\startuseMPgraphic{myhrule}
    draw (0,0) -- (PaperWidth,0)
        withpen pencircle scaled 0.8pt ;
\stopuseMPgraphic

\midaligned{\useMPgraphic{myhrule}}

Dans un cadre :

\framed[background=myhrule,frame=off]{Texte}

Ces techniques permettent de créer des séparateurs adaptés à toute mise en page.

7. Problèmes fréquents (issus de la liste de diffusion)

[modifier | modifier le wikicode]

La règle n’apparaît pas Vérifier que l’overlay est bien activé via background=... et que son nom correspond exactement à celui défini avec \defineoverlay.

La règle est décalée Ajuster ColumnOffset ou la valeur de distance=. Vérifier que le trait est tracé sur rightboundary OverlayBox.

Le texte déborde d’une colonne Cela provient généralement d’une police large, d’une image non redimensionnée ou d’un réglage de page incompatible. Toujours tester les exemples dans un environnement minimal.

Comportement différent dans d’anciens exemples Les exemples antérieurs à 2023 utilisent souvent pagecolumns. Ce mécanisme n’est plus recommandé et est partiellement incompatible avec LMTX.

  • Les règles horizontales simples se font avec \hairline, \thinrule ou un petit graphique MetaPost.
  • Les règles verticales créées par \vrule sont limitées.
  • Pour les colonnes stratifiées :
 * \setupcolumns[rule=on] fournit un filet rapide mais peu personnalisable ;
 * l’utilisation d’un overlay MetaPost donne un contrôle complet et robuste.  
  • Les techniques avancées (colonnes de hauteurs inégales, règles tronquées, analyse en Lua) relèvent d’un usage expert.
  • Avec LMTX, la méthode moderne pour les règles verticales consiste à combiner columnsets et MetaPost.

6. Règles avec MetaPost (hors colonnes)

[modifier | modifier le wikicode]

On peut dessiner n’importe quelle ligne horizontale/verticale :

\startuseMPgraphic{myhrule}
draw (0,0)--(PaperWidth,0) withpen pencircle scaled 0.8pt ;
\stopuseMPgraphic

\midaligned{\useMPgraphic{myhrule}}

ou dans un cadre :

\framed[background=myhrule,frame=off]{Texte}

7. Problèmes récurrents (issus de la mailing-list)

[modifier | modifier le wikicode]

Règle invisible → overlay non lié via 'background=', ou mauvaise position du code.

Règle trop longue / trop courte → incorrect usage de 'OverlayBox', 'cutbeforefirst', ou 'positionxy'.

Règle apparaît sur page blanche → contrôler if NColsOnPage > 0.

Distance entre colonnes incorrecte → vérifier \frameddimension{distance}.

MetaPost ne connaît pas TextWidth → TextWidth doit être défini par le columnset.



    Résumé
  • Les règles horizontales simples se font via \hairline, \thinrule ou \hrule.
  • Les règles verticales simples (\vrule) sont limitées.
  • Pour les colonnes : \setupcolumns[rule=on] est facile mais peu flexible.
  • pagecolumns est ancien et ne doit plus être utilisé en LMTX.
  • columnsets + MetaPost = méthode moderne, robuste et puissante.
  • Les overlays permettent un contrôle total, y compris conditionnel sur page ou colonne.

 Page précédente : colonnes

Part. II, ch. 5  •  Règles horizontales et verticales  •  Sommaire

Page suivante : En-têtes et pieds de page