ConTeXt/Quelques exemples d'organisation de la page : marges, cadres, etc.

Un livre de Wikilivres.

Comment organiser la page en investissant les marges, ou en introduisant des cadres et des figures[modifier | modifier le wikicode]

Les marges[modifier | modifier le wikicode]

Les notes en marge[modifier | modifier le wikicode]

Elles sont dépendantes de la commande : \setupmargindata[...,...][...=...,...]

Exemple : \setupmargindata[inmargin][location=inner, style={\ssx\setupinterlinespace[line=2.8ex]}]

Nous voyons ci-dessus que les données en marge seront inner, c'est-à-dire à l'intérieur de la marge; elles pourraient être à gauche (left), à droite (right) et même ... en dehors de la marge (outer). Le style du texte est ssx, c'est-à-dire en corps très petit, et un interligne de 2.8ex (un ex étant la hauteur du caractère x).

Afin de pouvoir écrire du texte dans les marges, celles-ci doivent être suffisamment spacieuses pour accueillir du texte. La taille du texte sera volontairement plus petite que celle du texte de page, d'une part pour pouvoir être inséré dans la marge et, d'autre part afin de ne pas trop attirer l'œil. La définition de la marge se fait dans le préambule de votre fichier source. On dira que l'on veut un backspace suffisant de 40mm, afin que les notes de marge puissent s'insérer (40mm est une valeur que vous pouvez modifeier à votre gré). Les commandes les plus simples et les plus utiles sont celles-ci :

% la commande qui libère de l'espace
\setuplayout [backspace=40mm]
% Puis la commande qui indique où placer la numérotation des pages dans la marge; ici la numérotation est insérée dans la marge, mais dans l'entête (vous pouvez vérifier avec la commande <code>\showframe</code>)
\setuppagenumbering[alternative=doublesided, location={header, inmargin}]
% C'est maintenant que nous définissons comment et où le texte sera inscrit dans la marge.
\setupmargindata[inmargin][location=inner, style={\ssx\setupinterlinespace[line=2.8ex]}]
% Nous alignons les données sur le bord droit de la marge.
\setupmarginframed[inmargin][align=right]

Nous avons maintenant la possibilité d'appeler des notes en marge depuis le corps du texte, par la commande :

\inmargin suivi de la note entre deux accolades.

  • Rédigeons maintenant un petit script qui nous permettra de visualiser deux choses : les notes en marge et les notes en pied de page. Dans le script qui suit, la commande \showframe est activée afin de visualiser le placement de tout le texte, dont la numérotation des pages dans la marge, mais en en-tête.
\showframe
\setuplanguage[fr][patterns={fr,agr}]
\mainlanguage[fr]
\setcharacterspacing[frenchpunctuation]
\setuplayout [backspace=40mm]
\setuppagenumbering[alternative=doublesided, location={header, inmargin}]
\setupmargindata[inmargin][location=inner, style={\ssx\setupinterlinespace[line=2.8ex]}]
\setupmarginframed[inmargin][align=left]
\setupbodyfontenvironment[default][em=italic]
\definefontfamily[mainface] [serif] [GFS Didot]
\definefallbackfamily[mainface][serif][Theano Didot][preset=range:greek, it={Old Standard Italic}, force=yes]
\setupbodyfont[mainface, 11pt]
\setupcolors[state=start]
\setupindenting[1.5em]
\setupindenting[yes]
\setupwhitespace[medium]
\setupinterlinespace[line=3.2ex]
%\setupcaptions[
%   style={\tfx\setupinterlinespace[line=10pt]}, 
%   headstyle=\it, 
%  numberstopper={:}]
%\setupitemize[each][margin=yes]

\setuphead[title][header=empty]

\setupheader[style={\sc}]
\setupfooter[style={\itxx}]
\setupheadertexts[Mise en forme de \ConTeXt — Les notes en marge][][][{\getmarking[section]}]
\setupfootertexts[][][][© — Composé avec {\ConTeXt}. La reproduction de ce document est soumise à autorisation.]
\setupsymbolset[text]

\starttext
\startchapter[title={Comment placer les notes en marge ?}]
D'un certain point de vue, les {\em Anciens} sont les philosophes de l'Antiquité, ainsi que ceux qui en ont discuté les thèses, philosophes ou théologiens chrétiens; les {\em Modernes}, quant à eux, se distinguent et se séparent des précédents non parce qu'ils vivent à distance dans un temps historique plus éloigné, mais parce qu'ils prennent soin eux-mêmes d'afficher leurs différences, pour ne pas dire leur mépris à l'égard de ceux dont ils ne veulent pas faire des prédécesseurs \inmargin{Francis Bacon méprisait Aristote} : \quotation{ “Bacon initiateur de la science moderne” est une plaisanterie, et fort mauvaise, que répètent encore les manuels. En fait, Bacon n’a jamais rien compris à la science. Il est crédule et totalement dénué d’esprit critique. Sa mentalité est plus proche de l’alchimie, de la magie (il croit aux « sympathies »), bref de celle d’un primitif ou d’un homme de la Renaissance que de celle d’un Galilée, ou même d’un scolastique}, écrit Alexandre Koyré\inmargin{Études galiléennes. Paris, Hermann, page 12, note 4.}. Si l'on veut, les Modernes prennent l'allure de {\em novateurs}, ils professent la {\em nouveauté}; dire de ceux qui professent la nouveauté, qu'ils se contredisent eux-mêmes, puisque rien ne semble suffisamment nouveau pour eux et qu'une nouveauté chasse fatalement toujours l'autre, est une critique facile, mais qui n'est pas dénuée de fondement. En tout cas, il paraît clair que les Modernes veulent {\em changer les choses}, ne pas conserver ce qui a fait ses preuves et remplacer au nom du {\em progrès} et rien ne semble plus pesant pour eux et parfois même plus difficile, que ces choses que la tradition prétend fixer\footnote{Par exemple, René Descartes (1592-1650) indique expressément dans son {\em Discours de la Méthode}, Partie 6, pourquoi il écrit en français et non en latin, la langue savante de son temps, la langue universitaire qui exclut du cercle du savoir les non-latinistes : \quotation{Et si j'écris en français, qui est la langue de mon pays, plutôt qu'en latin, qui est celle de mes précepteurs, c'est à cause que j'espère que ceux qui ne se servent que de leur raison naturelle toute pure jugeront mieux de mes opinions que ceux qui ne croient qu'aux livres anciens.}.}\inmargin{Descartes, René (1596-1650)}. Les Modernes insistent consciemment et volontairement sur les {\em ruptures} qu'ils veulent établir avec ce qui avait été présenté jusqu'à présent comme un modèle de culture et de vie, modèle qu'ils rejettent pour des motifs qu'il s'agira d'examiner\footnote{Cf. Boileau et Perrault, {\em La Querelle des Anciens et des Modernes}. Et Jonathan Swift, {\em La Bataille des Livres.}}.
\stopchapter
\stoptext
  • Voici la sortie au format PDF du script ci-dessus :
Sortie PDF d'un script ConTeXt permettant d'écrire des notes en marge et en pied de page.

Les numérotations en marge[modifier | modifier le wikicode]

Comme toujours dans ConTeXt (outil puissant s'il en est !), plusieurs manières d'investir dans les en-têtes, marges et autres espaces dans lesquels on veut voir figurer des indications, comme la numérotation de sections. Ci-dessous, un script rédigé par Pablo pour Ursula, qui rédige un cours de mathématiques, dans lequel elle veut voir figurer des indications de section en marge de son texte.

Voici le script (à copier et à tester) :

%\showframe\showstruts
  \mainlanguage[fr]
  \setuppagenumbering[alternative=doublesided]
  \definemargindata  [MyInMargin][ininner]
  \definemarginframed[MyInMargin]
    [topframe=on,bottomframe=on,rulethickness=1pt,width=1.90cm]
  \defineframed[topruletitle]
    [width=max,
     frame=off,
     topframe=on,
     rulethickness=1pt,
     align={justify},
     extras=\dontleavehmode]
  \starttext
  \topruletitle{\MyInMargin {1.1.1}\bf
  Axiome 3.2.17. (Représentation du Tout - et singularités)} \par
 
 Ex data causa determinata necessario sequitur effectus et contra si nulla detur determinata causa, impossibile est ut effectus sequatur
 
 
 \input ward
 \page

  \topruletitle{\MyInMargin{3.2.22}{\bf
  Definition 3.2.22 J'entends par cause de soi ce dont l'essence enveloppe l'existence ; autrement dit, ce dont la nature ne peut être conçue sinon comme existante.}. 
  
  
\input zapf b}
  \stoptext

Les cadres[modifier | modifier le wikicode]

Les cadres simples[modifier | modifier le wikicode]

Pour encadrer un texte de votre choix, il suffit d'utiliser la commande \startframedtext comme dans l'exemple suivant :

\setuplanguage[fr][patterns={fr}]
\mainlanguage[fr]
\setcharacterspacing[frenchpunctuation]
\definefontfamily[mainface] [serif] [TeX Gyre Pagella]
\starttext
\startframedtext[width=0.8\makeupwidth]
En gros la police est l'ensemble des représentations de caractères d'une même famille, 
quelle que soit la taille et la graisse utilisées. En revanche la fonte désigne 
précisément des caractéristique de corps, graisse et italique pour une police donnée.
Exemples : 

1. Arial est une {\it police}

2. Arial gras 12 point est une {\bf fonte}

{\sc C'est aussi simple que ça ! }

La graisse correspond tout simplement à l'épaisseur du trait
et permet de mettre en valeur certains mots, titres, paragraphes...
En partant d'une graisse dite normale ou {\it regular} (font-weight: 400 en CSS), 
on peut aussi bien grossir le trait vers {\bf gras}, {\bs heavy}, black (avec tous les intermédiaires), 
ou au contraire l'affiner avec léger ({\it light}), {\it extra-light}, {\it ultra-light}.
\stopframedtext
\startframedtext[right][width=.8\makeupwidth]
 Ce cadre est déplacé sur la droite, grâce à la commande {\it startframedtext} right de \ConTeXt.
\stopframedtext
\stoptext

On remarque que la taille du cadre est définie ici par 0.8. Si vous modifiez et donnez comme mesure 1.2, le cadre va occuper la presque totalité de la page. Comme son nom l'indique, la commande \makeupwidth ajuste le texte au cadre.

Le script ci-dessus doit donner le résultat ci-dessous :

ConTeXt: Textes avec cadres simples

Les cadres en couleur[modifier | modifier le wikicode]

Afin d'obtenir des cadres en couleur, la macro interne à ConTeXt qui permet de rendre effective la couleur doit être enclenchée :

\setupcolors[state=start]

Ensuite, on doit préciser que l'on veut obtenir un cadre :

\framed

  • Rédigeons un petit script par lequel un texte en blanc sera inscrit dans un cadre sur fond coloré en rouge :
\starttext
\setupcolors[state=start]
\framed
[background=color,backgroundcolor=darkred,
foreground=color,foregroundcolor=white]
{\ssx \bf Un texte blanc en gras sur fond rouge}
\stoptext

Rien de très compliqué ici : on déclare la couleur, puis le cadre muni de tous les éléments syntaxiques qui doivent avoir pour effet ce que l'on recherche (un texte en blanc sur fond rouge). Les mentions ssx et bf concernent la taille et la graisse de la police.

Je ne donne pas la sortie PDF de ce script, car il s'agit d'un petit cadre rouge en haut d'une page. En revanche, la question qui se pose maintenant concerne l'emplacement des cadres sur la page. Je donne un script qui commence par le petit cadre rouge contenant du texte en blanc que nous allons retrouver dans la sortie PDF suivante. D'abord l'écriture du script, qui reprend le script ci-dessus, mais qui ajoute la manière de disposer le cadre sur la page, par rapport à une ligne donnée. Voici le script :

\starttext
\setupcolors[state=start]
\framed
[background=color,backgroundcolor=darkred,
foreground=color,foregroundcolor=white]
{\ssx \bf Un texte blanc en gras sur fond rouge}

\vskip2cm
\framed 
[align=middle,background=color,backgroundcolor=darkred,
foreground=color,foregroundcolor=white]
{\sc Un texte blanc en petites capitales sur fond rouge}
\vskip2cm

\ruledhbox
  {A
   \framed[width=4cm,align=middle,location=hanging]{location\\equals\\hanging}
   \framed[width=4cm,align=middle,location=depth]  {location\\equals\\depth}
   \framed[width=4cm,align=middle,location=height] {location\\equals\\height}
   B}
\vskip2cm
\ruledhbox
  {A
   \framed[width=5cm,align=middle,location=low]    {location\\equals\\low}
   \framed[width=5cm,align=middle,location=line]   {location\\equals\\line}
   \framed[width=5cm,align=middle,location=high]   {location\\equals\\high}
   B}
\vskip2cm
\ruledhbox
 {A
  \framed[width=3cm,align=middle,location=top]    {location\\equals\\top}
  \framed[width=3cm,align=middle,location=bottom] {location\\equals\\bottom}
  \framed[width=3cm,align=middle,location=lohi]   {location\\equals\\lohi}
  \framed[width=3cm,align=middle,location=middle] {location\\equals\\middle}
  B}
\stoptext
  • Et voici la sortie PDF :
Comment colorer des cadres et choisir leur emplacement sur une page

Les cadres en couleur avec titre[modifier | modifier le wikicode]

En ce qui concerne les cadres comportant du texte avec de la couleur, il est essentiel de bien comprendre qu'il s'agit d'une forme construite avec Metapost et dont les paramètres sont insérés dans le préambule de votre script (fichier source). Voici ci-dessous une déclaration qui indique nous souhaitons insérer dans notre texte un cadre rouge avec un fond gris, contenant du texte. Ce cadre aura une étiquette en haut et à gauche du cadre. L'écriture se fait en deux temps :

  1. la déclaration des paramètres de ce cadre dans le préambule
  2. L'insertion du cadre se fait dans le corps du texte à l'endroit choisi.
  • Exemple de déclaration d'un cadre de couleur rouge, avec un fond gris et une étiquette :
% Début de la définition d'un texte encadré en rouge
% On définit le cadre MyFrame et ses propriétés.
% la police sera en 9pt
\defineframedtext
        [MyFrame]
        [before={\blank[3*big]},
         after={\blank[5*big]},
          frame=off,
          background=MyFrame,
  %width=\textwidth,
        width=max,
        height=fit,
        style={\setupbodyfont[9pt]}]

\definelabel
 [Definition]
 [headstyle=\bf\smallcaps]

% On va utiliser MetaPost pour enrichir le cadre avec des couleurs et une étiquette dont le texte est en blanc.
\startuseMPgraphic{MyFrame}
path b;
picture p;
%p := textext.rt("\white\Definition");
p := textext.rt("\white\framedtextparameter{Title}");
%p := textext.rt("\white\getvariable{text}{text1}");
p := p shifted (2BodyFontSize,OverlayHeight-ypart center p+.25ExHeight);
b := boundingbox p leftenlarged .5EmWidth rightenlarged .5EmWidth;
fill OverlayBox withcolor lightgray;  %\MPcolor{
fill b withcolor darkred;
draw bottomboundary OverlayBox withpen pencircle scaled 1pt  withcolor
darkred;
draw topboundary OverlayBox withpen pencircle scaled 1pt  withcolor
darkred;
draw p;
setbounds currentpicture to boundingbox currentpicture enlarged 2mm;
\stopuseMPgraphic

\defineoverlay
 [MyFrame]
 [\useMPgraphic{MyFrame}]
 % Fin de la définition d'un texte encadré en rouge

Une fois le cadre défini, il suffira ensuite, dans le corps du texte d'introduire les commandes ouvrante et fermante

 
\startMyFrame[Title=En résumé]
Ici on rédige le texte que l'on souhaite voir apparaître à l'intérieur d'un cadre rouge dont le fond est gris clair ...
\stopMyFrame
  • Vous pouvez copier et tester le code ci-dessous afin de bien comprendre les paramètres du script et de vous approprier la méthode. Je donne ici le script et sa sortie PDF.

Le script :

% \showframe %\showgrid
\setuplanguage[fr][patterns={fr,agr}]
\mainlanguage[fr]
\setcharacterspacing[frenchpunctuation]
\setuplayout [backspace=40mm]
\setuppagenumbering[alternative=doublesided, location={header, inmargin}]
\setupmargindata[inmargin][location=inner, style={\ssx\setupinterlinespace[line=2.8ex]}]
\setupmarginframed[inmargin][align=right]
\setupbodyfontenvironment[default][em=italic]
%\definefontfamily [mainface] [serif] [ibmplext][sc=ibmplexmonosc]
\definefontfamily[mainface] [serif] [GFS Didot]
\setupbodyfont[mainface, 11pt]
\setupcolors[state=start]
\setupinterlinespace[line=3.2ex]
\setupcaptions[
    style={\tfx\setupinterlinespace[line=10pt]}, 
    headstyle=\it, 
    numberstopper={:}]

% Début de la définition d'un texte encadré en rouge
\defineframedtext
        [MyFrame]
        [before={\blank[3*big]},
         after={\blank[5*big]},
          frame=off,
          background=MyFrame,
  %width=\textwidth,
        width=max,
        height=fit,
        style={\setupbodyfont[9pt]}]

\definelabel
 [Definition]
 [headstyle=\bf\smallcaps]

% Utilisation de Metapost pour créer la forme et la couleur du cadre
\startuseMPgraphic{MyFrame}
path b;
picture p;
%p := textext.rt("\white\Definition");
p := textext.rt("\white\framedtextparameter{Title}");
%p := textext.rt("\white\getvariable{text}{text1}");
p := p shifted (2BodyFontSize,OverlayHeight-ypart center p+.25ExHeight);
b := boundingbox p leftenlarged .5EmWidth rightenlarged .5EmWidth;
fill OverlayBox withcolor lightgray;  %\MPcolor{
fill b withcolor darkred;
draw bottomboundary OverlayBox withpen pencircle scaled 1pt  withcolor
darkred;
draw topboundary OverlayBox withpen pencircle scaled 1pt  withcolor
darkred;
draw p;
setbounds currentpicture to boundingbox currentpicture enlarged 2mm;
\stopuseMPgraphic

\defineoverlay
 [MyFrame]
 [\useMPgraphic{MyFrame}]
 % Fin de la définition d'un texte encadré en rouge
 
 \starttext
 \startchapter[title={Combiner defineframedtext et MPgraphic}]
 \startsection[title={Quel usage ?}]
Pour obtenir un texte encadré, on peut se contenter des commandes qui vont avec la commande {\it defineframedtext}. Mais si l'on veut ajouter de la couleur et compliquer un peu le cadre, il faut entrer dans le détail de Metapost, l'outil graphique qui, avec Metafun, permet de dessiner des diagrammes et des figures complexes au sein de ConTeXt.
\stopsection
\startsection[title={Un texte simple avec encadré}]
Il s'agit ici d'un exemple très simple de texte encadré par des lignes rouges ({\it darkred}). Pour les besoins de l'explication, le texte général est laissé à la discrétion de ConTeXt (qui fournit automatiquement une police standard en 12 pts). En revanche, le cadre et son étiquette, la taille du texte de l'encadré, tout cela est déterminé dans le préambule; par exemple, la taille de la police est fixée par la commande {\it setupbodyfont}[9pt]. Pour tester les paramètres de ces cadres, il faut et il suffit d'en comprendre les effets.
 
 \startMyFrame[Title=En résumé]
Pour obtenir le cadre et son contenu, il suffit ensuite, dans le corps du texte, de faire appel aux deux commandes ouvrante et fermante {\it startMyFrame} et {\it stopMyFrame} qui permettent d'obtenir un texte sur fond de la couleur définie auparavant, avec une étiquette rouge dont le texte est blanc.
\stopMyFrame
\stopsection
\stopchapter
 \stoptext

Voici la sortie PDF :

ConTeXt- Texte dans un cadre en couleur avec étiquette