Précédent |
Table des matières |
bas de page |
Suivant |
Table des matières abrégée |
---|
4 Le modèle des aires
4.1 Introduction 4.2 Les aires rectangulaires 4.3 Les espaces et la conditionnalité 4.4 Les aires de bloc 4.5 Les aires de ligne 4.6 Les aires en-ligne 4.7 Les contraintes d'ordonnancement 4.8 Les rétentions et les coupures 4.9 Le modèle de rendu 4.10 Un exemple d'arbre des aires |
En XSL, on crée un arbre des objets de mise en forme qui servent d'entrées, ou de spécifications, pour un formateur. Le formateur génère la disposition hiérarchique des aires qui comprend le résultat mis en forme. Ce chapitre définit le modèle global des aires et la manière dont elles interagissent. L'objectif consiste à présenter un cadre de travail pour décrire la sémantique des objets de mise en forme. Il faudrait le voir comme la description d'un ensemble de contraintes, pour des mises en œuvre conformes, et non comme la prescription d'algorithmes spécifiques.
Le formateur génère un arbre ordonné, l'arbre des aires, qui décrit une structure géométrique pour le média de sortie. Les expressions enfant, frère, parent, descendant et ancêtre se rapportent à cette structure en arbre. L'arbre a un nœud racine.
Chaque nœud de l'arbre des aires, autre que le nœud racine, est appelé une aire et est associé à une partie rectangulaire du média de sortie. Les aires ne sont pas des objets de mise en forme, au contraire, un objet de mise en forme génère zéro ou plusieurs aires rectangulaires et, normalement, chaque aire est générée par un objet unique de l'arbre des objets de mise en forme.
Remarque :
Les seules exceptions sont le fait de plusieurs embranchements de nœuds de l'arbre des objets de mise en forme qui seraient combinés pour générer une seule aire, comme, par exemple, quand plusieurs caractères à la suite génèrent un seul glyphe ligaturé. Dans tous les cas de ce genre, les propriétés concernées, telles que 'font-family' et 'font-size', sont les mêmes pour tous les objets de mise en forme impliqués dans la génération (voir le chapitre [4.7.2 La construction des lignes]).
Une aire a un rectangle de contenu, la zone dans laquelle se place ses aires enfant et, en option, un espacement et une bordure. Le schéma montre comment ces zones sont liées entre elles. La limite externe de la bordure est appelée rectangle de bordure et la limite externe de l'espacement rectangle d'espacement.
Toute aire possède un jeu de traits, une correspondance entre des noms et des valeurs, de la même façon que des éléments ont des attributs et des objets de mise en forme ont des propriétés. On emploie des traits individuels soit pour le rendu de l'aire, soit pour la définition de contraintes appliquées sur le résultat de la mise en forme, ou encore pour les deux. On peut appeler les traits employés strictement dans un but de mise en forme ou dans la définition de contraintes, traits de mise en forme, et ceux employés pour le rendu, traits de rendu. Les traits dont les valeurs sont copiées ou dérivées de propriétés avec un même nom, ou un nom correspondant, sont répertoriés aux chapitres [C Le sommaire des propriétés] et [5 L'affinage et la résolution des propriétés] ; les autres traits sont listés plus bas.
Remarque :
Les traits sont aussi associés aux objets de mise en forme lors de l'étape de l'affinage. Certains traits sont attribués pendant la mise en forme, alors que d'autres sont déjà présents après l'affinage.
Les rôles de chaque type d'objet de mise en forme, qui génèrent des aires, sont déterminés par rapport aux aires que celui-ci génère et par rapport à leur emplacement dans la hiérarchie de l'arbre des aires. Ceci peut être modifié par la suite selon les interactions entre divers types d'objets de mise en forme. Les propriétés de l'objet de mise en forme déterminent les aires qui sont générées et la façon dont le contenu de l'objet se répartit entre elles. Par exemple, un mot qui ne doit pas être coupé ne devra pas avoir ses glyphes répartis dans les aires de deux aires de ligne séparées.
Les traits d'une aire sont :
soit en dérivation directe : les traits prennent les valeurs calculées des propriétés de même nom, ou d'un nom correspondant, de l'objet de mise en forme générateur ;
soit en dérivation indirecte : les traits prennent comme valeurs les résultats de calculs qui impliquent les valeurs calculées d'une ou plusieurs propriétés de l'objet de mise en forme générateur, d'autres traits de cette aire ou d'autres aires en interaction (ancêtres, parent, frères et/ou leurs enfants) et, s'il y a lieu, une ou plusieurs valeurs produites par le formateur. La formule de ce calcul peut dépendre du type de l'objet de mise en forme.
Cette description suppose que les valeurs issues de l'affinage ont été calculées pour toutes les propriétés des objets de mise en forme de l'arbre résultant, c'est-à-dire toutes les valeurs relatives et correspondantes ont été calculées et les valeurs héritables ont été propagées, comme décrit dans le chapitre [5 L'affinage et la résolution des propriétés]. Ceci permet une description, une fois pour toute, du processus d'héritage et évite le besoin de répéter cette information sur le calcul des valeurs.
Les traits en dérivation indirecte sont: block-progression-direction, inline-progression-direction, shift-direction, glyph-orientation, is-reference-area, is-viewport-area, left-position, right-position, top-position, bottom-position, left-offset, top-offset, is-first, is-last, alignment-point, area-class, start-intrusion-adjustment, end-intrusion-adjustment, generated-by, returned-by, page-number, blink, underline-score, overline-score, through-score, underline-score-color, overline-score-color, through-score-color, alignment-baseline, baseline-shift, nominal-font, dominant-baseline-identifier, actual-baseline-table et script.
Il existe deux types d'aires : les aires de bloc et les aires en-ligne. Celles-ci diffèrent par la manière dont elles sont empilées par le formateur. Une aire peut avoir des aires enfants de bloc ou en-ligne, comme déterminé par l'objet de mise en forme générateur, mais les aires d'un enfant donné doivent toutes être du même type. Bien que les aires de blocs et en-ligne soient typiquement empilées, on peut positionner explicitement certaines aires.
Une aire de ligne est un genre particulier d'aire de bloc dont les enfants sont tous des aires en-ligne. Une aire de glyphe est un genre particulier d'aire en-ligne, sans aires enfants, qui n'a pour contenu qu'une seule représentation de glyphe.
Quelques exemples typiques d'aires : un paragraphe est rendu en utilisant un objet de mise en forme fo:block, qui génère des aires de bloc, et un caractère est rendu en utilisant un objet de mise en forme fo:character, qui génère une aire en-ligne (en fait, une aire de glyphe).
Deux directions sont associées à une aire donnée, celles-ci sont dérivées des propriétés 'writing-mode' et 'reference-orientation' de l'objet de mise en forme générateur : il s'agit de la direction de progression de bloc, qui correspond à la direction d'empilement des aires de bloc descendantes de l'aire en question, et de la direction de progression en-ligne, qui correspond à la direction d'empilement des aires en-ligne descendantes de l'aire en question. Un autre trait, shift-direction, accompagne les aires en-ligne et se rapporte à la direction suivant laquelle un glissement de la ligne de base intervient. Également, le trait glyph-orientation qui définit l'orientation des représentations de glyphes dans le rendu final.
Si la valeur du trait reference-orientation d'une aire est 0, alors les bords du haut, du bas, de gauche et de droite du contenu sont parallèles à ceux du parent de l'aire en question, confondus avec eux. Sinon, les bords du contenu subissent une rotation par rapport à ceux du parent, tel que décrit au chapitre [7.20.3 'reference-orientation']. Les directions de progression en-ligne et de bloc sont déterminées par l'emplacement de ces bords, tel que décrit au chapitre [7.27.7 'writing-mode'].
Le trait booléen is-reference-area détermine, ou non, si une aire établit un système de coordonnées pour la spécification des indentations. L'aire pour laquelle la valeur de ce trait est "true" est appelée aire de référence. Seule une aire de référence peut avoir une direction de progression de bloc qui diffère en cela de son parent. Une aire de référence peut être soit une aire de bloc, soit une aire en-ligne.
Le trait booléen is-viewport-area détermine, ou non, si une aire établit une ouverture, au travers de laquelle ses aires descendantes seraient visibles, qui peut être utilisée pour la présentation d'un matériel rogné ou défilant ; par exemple, pour des logiciels d'impression où on souhaite une coulure ou un découpage. L'aire pour laquelle la valeur de ce trait est "true" est appelée aire de zone de visualisation.
Une utilisation commune de la paire zone de visualisation/référence : soit l'aire de zone de visualisation V et l'aire de bloc aire de référence R, où R est le seul enfant de V et où le bord de début et le bord de fin du rectangle de contenu de R sont parallèles au bord de début et au bord de fin de V.
Chaque aire comporte les traits top-position, bottom-position, left-position et right-position qui représentent la distance entre les bords du rectangle de contenu et ceux de même nom de l'aire de référence de son plus proche ancêtre (ou de l'aire de zone de visualisation, dans le cas d'aires générées par les descendants d'objets de mise en forme dont la valeur de la propriété 'absolute-position' est "fixed") ; les traits left-offset et top-offset indiquent la quantité de décalage dans le rendu d'une aire en position relative. Ces traits reçoivent leurs valeurs pendant le processus de mise en forme ou, dans le cas d'aires en position absolue, pendant l'affinage.
La dimension de progression de bloc [N.d.T. block-progression-dimension] et la dimension de progression en-ligne [N.d.T. inline-progression-dimension] représentent l'extension du rectangle de contenu de cette aire, dans chacune de ces deux dimensions relatives.
Les autres traits :
les traits is-first et is-last, des traits booléens, qui indiquent l'ordre dans lequel des aires sont générées et retournées par un objet de mise en forme donné. Voir [6.1.1 Les définitions communes à plusieurs objets de mise en forme]. Le trait is-first a la valeur "true" pour la première aire (ou seule aire) générée et retournée par un objet de mise forme et, de même, le trait is-last a la valeur "true" pour la dernière aire (ou seule aire) ;
les traits space-before, space-after, space-start et space-end, qui indiquent la quantité d'espace en dehors du rectangle de bordure (bien que certains d'entre eux doivent parfois avoir la valeur zéro pour certaines classes d'aires).
Remarque :
Les valeurs "before", "after", "start" et "end" se rapportent à des directions relatives et sont définies plus loin ;
les traits padding-before, padding-after, padding-start et padding-end, qui indiquent l'épaisseur de chacun des quatre côtés de l'espacement ;
les traits border-before, border-after, etc., qui indiquent le style, l'épaisseur et la couleur de chacun des quatre côtés de la bordure ;
les traits background-color, background-image et d'autres, qui indiquent le rendu de l'arrière-plan d'une aire ;
le trait nominal-font, la police de l'aire, déterminée par les propriétés de police et les descendants caractères de l'objet de mise en forme générateur de l'aire (voir le chapitre [5.5.7 Les propriétés de police]).
Sauf spécifié autrement, les traits d'un objet de mise en forme se retrouvent sur chacune des aires que cet objet a générée, avec la même valeur. Voir, cependant, les chapitres [4.7.2 La construction des lignes] et [4.9.4 La bordure, l'espacement et l'arrière-plan]).
Comme décrit plus haut, le rectangle de contenu est un rectangle qui correspond aux limites internes du rectangle d'espacement, on l'emploie pour décrire les contraintes survenant sur les emplacements des aires descendantes. Il peut arriver que des parties de glyphes descendants, ou d'autres aires, apparaissent en dehors du rectangle de contenu.
En relation avec ceci, le rectangle d'allocation d'une aire, on l'emploie pour décrire les contraintes survenant sur l'emplacement de cette aire dans l'aire de son parent. Pour une aire en-ligne, il s'agit soit du rectangle d'allocation normal, soit du rectangle d'allocation élargi. Le rectangle d'allocation normal se rapporte au rectangle de contenu, dans la direction de progression de bloc, et au rectangle de bordure, dans la direction de progression en-ligne. Le rectangle d'allocation élargi correspond au rectangle de bordure. Sauf spécifié autrement, le rectangle d'allocation d'une aire correspond au rectangle d'allocation normal.
Le rectangle d'allocation normal d'une aire en-ligne
Le rectangle d'allocation élargi d'une aire en-ligne
Pour une aire de bloc, le rectangle d'allocation se rapporte au rectangle de bordure, dans la direction de progression de bloc, et s'étend en dehors du rectangle de contenu d'une quantité égale à la valeur du trait end-indent, dans la direction de progression en-ligne, et à celle du trait start-indent, dans le sens opposé.
Remarque :
L'incorporation d'un espace en dehors du rectangle de bordure d'une aire de bloc dans la direction de progression en-ligne ne joue pas sur les contraintes d'emplacement, celle-ci est destinée à une certaine compatibilité avec le modèle de la boîte de CSS.
Le rectangle d'allocation et le rectangle de contenu d'une aire de bloc
On désigne les bords d'un rectangle comme suit :
le bord d'avant [N.d.T. before-edge] est le bord qui survient en premier dans la direction de progression de bloc et perpendiculairement à celle-ci ;
le bord d'après [N.d.T. after-edge]est le bord opposé au bord d'avant ;
le bord de début [N.d.T. start-edge]est le bord qui survient en premier dans la direction de progression en-ligne et perpendiculairement à celle-ci ;
le bord de fin [N.d.T. end-edge]est le bord opposé au bord de début.
Pour cette définition, le rectangle de contenu d'une aire utilise la direction de progression en-ligne et la direction de progression de bloc de l'aire en question, mais le rectangle de bordure, le rectangle d'espacement et le rectangle d'allocation utilisent, eux, les directions de l'aire de leur parent. Ainsi, les bords désignés pour le rectangle de contenu peuvent ne pas correspondre aux bords de même nom des rectangles d'espacement, de bordure ou d'allocation. Ceci est important quand on a affaire à des aires de bloc imbriquées ayant des modes d'écriture différents.
Le schéma suivant montre les correspondances entre les divers noms des bords, dans un exemple où les modes d'écriture sont mélangés :
Chaque aire en-ligne a un point-d'alignement, déterminé par le formateur, sur le bord de début de son rectangle d'allocation ; pour une aire de glyphe, c'est un point sur le bord de début du glyphe, sur la ligne de base où celui-ci s'aligne (voir plus loin). Cela dépend de l'écriture et ne correspond pas forcément au point de coordonnées (0,0) utilisé par les données décrivant le contour du glyphe.
Dans l'arbre des aires, le jeu des aires d'un parent donné est ordonné. Les termes initial, final, précédent et suivant expriment cet ordonnancement.
Quel que soit l'arbre, celui-ci étant ordonné, cet ordre des frères s'étend à l'ordonnancement de l'arbre en entier, d'au moins deux façons.
Dans l'ordre de cheminement pré-ordonné d'un arbre, les enfants de chaque nœud (leur ordre les uns par rapport aux autres restant inchangé) suivent ce nœud, mais précèdent le frère éventuel suivant de ce nœud ou des ancêtres de celui-ci.
Dans l'ordre de cheminement post-ordonné d'un arbre, les enfants de chaque nœud précèdent ce nœud, mais suivent le frère éventuel précédent de ce nœud ou des ancêtres de celui-ci.
Les termes « précédent » et « suivant », appliqués à des éléments qui n'ont pas la même parenté, dépendent de l'ordre utilisé, obligatoirement spécifié. Cependant, quel que soit l'ordre retenu, les embranchements de l'arbre (les nœuds sans enfants) sont ordonnés sans ambiguïté.
Ce chapitre définit les notions de contraintes d'empilement de bloc et de contraintes d'empilement en-ligne concernant les aires. Celles-ci se définissent comme des relations ordonnées, c'est-à-dire, si A et B ont une contrainte d'empilement, cela ne signifie pas forcément que B et A ont en une. Ces définitions sont récursives par nature, certaines situations peuvent dépendre de cas plus simples d'une même définition. Il ne s'agit pas de circularité mais plutôt d'une conséquence de la récursion. Les objectifs de ces définitions sont d'identifier des aires, à tous les niveaux de l'arbre, celles-ci étant simplement séparées par un espace
Le trait area-class est une valeur énumérée, qui est "xsl-normal" pour une aire empilée avec d'autres aires qui se suivent. Une aire normale est une aire dont le trait area-class a la valeur "xsl-normal". Une aire de niveau page hors-ligne est une aire dont le trait area-class a les valeurs "xsl-footnote", "xsl-before-float" ou "xsl-fixed" ; l'emplacement de ces aires est contrôlé par l'ancêtre fo:page-sequence de son objet de mise en forme générateur. Une aire de niveau référence hors-ligne est une aire dont le trait a les valeurs "xsl-side-float" ou "xsl-absolute" ; l'emplacement de ces aires est contrôlé par l'objet de mise en forme générant les aires de référence concernées. Une aire d'ancre est une aire dont le trait area-class a la valeur "xsl-anchor" ; l'emplacement de ces aires est arbitraire et ne joue pas sur l'empilement. Les aires, dont le trait area-class a une valeur égale à l'une parmi "xsl-normal", "xsl-footnote" et "xsl-before-float", sont dites empilables, signifiant ainsi que ces aires sont censées avoir un empilement correct.
Les contraintes d'empilement de bloc
Si P est une aire de bloc, alors il existe une clôture précédant P, si P est une aire de référence ou si les valeurs des traits border-before-width ou padding-before-width de P sont non nulles. De la même façon, il existe une clôture suivant P, si P est une aire de référence ou si les valeurs des traits border-after-width ou padding-after-width de P sont non nulles.
Si A et B sont des aires empilables et si S est une séquence de spécifiants d'espace (voir le chapitre [4.3 Les espaces et la conditionnalité]), alors, par définition, A et B ont une contrainte d'empilement de bloc S si l'une ou l'autre des conditions suivantes est vraie :
B est une aire de bloc qui est le premier enfant normal de A et S est composée de la séquence des valeurs de trait space-before de B ;
A est une aire de bloc qui est le dernier enfant normal de B et S est composée de la séquence des valeurs de trait space-after de A ;
A et B sont des aires de bloc et, l'une ou l'autre condition, :
a. B est l'aire suivante empilable du frère de A et S est la séquence composée des valeurs de trait space-after de A et space-before de B ;
b. B est le premier enfant normal d'une aire de bloc P, B n'est pas une aire de ligne, il n'y a pas de clôture précédant P, A et P ont une contrainte d'empilement de bloc S' et S est composée de S' suivie de la valeur de trait space-before de B ;
c. A est le dernier enfant normal d'une aire de bloc P, A n'est pas une aire de ligne, il n'y a pas de clôture suivant P, P et B ont une contrainte d'empilement de bloc S'' et S est composée de la valeur de trait space-after de A suivie de S'' ;
d. A partage une contrainte d'empilement de bloc S' avec une aire de bloc E, E partage une contrainte de bloc S'' avec B, E est vide (c'est-à-dire que sa bordure, son espacement et sa dimension de progression de bloc ont une valeur nulle et celle-ci n'a pas d'enfant normal) et S est composée de S' suivie par S''.
Remarque :
L'emploi du terme « empilable » à deux endroits de la définition ci-dessus permet l'application de contraintes d'empilement de bloc entre des aires dont la valeur de trait area-class est "xsl-before-float" ou "xsl-footnote".
Les bords adjacents dans un empilement de bloc
Quand A et B ont une contrainte d'empilement de bloc, les bords adjacents de A et B forment une paire ordonnée, définie récursivement :
dans le cas 1, par le bord d'avant du rectangle de contenu de A et le bord d'avant du rectangle d'allocation de B ;
dans le cas 2, par le bord d'après du rectangle d'allocation de A et le bord d'après du rectangle de contenu de B ;
dans le cas 3a, par le bord d'après du rectangle d'allocation de A et le bord d'avant du rectangle d'allocation de B ;
dans le cas 3b, par le premier des bords adjacents entre A et P et le bord d'avant du rectangle d'allocation de B ;
dans le cas 3c, par le bord d'après du rectangle d'allocation de A et le deuxième des bords adjacents entre P et B ;
dans le cas 3d, par le premier des bords adjacents entre A et E et le deuxième des bords adjacents entre E et B.
Exemple : dans ce schéma, chaque nœud représente une aire de bloc. En supposant que tous les espacements et les épaisseurs de bordure sont nuls et qu'aucune des aires ne soit une aire de référence. Alors P et A ont une contrainte d'empilement de bloc, tout comme A et B, A et C, B et C, C et D, D et B, B et E, D et E, et E et P ; ce sont, dans le schéma, les seules paires à avoir des contraintes d'empilement de bloc. Si la valeur de la propriété 'padding-after' de B avait été non nulle, alors D et E n'auraient pas de contrainte d'empilement de bloc (bien que B et E continueraient d'en avoir une).
Un exemple de contrainte d'empilement de bloc
Les contraintes d'empilement en-ligne.
Ce chapitre définit récursivement les contraintes d'empilement en-ligne entre deux aires (soit entre deux aires en-ligne, soit entre une aire en-ligne et une aire de ligne), en même temps que les notions de clôture précédente et de clôture suivante ; ces définitions sont entremêlées. Ces définitions viennent en parallèle avec celles des contraintes d'empilement de bloc, avec cependant une difficulté supplémentaire, il peut y avoir une contrainte d'empilement entre des aires en-ligne empilées selon des directions de progression en-ligne opposées. Ceci n'est pas un problème avec les contraintes d'empilement de bloc parce qu'une aire de bloc, quand celle-ci n'est pas une aire de référence, ne peut avoir une direction de progression de bloc différente de celle de son parent.
Si P et Q ont une contrainte d'empilement en-ligne, alors P a une clôture précédant Q si P est une aire de référence, ou si la valeur de border-width, ou padding-width du premier bord adjacent entre P et Q n'est pas nulle. De la même façon, Q a une clôture suivant P, si Q est une aire de référence ou si la valeur de trait border-width, ou padding-width, du deuxième bord adjacent entre P et Q n'est pas nulle ;
Si A et B sont des aires normales et si S est une séquence de spécifiants d'espace, alors, par définition, A et B ont une contrainte d'empilement en-ligne S, si l'une ou l'autre des conditions suivantes est vraie :
A est une aire en-ligne, ou de ligne, B est une aire en-ligne qui est le premier enfant normal de A et S la séquence composée des valeurs de trait space-start de B ;
B est une aire en-ligne, ou de ligne, A est une aire en-ligne qui est le dernier enfant normal de B et S la séquence composée des valeurs de trait space-end de A ;
A et B, l'une et l'autre étant une aire en-ligne ou une aire de ligne :
a. A et B sont toutes deux des aires en-ligne, B est l'aire suivante normale de même parenté que A et S la séquence composée des valeurs de trait space-end de A et space-start de B ;
b. B est une aire en-ligne qui est le premier enfant normal d'une aire en-ligne P, P n'a pas de clôture suivant A, A et P ont une contrainte d'empilement en-ligne S', la direction de progression en-ligne de P est la même que celle de l'ancêtre commun le plus proche de A et P, et S est composée de S' suivie de la valeur de trait space-start de B ;
c. A est une aire en-ligne qui le dernier enfant normal d'une aire en-ligne P, P n'a pas de clôture précédant B, P et B ont une contrainte d'empilement en-ligne S'', la direction de progression en-ligne P est la même que celle de l'aire du plus proche ancêtre commun à P et B, et S est composée de la valeur de trait space-end de A suivie par S'' ;
d. B est une aire en-ligne qui est le dernier enfant normal d'une aire en-ligne P, P n'a pas de clôture suivant A, A et P ont une contrainte d'empilement en-ligne S', la direction de progression en-ligne de P est l'opposée de celle de l'aire du plus proche ancêtre commun à A et P, et S est composée de S' suivie par la valeur de trait space-end de B ;
e. A est une aire en-ligne qui est le premier enfant normal d'une aire en-ligne P, P n'a pas de clôture précédant B, P et B ont une contrainte d'empilement en-ligne S'', la direction de progression en-ligne de P est l'opposée de celle de l'aire du plus proche ancêtre commun à P et B, et S est composée de la valeur de trait space-start de A suivie par S''.
Les bords adjacents dans un empilement en-ligne
Les bords adjacents dans un empilement en-ligne (suite)
Des écritures mélangées : anglais et arabe
Des écritures mélangées : anglais et arabe (suite)
Quand A et B ont une contrainte d'empilement en-ligne, les bords adjacents de A et B forment une paire ordonnée, définie :
dans le cas 1, par le bord de début du rectangle de contenu de A et le bord de début du rectangle d'allocation de B ;
dans le cas 2, par le bord de fin du rectangle d'allocation de A et le bord de fin du rectangle de contenu de B ;
dans le cas 3a, par le bord de fin du rectangle d'allocation de A et le bord de début du rectangle d'allocation de B ;
dans le cas 3b, par le le premier des bords adjacents entre A et P et le bord de début du rectangle d'allocation de B ;
dans le cas 3c, par le bord de fin du rectangle d'allocation de A et le deuxième des bords adjacents entre P et B ;
dans le cas 3d, par le premier des bords adjacents entre A et P et le bord de fin du rectangle d'allocation de B ;
dans le cas 3e, par le bord de début du rectangle d'allocation de A et le deuxième des bords adjacents entre P et B.
Deux aires sont dites adjacentes quand celles-ci ont des contraintes d'empilement de bloc ou en-ligne. Il découle de ces définitions que des aires de même type (en-ligne ou bloc) ne peuvent être adjacentes que si tous leurs ancêtres non communs sont aussi du même type (ces ancêtres jusqu'à leur ancêtre commun le plus proche, mais celui-ci exclus). Ainsi, par exemple, deux aires en-ligne situées dans des aires de ligne différentes ne sont jamais adjacentes.
Une aire A commence une aire P, si A est un descendant de P et si P et A ont une contrainte d'empilement de bloc ou bien en-ligne. Dans ce cas, le deuxième des bords adjacents entre P et A se définit comme le bord de tête dans P. Un spécifiant d'espace, qui s'applique au bord de tête, se définit aussi comme commençant P.
De la même façon, une aire A termine une aire P, si A est un descendant de P et si A et P ont une contrainte d'empilement de bloc ou bien en-ligne. Dans ce cas, le premier des bords adjacents entre A et P se définit comme le bord de queue dans P. Un spécifiant d'espace, qui s'applique au bord de queue, se définit comme terminant P.
Chaque écriture a une « ligne de base » préférée pour l'alignement de ses glyphes. Les écritures occidentales ont typiquement une ligne de base « alphabétique », qui touche ou s'approche du bas des lettres en majuscules. De plus, pour chaque police, il y a une manière préérée pour l'alignement des glyphes incorporées à partir de différentes écritures, par exemple, pour une police occidentale, il existe des lignes de base séparées pour l'alignement et l'incorporation de glyphes d'idéogrammes ou de glyphes indiens.
Chaque aire, de bloc ou en-ligne, possède un trait dominant-baseline-identifier dont la valeur est un identifiant de ligne de base qui correspond au type d'alignement attendu pour les descendants des aires en-ligne de l'aire en question, et chaque aire en-ligne possède un trait alignment-baseline qui spécifie comment celle-ci s'aligne par rapport à son parent. L'interprétation de ces traits est décrite au chapitre [7.8.1 Les polices et les données de police].
Pour chaque police, un trait actual-baseline-table fait correspondre ces identifiants avec des points sur le bord de début d'une aire donnée. Par un abus de langage, on appelle « ligne de base dominante », dans la direction de progression en-ligne, la ligne qui passe par le point correspondant au trait dominant-baseline-identifier.
Un spécifiant d'espace est un type de données aggloméré, dont les composants représentent un minimum, un optimum, un maximum, une conditionnalité et une préséance.
Les longueurs minimum, optimum et maximum peuvent être utilisées pour définir une contrainte de distance, qui devrait être un optimum de préférence et, dans tous les cas, pas moins que le minimum ni plus que le maximum. Chacune de ces valeurs peut être négative, provoquant, par exemple, le recouvrement des aires, mais, dans tous les cas, le minimum devrait être inférieur ou égal à la valeur de l'optimum, elle-même inférieure ou égale à celle du maximum.
La conditionnalité correspond à une valeur énumérée qui détermine si un spécifiant d'espace agit au début, ou bien à la fin, d'une aire de référence ou d'une aire de ligne. Les valeurs admises sont "retain" et "discard" ; un spécifiant d'espace conditionnel a une valeur "discard".
La préséance admet pour valeur soit un entier, soit le jeton spécial "force". Un spécifiant d'espace impératif aura la valeur "force".
Les spécifiants d'espace qui surviennent en séquence peuvent interagir. La contrainte imposée par une séquence de spécifiants d'espace est déterminée, pour chacun d'entre eux, par le calcul du spécifiant d'espace résolu qui leur est associé, en fonction de leur conditionnalité et de leur préséance, ainsi que le montre plus loin les règles de résolution d'espace.
La contrainte imposée sur une distance, par une séquence de spécifiants d'espace résolus, est additive, ce qui veut dire que cette distance contrainte n'est pas inférieure à la somme des valeurs minimum résolues ni supérieure à celle des valeurs maximum résolues.
Le spécifiant d'espace résolu d'un spécifiant d'espace donné S se calcule ainsi. Soit la contrainte maximale d'empilement en-ligne, ou de bloc, S'', qui contient le spécifiant d'espace S, celui-ci étant un élément de la séquence (S'' est une séquence de spécifiants d'espace ; voir le chapitre [4.2.5 Les contraintes d'empilement]). Soit S', une sous-séquence de S'', définie comme suit :
si S est la valeur de trait space-before, ou space-after, d'une aire de ligne, alors S' est la sous-séquence maximale de S'' contenant S telle que tous les spécifiants d'espace de S' sont des traits d'aires de ligne ;
si S est la valeur de trait space-before, ou space-after, d'une aire de bloc qui n'est pas une aire de ligne, alors S' est la sous-séquence maximale de S'' contenant S telle que tous les spécifiants d'espace de S' sont des traits d'aires de bloc qui ne sont pas des aires de ligne ;
si S est la valeur de trait space-start, ou space-end, d'une aire en-ligne, alors S' correspond à S'' en entier.
Le spécifiant d'espace résolu de S est un spécifiant d'espace non conditionnel, impératif, calculé en fonction de la séquence S' :
Si l'un des spécifiants d'espace de S' est conditionnel et commence une aire de référence, ou une aire de ligne, alors celui-ci est supprimé, ce qui veut dire que son spécifiant d'espace résolu est nul. En outre, tous les spécifiants d'espace conditionnels consécutifs, qui le suivent dans la séquence, sont également supprimés ;
Si un spécifiant d'espace conditionnel termine une aire de référence, ou une aire de ligne, alors
celui-ci est supprimé, tout comme les autres spécifiants d'espace conditionnels consécutifs, qui
le précèdent dans la séquence ;
« errata-E2 »
Si, parmi les spécifiants d'espace restants de S', l'un est impératif, tous ceux non impératifs sont supprimés et la valeur de chacun des spécifiants d'espace est censée être sa valeur résolue ;
À l'inverse, si aucun des spécifiants d'espace restants dans S' n'est impératif, alors un spécifiant d'espace résolu se définit selon les spécifiants d'espace non supprimés, ceux dont la valeur numérique de préséance est la plus élevée et, parmi ces derniers, ceux dont la valeur optimum est la plus grande. Tous les autres spécifiants d'espace sont supprimés. S'il n'y a qu'un seul spécifiant, alors on considère sa valeur comme étant sa valeur résolue.
Sinon, quand il y a deux ou plus spécifiants d'espace, tous ayant la même plus haute valeur de préséance et le même plus grand optimum, suivre ces règles : le spécifiant d'espace résolu du dernier spécifiant d'espace de la séquence s'établit à partir de ceux-ci, sa valeur optimum reprend la valeur optimum commune. Sa valeur minimum est la plus grande des valeurs minimum. Sa valeur maximum est la plus petite des valeurs maximum. Tous les autres spécifiants d'espace sont supprimés ;
Si S fait l'objet d'un relâchement de sur-contrainte, alors sa valeur maximum prend la valeur courante de la dimension de progression de bloc de l'aire de bloc conteneur. Voir le chapitre [4.3.2 Les spécifiants d'espace sur-contraints].
Exemple : soit une séquence d'espaces survenant au début d'une aire de référence. Premièrement, un espace avec une valeur de 10 points (c'est-à-dire, le minimum, l'optimum et le maximum ont tous cette même valeur) et une valeur de conditionnalité "discard" ; deuxièmement, un espace avec une valeur de 4 points et une valeur de conditionnalité "retain" ; et troisièmement, un espace avec une valeur de 5 points et une valeur de conditionnalité "discard";, les trois espaces ayant une valeur de préséance nulle. Le premier espace (10 points) est supprimé, du fait de la règle 1, et le second espace (4 points) aussi, du fait de la règle 3. La valeur résolue du troisième espace est de 5 points, c'est un espace non conditionnel, bien qu'il soit issu d'un espace qui l'était.
L'espacement d'une aire de bloc n'interfère pas avec les spécifiants d'espace (sauf que, par définition, la présence d'un espacement au bord d'avant ou au bord d'après empêche les aires, de part et d'autre de ceux-ci, d'avoir des contraintes d'empilement).
La bordure ou l'espacement, au bord d'avant ou d'après d'une aire de bloc B, peuvent avoir une spécification conditionnelle. Quand c'est le cas, alors leur valeur devient nulle, si le bord qui lui est associé est le bord de tête d'une aire de référence et la valeur du trait is-first de B est "false", ou encore, si le bord qui lui est associé est le bord de queue d'une aire de référence et la valeur du trait is-last de B est "false". Dans l'un ou l'autre cas, on donne une valeur zéro à la bordure, ou l'espacement, pour les besoins des définitions des contraintes d'empilement.
La bordure ou l'espacement, au bord d'avant ou d'après d'une aire en-ligne I, peuvent avoir une spécification conditionnelle. Quand c'est le cas, alors leur valeur devient nulle, si le bord qui lui est associé est le bord de tête d'une aire de ligne et la valeur du trait is-first de I est "false", ou encore, si le bord qui lui est associé est le bord de queue d'une aire de ligne et la valeur du trait is-last de I est "false". Dans l'un ou l'autre cas, on donne une valeur zéro à la bordure, ou l'espacement, pour les besoins des définitions des contraintes d'empilement.
Quand une aire de bloc P est générée par un objet de mise en forme, dont la valeur du trait block-progression-dimension est "auto", les contraintes, qui concernent les bords d'avant et d'après du rectangle de contenu de P ainsi que celles entre les divers descendants de P, s'expriment par une contrainte sur la dimension de progression de bloc courante. Si ce trait avait reçu une valeur de longueur, alors cela pouvait aboutir à un arbre des aires sur-contraint, par exemple, un objet de mise en forme fo:block incomplètement rempli pour la taille spécifiée. Dans ce cas, certaines contraintes entre P et ses descendants devraient être relâchées ; celles des contraintes éligibles pour ce traitement sont qualifiées de sujettes à relâchement de sur-contraintes et traitées comme indiqué dans le chapitre précédent.
Si la valeur de la propriété 'display-align' est "after", ou "center", et si P est la première aire normale générée par l'objet de mise en forme, alors la valeur de trait space-before du premier enfant normal de P est sujet à relâchement de sur-contrainte ;
Si la valeur de la propriété 'display-align' est "before", ou "center", et si P est la dernière aire normale générée par l'objet de mise en forme, alors la valeur de trait space-after du dernier enfant normal de P est sujet à relâchement de sur-contrainte.
Les aires de bloc possèdent plusieurs traits qui ont une action typique sur le placement de leurs enfants. La propriété 'line-height' est utilisée pour le calcul des dispositions des lignes. Le trait line-stacking-strategy détermine le genre d'allocation utilisé pour les aires de ligne descendantes, celui-ci admet une valeur énumérée (soit "font-height", "max-height" ou "line-height"). Ceci est décrit rigoureusement plus loin. Toutes les aires possèdent ces traits, mais ceux-ci ne sont pertinents que pour les aires qui ont des aires de ligne enfants empilées.
Les traits space-before et space-after déterminent la distance entre une aire de bloc et les aires de bloc qui l'entourent.
La taille typique d'une aire de bloc, celle-ci n'étant pas une aire de ligne, dans la direction de progression en-ligne, est déterminée par les valeurs des propriétés 'start-indent' et 'end-indent' et par celle de l'aire de référence de son plus proche ancêtre. Une aire de bloc, qui n'est pas une aire de ligne, doit être correctement empilée (comme défini plus loin au chapitre [4.4.1 Les aires de bloc empilées]), à moins que la description de son objet de mise en forme générateur ne le spécifie autrement. Dans ce cas, la valeur de son trait block-progression-dimension fera l'objet de contraintes basées sur la valeur de la propriété 'block-progression-dimension' et de celle des spécifiants d'espace de ses descendants. Voir le chapitre [4.3.2 Les spécifiants d'espace sur-contraints].
Les aires de bloc enfants d'une aire sont typiquement empilées dans la direction de progression de bloc, dans l'aire de leur parent, c'est la méthode de disposition des aires de bloc par défaut. Cependant, les objets de mise en forme sont libres de spécifier d'autres méthodes de positionnement, pour les aires enfants des aires que ces objets génèrent, par exemple, les items de liste ou les tables.
Pour une aire parent P, dont les enfants sont des aires de bloc, par définition, on dit que P est correctement empilée si toutes les conditions suivantes sont vraies :
pour chaque aire de bloc B, descendant de P, il faut que :
le bord d'avant et d'après de son rectangle d'allocation soient parallèles à ceux du rectangle de contenu de P ;
le bord de début de son rectangle d'allocation soit parallèle à celui du rectangle de contenu de R (où R est l'aire de référence de l'ancêtre le plus proche de B) et se décale de celui-ci vers l'intérieur d'une distance égale à la valeur de trait start-indent, plus la valeur de trait start-intrusion-adjustment (défini plus loin) et moins les valeurs de trait border-start, padding-start et space-start de l'aire de bloc ;
le bord de fin de son rectangle d'allocation soit parallèle à celui du rectangle de contenu de R et se décale de celui-ci vers l'intérieur d'une distance égale à la valeur de trait end-indent, plus la valeur de trait end-intrusion-adjustment (défini plus loin) et moins les valeurs de trait border-end, padding-end et space-end de l'aire de bloc.
Le rectangle de contenu d'une aire de référence
Remarque :
La notion d'indentation se destine au rectangle de contenu, mais une contrainte se définit en fonction du rectangle d'allocation, car, comme mentionné plus tôt ([4.2.3 Les définitions géométriques]), les bords du rectangle de contenu ne correspondent pas forcément à leurs homologues nommés du rectangle d'allocation.
Les traits start-intrusion-adjustment et end-intrusion-adjustment sont utilisés pour la gestion des intrusions des flottants dans la direction de progression en-ligne.
pour chaque paire d'aires normales B et B' dans le sous-arbre en-dessous de P, si B et B' ont une contrainte d'empilement de bloc S et si B n'est pas vide (voir le chapitre [4.2.5 Les contraintes d'empilement]), alors la distance entre les bords adjacents de B et B' est cohérente avec la contrainte imposée par les valeurs résolues des spécifiants d'espace de S.
Exemple : dans le schéma, si la valeur de trait space-after de A est 3 points, celle de space-after de B est 1 point et celle de space-before de C est 2 points, toutes les valeurs de préséance des aires étant "force" et celles de leurs bordures et de leurs espacements étant nulles, alors les contraintes placeront le rectangle d'allocation de B, 4 points en-dessous de celui de A, et le rectangle d'allocation de C, 6 points en-dessous de celui de A. Ainsi, l'intervalle de 4 points recevra la couleur d'arrière-plan de P et celui de 2 points, avant C, la couleur d'arrière-plan de B.
Les ajustements des intrusions (start-intrusion-adjustment et end-intrusion-adjustment) définissent la prise en compte de l'indentation qui surviendrait du fait de flottants latéraux.
Si A et B sont des aires qui partagent la même aire de référence de l'ancêtre le plus proche, alors on définit A et B comme se recouvrant en-ligne quand il existe une ligne, parallèle à la direction de progression en-ligne, qui coupe à la fois les rectangles d'allocation de A et de B.
Si A est une aire de la classe xsl-side-float
avec le trait float = "start",
B étant une aire de bloc, et si A et B partagent la même
aire de référence de l'ancêtre le plus proche, alors on définit A
comme empiétant sur B, quand A et B se recouvrent en-ligne et
quand la valeur de trait start-indent de B est inférieure à
la somme des valeurs de trait start-indent de A et inline-progression-dimension
de A. L'empiètement de début de A sur B se
définit alors comme la différence entre la valeur de trait
start-indent de B et la somme des valeurs de trait start-indent de
A et inline-progression-dimension de A.
Si A est une aire de la classe xsl-side-float
avec le trait float = "end",
B étant une aire de bloc, et si A et B partagent la même
aire de référence de l'ancêtre le plus proche, alors on définit A
comme empiétant sur B, quand A et B se recouvrent en-ligne
et quand la valeur de trait end-indent de B est inférieure à
la somme des valeurs de trait end-indent de A et
inline-progression-dimension de A. L'empiètement de fin de A sur
B se définit alors comme la différence entre la valeur de trait
end-indent de B et la somme des valeurs de trait end-indent de A
et inline-progression-dimension de A.
Si B est une aire de bloc, celle-ci n'étant pas une aire de ligne, la valeur du trait start-intrusion-adjustment local est calculée à partir du maximum entre les valeurs de longueur suivantes :
zéro ;
si le parent de B n'est pas une aire de référence : la valeur de trait start-intrusion-adjustment du parent de B ;
si B a la valeur de trait intrusion-displace = "block", alors pour chaque aire de A
de la classe xsl-side-float
avec le trait float = "start", tel que l'objet de mise en
forme générateur de A n'est pas un descendant de celui de B et tel
que A empiète sur une aire de ligne enfant de B : la valeur du début
d'empiètement de A sur B ;
si B a la valeur de trait intrusion-displace = "block", alors pour chaque aire de A
de la classe xsl-side-float
avec le trait float = "start", tel que A et
B se recouvrent en-ligne, et pour chaque aire de bloc ancêtre B' de
B qui est un descendant de l'aire de référence de l'ancêtre le plus
proche de B, tel que A empiète sur une aire de ligne enfant de B' :
la valeur du début d'empiètement de A sur B'.
La valeur du trait start-intrusion-adjustment d'une aire de bloc B se définit alors comme le maximum entre les valeurs des traits start-intrusion-adjustment locaux de l'aire de bloc normale, générée et retournée par l'objet de mise en forme générateur de B.
Si L est une aire de ligne, alors la valeur de son trait start-intrusion-adjustment est calculée à partir du maximum entre les valeurs de longueur suivantes :
la valeur du trait start-intrusion-adjustment du parent de L ;
pour chaque aire A de la classe xsl-side-float
avec le trait float = "start"
tel que A empiète sur L : la valeur de l'empiètement du début
de A sur L ;
si le parent de L a la valeur de trait intrusion-displace = "indent", alors pour chaque aire
A de la classe xsl-side-float
avec le trait float = "start", tel que
A et L se recouvrent en-ligne, et pour chaque aire de bloc ancêtre
B' de L, un descendant de l'aire de référence de l'ancêtre de
L, tel que A empiète sur une aire de ligne enfant L' de
B' : la valeur de l'empiètement de début de A sur B'.
La valeur du trait end-intrusion-adjustment d'une aire de bloc se calcule précisément d'une manière analogue. C'est-à-dire :
Si B est une aire de bloc, celle-ci n'étant pas une aire de ligne, alors la valeur de son trait end-intrusion-adjustment local se calcule à partir du maximum entre les valeurs de longueur suivantes :
zero ;
si le parent de B n'est pas une aire de référence : la valeur de trait end-intrusion-adjustment du parent de B ;
si B a la valeur de trait intrusion-displace = "block", alors pour chaque aire A
de la classe xsl-side-float
avec le trait float = "end", tel que l'objet de mise en
forme générateur de A n'est pas un descendant de celui de B et tel
que A empiète sur une aire de ligne enfant de B : la valeur de
l'empiètement de fin de A sur B ;
si B a la valeur de trait intrusion-displace = "block", alors pour chaque aire A
de la classe xsl-side-float
avec le trait float = "end", tel que A et
B se recouvrent en-ligne, et pour chaque aire de bloc ancêtre B' de
B, un descendant de l'aire de référence de l'ancêtre le plus proche de
B, tel que A empiète sur une aire de ligne enfant de B' : la
valeur de l'empiètement de fin de A sur B'.
La valeur de trait end-intrusion-adjustment d'une aire de bloc B se définit comme étant le maximum entre les valeurs des traits end-intrusion-adjustment locaux des aires de blocs normales, générées et retournées par l'objet de mise en forme générateur de B.
Si L est une aire de ligne, alors la valeur de son trait end-intrusion-adjustment se calcule à partir du maximum entre les valeurs de longueur suivantes :
la valeur du trait end-intrusion-adjustment du parent de L ;
pour chaque aire A de la classe xsl-side-float
avec le trait float = "end"
tel que A empiète sur L : la valeur de l'empiètement de fin de
A sur L ;
si le parent de L a la valeur de trait intrusion-displace = "indent", alors pour chaque aire
A de la classe xsl-side-float
avec le trait float = "end", tel que
A et L se recouvrent en-ligne, et pour chaque aire de bloc ancêtre
B' de L, un descendant de l'aire de référence de l'ancêtre le
plus proche de L, tel que A empiète sur une aire de ligne enfant
L' de B' : la valeur de l'empiètement de fin de A sur
B'.
« errata-E3 »
Une aire de ligne, un genre particulier d'aire de bloc, est générée par le même objet de mise en forme qui a généré son parent. Les aires de ligne n'ont pas de bordure ni d'espacement, c'est-à-dire que les valeurs de leurs traits border-before-width, padding-before-width, etc. sont toutes nulles. Les aires en-ligne sont empilées dans une aire de ligne par rapport au point de départ de ligne de base, un point déterminé par le formateur sur le bord de début du rectangle de contenu de l'aire de ligne.
Le rectangle d'allocation d'une ligne est déterminé par la valeur du trait line-stacking-strategy : si cette valeur est "font-height", le rectangle d'allocation correspond au rectangle de ligne nominal requis, défini plus loin ; si cette valeur est "max-height", celui-ci correspond au rectangle de ligne maximum, défini plus loin ; et si cette valeur est "line-height", celui-ci correspond au rectangle par hauteur en-ligne, défini plus loin. Quand la valeur du trait line-stacking-strategy est "font-height" ou "false", les traits space-before et space-after prennent tous deux comme valeur celle du demi-interlignage, autrement ils ont une valeur nulle.
Le rectangle de ligne nominal requis d'une aire de ligne correspond au rectangle dont le bord de début est parallèle à celui du rectangle de contenu de l'aire de référence de l'ancêtre le plus proche, décalé de ce dernier, de la somme des valeurs des traits start-indent et start-intrusion-adjustment de l'aire de ligne, dont le bord de fin est parallèle à celui du rectangle de contenu de l'aire de référence du plus proche ancêtre, décalé de ce dernier, de la somme des valeurs des traits; end-indent et end-intrusion-adjustment de l'aire de ligne, dont le bord d'avant est séparé du point de départ de ligne de base par la valeur de trait text-altitude de l'aire de bloc parent, et dont le bord d'après est séparé du point de départ de ligne de base par la valeur de trait text-depth de l'aire de bloc parent. La dimension de progression de bloc de ce rectangle est la même pour chacune des aires de ligne enfants d'une aire de bloc.
Le rectangle de ligne maximum d'une aire de ligne correspond au rectangle dont les bords de-début et de-fin sont parallèles et coïncidents, respectivement, à ceux du rectangle de ligne nominal requis et dont l'étendue, dans la direction de progression de bloc, correspond au minimum requis pour contenir à la fois le rectangle de ligne nominal requis et les rectangles d'allocation de toutes les aires en-ligne empilées dans l'aire de ligne ; ceci est variable et dépend des descendants de l'aire de ligne.
Les rectangles de ligne nominaux et maximum
Le rectangle par hauteur en-ligne d'une aire de ligne correspond au rectangle dont les bords de début et de fin sont parallèles et coïncidents, respectivement, à ceux du rectangle de ligne nominal requis et dont l'étendue, dans la direction de progression de bloc, se détermine comme suit.
Le rectangle élargi d'une aire en-ligne correspond au rectangle dont les bords de début et de fin coïncident avec ceux du rectangle d'allocation de cette aire et dont les bords d'avant et d'après se trouvent en dehors de ceux du rectangle d'allocation d'une distance qui est égale soit (a.) au demi-interlignage, quand le rectangle d'allocation de l'aire est spécifié comme étant le rectangle d'allocation normal par l'objet de mise en forme générateur, soit (b.) aux valeurs des traits space-before et space-after, respectivement, quand le rectangle d'allocation de l'aire est spécifié comme étant le rectangle d'allocation élargi. Le rectangle de ligne nominal requis élargi correspond au rectangle dont les bords de début et de fin coïncident avec ceux du rectangle de ligne nominal requis et dont les bords d'avant et d'après se trouvent en dehors de ceux du rectangle de ligne nominal requis d'une distance égale au demi-interlignage.
L'étendue du rectangle par hauteur en-ligne, dans la direction de progression de bloc, se définit alors comme étant le minimum requis pour contenir à la fois le rectangle de ligne nominal requis élargi et les rectangles élargis de toutes les aires en-ligne empilées dans l'aire de ligne ; ceci est variable et dépend des descendants de l'aire de ligne.
Remarque :
L'utilisation du rectangle de ligne nominal requis permet un espacement égal entre les lignes de base. L'utilisation du rectangle de ligne maximum permet un espace constant entre les aires de ligne. L'utilisation du rectangle par hauteur en-ligne, conjointement avec une valeur nulle pour les traits space-before et space-after, permet un empilement à la manière des boîtes de ligne en CSS. Également, la valeur du demi-interlignage est comprise dans le rectangle élargi, indépendamment de la conditionnalité, ainsi une valeur de conditionnalité "discard" pour la hauteur de ligne n'a aucun effet dans ce cas.
Une aire en-ligne possède son propre trait line-height, qui peut être différent de celui de l'aire de bloc la contenant. La disposition de son aire de ligne ancêtre peut en être affectée, quand la valeur du trait line-stacking-strategy est "line-height". Une aire en-ligne possède un trait actual-baseline-table pour son trait nominal-font. Elle a un trait dominant-baseline-identifier qui détermine comment aligner les aires en-ligne empilées qui en descendent.
Une aire en ligne peut avoir, ou non, des aires enfants, et, si c'est le cas, celle-ci peut être, ou non, une aire de référence. Les dimensions du rectangle de contenu d'une aire en-ligne sans enfants se calculent comme spécifiées par l'objet de mise en forme générateur, tout comme celles d'une aire en-ligne ayant des aires de bloc enfants.
Une aire en-ligne, avec des aires en-ligne enfants, a un rectangle de contenu qui s'étend, à partir de sa ligne de base dominante (voir [4.2.6 Les tables de ligne de base des polices]), de la valeur de son trait text-depth, dans la direction de progression de bloc, et de la valeur de son trait text-altitude, dans la direction opposée ; dans la direction de progression en-ligne, elle s'étend du bord de début du rectangle d'allocation de son premier enfant au bord de fin du rectangle d'allocation de son dernier enfant. Le rectangle d'allocation d'une telle aire en-ligne correspond au rectangle de contenu.
Le rectangle d'allocation d'une aire en-ligne, sans enfants, correspond soit au rectangle d'allocation normal, soit au rectangle d'allocation élargi, tel que spécifié dans la description de l'objet de mise en forme générateur.
Remarque :
Quand la valeur du trait line-stacking-strategy est "line-height", l'allocation a lieu en fonction du rectangle élargi.
Un exemple d'aires en-ligne avec des enfants pourraient comporter des parties d'expressions mathématiques en-ligne, ou encore des aires survenant de systèmes d'écriture mélangés (un sens d'écriture de gauche-à-droite dans un sens de droite-à-gauche).
Les aires en-ligne enfants d'une aire sont typiquement empilées dans la direction de progression en-ligne, dans l'aire de leur parent, c'est la méthode de positionnement des aires en-ligne par défaut.
Les aires en-ligne sont empilées en fonction de la valeur du trait dominant-baseline, telle que définie au chapitre [4.2.6 Les tables de ligne de base des polices].
Pour une aire parent P, dont les enfants sont des aires en-ligne, on définit P comme étant correctement empilée, si toutes les conditions suivantes sont vraies :
pour chaque aire en ligne I descendante de P, les bords de-début, de-fin, d'avant et d'après du rectangle d'allocation de I sont parallèles aux bords respectifs du rectangle de contenu de l'aire de référence du plus proche ancêtre de I ;
pour chaque paire d'aires normales I et I' du sous-arbre en-dessous de P, si I et I' ont une contrainte d'empilement en-ligne S, alors la distance entre les bords adjacents de I et I'' est cohérente avec la contrainte imposée par les valeurs résolues des spécifiants d'espace de S ;
pour chaque aire en-ligne I descendante de P, la valeur de glissement de direction [N.d.T. shift-direction], à partir du trait dominant-baseline de P jusqu'au point-d'alignement de I, équivaut au décalage entre la ligne de base dominante et la ligne de base de P, cette dernière correspondant à la valeur du trait alignment-baseline de I, plus la somme des glissements de direction de I et de tous ceux de ses ancêtres qui sont des descendants de P.
Le calcul de la première partie de l'équivalence est réalisé pour la compensation de systèmes d'écriture mélangés ayant différents types de ligne de base, la seconde partie tient compte de glissements de ligne de base délibérés, comme des écritures en exposant ou en indice.
L'aire en-ligne la plus commune est l'aire de glyphe, elle contient la représentation d'un ou plusieurs caractères dans une police donnée.
Une aire de glyphe possède un trait nominal-font associé, déterminé par les traits typographiques de l'aire, celui-ci s'applique aux données du caractère, et un trait glyph-orientation, contrôlé par les propriétés 'writing-mode' et 'reference-orientation', qui détermine l'orientation du glyphe au moment de son rendu.
Le point-d'alignement et le trait dominant-baseline-identifier d'une aire de glyphe sont attribués en fonction du système d'écriture en usage (par exemple, la ligne de base du glyphe pour les écritures occidentales), ceux-ci servent au contrôle de la disposition des aires en-ligne descendantes d'une aire de ligne. Le formateur peut générer des aires en-ligne, avec des directions de progression en-ligne différentes de celles de leur parent, pour obtenir un empilement correct de celles-ci dans le cas de systèmes d'écriture mélangés.
Une aire de glyphe n'a pas d'enfant. Les valeurs des traits block-progression-dimension et actual-baseline-table sont les mêmes pour tous les glyphes dans une police donnée. Les mises en œuvre conformes peuvent choisir de baser le calcul de la valeur de block-progression-dimension d'une aire de glyphe sur la taille réelle du glyphe, plutôt que d'employer une taille commune pour tous les glyphes dans une police donnée.
Un sous-ensemble S, formé des aires retournées à un objet de mise en forme, est dit correctement ordonné, si les aires de ce sous-ensemble sont dans le même ordre que les objets de mise en forme qui les ont générées. Plus précisément, si A1 et A2 sont des aires de S, celles-ci retournées par les objets de mise en forme F1 et F2 de l'enfant, où F1 précède F2, alors A1 doit précéder A2 dans l'ordre de cheminement pré-ordonné de l'arbre des aires. Si F1 est égal à F2 et si A1 est retourné avant A2, alors A1 doit précéder A2 dans l'ordre de cheminement pré-ordonné de l'arbre des aires.
Pour chaque objet de mise en forme F et pour chaque classe d'aires C, le sous-ensemble constitué des aires retournées à F avec la classe d'aire C doit être correctement ordonné, sauf spécifié autrement.
Ce chapitre décrit les contraintes d'ordonnancement qui s'appliquent à un objet de mise en forme fo:block ou à un objet similaire de type bloc.
Un objet de mise en forme de type bloc F, qui construit des lignes, accomplit cette opération en construisant des aires de bloc, qu'il retourne à son objet de mise en forme parent, et en disposant les aires normales et/ou les aires d'ancre, retournées à lui par les objets de mise en forme de son enfant, comme les enfants de ces aires de bloc ou des aires de ligne, qu'il construit alors comme des enfants de ces aires de bloc.
Pour chacun de tels objets de mise en forme F, on doit pouvoir former un partitionnement ordonné P, celui-ci constitué de sous-ensembles ordonnés S1, S2, ..., Sn des aires normales et des aires d'ancre retournées par les objets de mise en forme de l'enfant, de manière à ce que toutes les conditions suivantes soient satisfaites :
Chaque sous-ensemble est constitué d'aires en-ligne, ou d'une seule aire de bloc ;
L'ordonnancement du partitionnement reflète celui de l'arbre des objets de mise en forme. Plus précisément, si A est dans Si et B est dans Sj, avec i < j, ou si A et B sont tous deux dans le même sous-ensemble Si, A étant avant B dans l'ordre du sous-ensemble, alors soit A est retourné par un objet de mise en forme précédent de même parenté, soit A et B sont retournés par le même objet de mise en forme, A étant retourné avant B ;
Le partitionnement survient à une coupure de ligne légale. Plus précisément, si A est la dernière aire de Si et B la première aire Si+1, alors les règles de la langue et de l'écriture en vigueur doivent autoriser une coupure de ligne entre A et B, dans le contexte de toutes les aires de Si et Si+1 ;
Les coupures de ligne forcées sont respectées. Plus précisément, si A est l'aire de glyphe, générée par un objet de mise en forme fo:character, dont le caractère Unicode est U+000A, alors A doit être la dernière aire dans le sous-ensemble Si qui la contient ;
Le partitionnement suit l'ordonnancement de l'arbre des aires, sauf pour certaines substitutions ou suppressions de glyphes. Plus précisément, si B1, B2, ..., Bp sont les aires enfants normales de l'aire ou des aires retournées par F (ordonnées selon un cheminement pré-ordonné de l'arbre des aires), alors il existe une correspondance, une-à-une, entre ces aires enfants et les sous-ensemble de partitionnement (c'est-à-dire, n = p), et quel que soit i :
si Si est constitué d'une seule aire de bloc, alors Bi est cette aire de bloc ;
si Si est constitué d'aires en-ligne, alors Bi est une aire de ligne dont les aires enfants sont les mêmes aires en-ligne que dans Si, dans le même ordre, sauf quand les règles de la langue et de l'écriture en vigueur appellent la substitution, l'insertion ou la suppression d'aires de glyphe, alors ces aires de glyphe, substituées ou insérées, apparaissent dans l'arbre des aires aux emplacements correspondants, les aires de glyphe supprimées n'apparaissant pas dans l'arbre. Des suppressions surviennent quand une aire de glyphe, la dernière dans un sous-ensemble Si, a la valeur "suppress" pour son trait suppress-at-line-break, pourvu que i < n et que Bi+1 soit une aire de ligne. Des suppressions surviennent aussi quand une aire de glyphe, la première dans un sous-ensemble Si, a la valeur "suppress" pour son trait suppress-at-line-break, pourvu que i > 1 et que Bi-1 soit une aire de ligne. Les insertions et les substitutions peuvent survenir du fait de l'addition de tirets ou de changements d'orthographe causés par une césure, de la construction d'une image de glyphe à partir d'une syllabisation ou de la formation d'une ligature.
Les substitutions, en remplacement d'une séquence d'aires de glyphe par une seule, ne devraient survenir seulement quand les valeurs de marge, de bordure et d'espacement dans la direction de progression en-ligne (au début et en fin), de glissement de ligne de base et de trait letter-spacing sont nulles, quand la valeur de trait treat-as-word-space est "false" et quand les valeurs de tous les autres traits concernés correspondent (c'est-à-dire, alignment-adjust, alignment-baseline, les traits de couleur, les traits d'arrière-plan, dominant-baseline-identifier, les traits de police, text-depth, text-altitude, glyph-orientation-horizontal, glyph-orientation-vertical, line-height, line-height-shift-adjustment, text-decoration, text-shadow).
Remarque :
Les aires de ligne ne reçoivent pas les traits d'arrière-plan ou le trait text-decoration de l'objet de mise en forme qui les génère, ou tout autre trait qui nécessiterait la génération d'une marque lors du rendu.
Ce chapitre décrit les contraintes d'ordonnancement pour un objet de mise en forme fo:inline ou un objet similaire de type en-ligne.
Un objet de mise en forme de type en-ligne F, qui construit une ou plusieurs aires en-ligne, accomplit cette opération en disposant des aires en-ligne normales et/ou des aires en-ligne d'ancre, retournées à lui par les objets de mise en forme de son enfant, comme les enfants des aires en-ligne que lui-même génère.
Pour chacun de tels objets de mise en forme F, on doit pouvoir former un partitionnement ordonnée
P, constitué de sous-ensembles ordonnés S1,
S2, ..., Sn des aires en-ligne normales et/ou d'ancre
retournées par les objets de mise en forme de l'enfant, de manière à ce que les conditions
suivantes soient toutes satisfaites :
« errata-E4 »
Chaque sous-ensemble est constitué d'une séquence d'aires en-ligne, ou d'une seule aire de bloc ;
L'ordonnancement du partitionnement suit celui de l'arbre des objets de mise en forme, tel que défini précédemment ;
Le partitionnement survient aux coupures de ligne légales, tel que défini précédemment ;
Les coupures de lignes forcées sont respectées, tel que défini précédemment;
Le partitionnement suit l'ordonnancement de l'arbre des aires, sauf pour certaines substitutions ou suppressions de glyphes, tel que défini précédemment.
Les conditions de rétention et de coupure s'appliquent à des classes d'aires, typiquement des aires de référence de page, des aires de colonne ou des aires de ligne. On se réfère à la classe appropriée, pour une condition donnée, comme à un contexte, et à une aire dans cette classe, comme à une aire de contexte. Ainsi que définies au chapitre [6.4.1 Introduction], les aires de référence de page sont générées par un objet de mise en forme fo:page-sequence, en utilisant les spécifications d'un objet de mise en forme fo:page-master, et les aires de colonne sont des aires de référence, de flux normal, générées à partir du corps d'une région, ou d'aires de référence de région, générées à partir d'autres types de régions maîtres.
Une condition de rétention, ou de coupure, est une déclaration ouverte portant sur un objet de mise en forme et sur les relations de l'arbre entre les aires que cet objet génère et les aires de contexte concernées. Ces relations de l'arbre se définissent principalement en termes d'aires en tête ou en queue. Si A est un descendant de P, alors on définit A comme étant en tête dans P, si A n'a aucun frère qui le précède, que celui-ci soit une aire normale ou une des aires de son ancêtre, jusqu'à P exclus. De manière similaire, on définit A comme étant en queue dans P, A est un descendant de P, si A n'a aucun frère qui le suit, que celui-ci soit une aire normale ou une des aires de son ancêtre jusqu'à P exclus. Pour tout objet de mise en forme donné, le prochain objet de mise en forme dans le flux est le premier objet qui le suit (dans un cheminement pré-ordonné), qui ne soit pas un descendant de l'objet donné et qui génère et retourne des aires normales.
Les conditions de coupure opèrent une coupure soit avant, soit après. Une condition de coupure avant est satisfaite quand la première aire générée et retournée par l'objet de mise en forme est en tête dans l'aire de contexte. Une condition de coupure après dépend du prochain objet de mise en forme dans le flux ; elle est satisfaite quand il n'existe pas de tel objet de mise en forme ou bien, s'il existe, quand la première aire normale générée et retournée par celui-ci est en tête dans une aire de contexte.
Les conditions de coupure sont imposées par les propriétés 'break-before' et 'break-after'. Pour les traits correspondants, la valeur affinée "page" impose une condition de coupure dans un contexte consistant en aires de référence de page ; les valeurs "even-page" et "odd-page" imposent une condition de coupure dans des contextes d'aires de référence de page, respectivement, de numéro pair et de numéro impair ; la valeur "column" impose une condition de coupure dans un contexte d'aires de colonne ; la valeur "auto" n'impose aucune condition de coupure.
Les conditions de rétention opèrent une rétention soit avec le précédent, soit avec le suivant, soit avec l'ensemble. Une condition de rétention avec le précédent sur un objet est satisfaite, si la première aire générée et retournée par l'objet de mise en forme n'est pas en tête d'une aire de contexte, ou s'il n'y a aucunes aires précédentes dans le cheminement post-ordonné de l'arbre des aires. Une condition de rétention avec le suivant est satisfaite, si la dernière aire générée et retournée par l'objet de mise en forme n'est pas en queue d'une aire de contexte, ou s'il n'y a aucunes aires suivantes dans le cheminement pré-ordonné de l'arbre des aires. Une condition de rétention avec l'ensemble est satisfaite, si toutes les aires générées et retournées par l'objet de mise en forme sont des descendants d'une seule aire de contexte.
Les conditions de rétention sont imposées par les composants "within-page", "within-column" et "within-line" des propriétés 'keep-with-previous', 'keep-with-next' et 'keep-together'. La valeur affinée de chacun de ces composants spécifie l'intensité de la condition de rétention imposée, les nombres les plus élevés étant plus forts que ceux moindres, la valeur "always" surpassant toutes les valeurs numériques. La valeur "auto" d'un composant n'impose aucune condition de rétention. Un composant "within-page" impose une condition de rétention dans un contexte consistant en aires de référence de page, un composant "within-column" dans un contexte d'aires de colonnes et un composant "within-line" dans un contexte d'aires de ligne.
L'arbre des aires est contraint pour satisfaire aux conditions de coupure imposées. Chacune des conditions de rétention doivent également être satisfaites, sauf si la satisfaction d'une condition de coupure, ou d'une condition de rétention plus forte, échouait de ce fait. Si un jeu de conditions de rétention de force égale ne peut être satisfait en entier, alors on doit satisfaire un sous-ensemble maximal des conditions de cette force (conjointement avec toutes les conditions de coupure et le sous-ensemble maximal des conditions de rétention, s'il existe).
Ce chapitre rend explicite les relations entre l'arbre des aires et le rendu visuel de sortie.
Les aires génèrent trois sortes de marques : (1) l'arrière-plan de l'aire, s'il y a lieu, (2) les marques intrinsèques à l'aire (un glyphe, une image ou une décoration), s'il y a lieu, et (3) la bordure de l'aire, s'il y a lieu.
Un arbre des aires est représenté en faisant apparaître des marques sur un média de sortie, en fonction des aires de cet arbre. Ce chapitre décrit l'emplacement géométrique de ces marques et la résolution éventuelle de conflits survenant entre celles-ci.
Chaque aire est rendue à un emplacement spécifique. La sémantique des objets de mise en forme décrit l'emplacement des marques intrinsèques en fonction de l'emplacement de l'objet, c'est-à-dire les bords de gauche, de droite, du haut et du bas de son rectangle de contenu. Ce chapitre décrit la façon dont est déterminé l'emplacement de l'aire, ce qui détermine l'emplacement des marques intrinsèques de celle-ci.
Pour chaque page, l'aire de zone de visualisation de la page correspond, de façon isométrique, au média de sortie.
L'aire de référence de la page est décalée de l'aire de zone de visualisation de la page, comme décrit plus loin au chapitre [4.9.2 La géométrie de la zone de visualisation].
Toutes les aires de l'arbre, avec une classe d'aire xsl-fixed
, sont positionnées, telles que
les bords de gauche, de droite, du haut et du bas de leur rectangle de contenu soient décalés,
vers l'intérieur du rectangle de contenu de l'aire de zone de visualisation de la page de leur ancêtre,
des distances qui correspondent, respectivement, aux valeurs de leurs traits left-position, right-position, top-position,
et bottom-position.
Toute aire de l'arbre, qui est un enfant d'une aire de zone de visualisation, est rendue comme décrit au chapitre [4.9.2 La géométrie de la zone de visualisation].
Toutes les autres aires de l'arbre sont positionnées, telles que les bords de gauche, de droite, du haut et du bas de leur rectangle de contenu soient décalés, vers l'intérieur du rectangle de contenu de l'aire de zone de visualisation de la page de leur ancêtre, des distances qui correspondent, respectivement, aux valeurs de leurs traits left-position, right-position, top-position, et bottom-position. Ces rectangles de contenu glissent vers le bas et vers la droite, respectivement, des valeurs des traits top-offset et left-offset, quand la valeur du trait relative-position de leur aire est "relative".
Une aire de référence, qui est l'enfant d'une aire de zone de visualisation, est positionnée de manière à ce que les bords de début et de fin de son rectangle de contenu soient parallèles à ceux du rectangle de contenu de l'aire de zone de visualisation de son parent. Le bord de début de son rectangle de contenu est décalé, par rapport à celui de l'aire de zone de visualisation du rectangle de contenu de son parent, d'une quantité de défilement en-ligne, et le bord d'avant de son rectangle de contenu décalé, par rapport au bord d'avant de celui de l'aire de zone de visualisation de son parent, d'une quantité de défilement de bloc.
Si la valeur de trait block-progression-dimension de l'aire de référence est supérieure à celle de l'aire de zone de visualisation et si la valeur de trait overflow de l'aire de référence est "scroll", alors la quantité de défilement en-ligne et la quantité de défilement de bloc sont déterminées par un mécanisme de défilement, s'il existe, fourni par l'agent utilisateur. Autrement, les deux sont nulles.
La visibilité des marques dépend de l'emplacement de celles-ci, de la valeur du trait visibility de l'aire et de la valeur du trait overflow des aires de zone de visualisation ancêtres.
Quand la valeur de trait visibility d'une aire est "hidden", celle-ci ne génère aucunes marques.
Quand la valeur de trait overflow d'une aire est "hidden", ou quand l'environnement n'est pas dynamique et la valeur de overflow est "scroll", alors l'aire détermine un rectangle de rognage, défini comme étant le rectangle déterminé par la valeur de trait clip de l'aire en question et tel que, pour toute marque générée par une de ses aires descendantes, les parties de cette marque situées hors du rectangle de rognage n'apparaissent pas.
Les rectangles de bordure et d'espacement sont déterminés, en fonction du rectangle de contenu, par les valeurs communes des traits d'espacement et d'épaisseur de bordure (border-before-widht, etc.).
Pour toute aire, celle-ci n'étant pas l'enfant d'une aire de zone de visualisation, la bordure est rendue entre le rectangle de bordure et le rectangle d'espacement en accord avec les traits communs de couleur de bordure et de style. La bordure de l'enfant d'une aire de zone de visualisation n'est pas rendue.
Pour une aire, celle-ci ne faisant pas partie d'une paire d'aires zone de visualisation/référence, l'arrière-plan est rendu. Pour une aire, celle-ci étant soit une aire de zone de visualisation, soit une aire de référence d'une paire zone de visualisation/référence, quand la valeur affinée du trait background-attachment est "scroll" et quand la valeur de son trait block-progression-dimension est supérieure à celle de l'aire de zone de visualisation, alors l'arrière-plan est rendu dans l'aire de référence et non dans l'aire de zone de visualisation, dans le cas inverse, celui-ci est rendu dans l'aire de zone de visualisation et non dans l'aire de référence.
L'arrière-plan, s'il y en a un, est rendu dans le rectangle d'espacement, en fonction des traits background-image, background-color, background-repeat, background-position-vertical et background-position-horizontal.
Pour chaque classe d'objets de mise en forme, les marques intrinsèques, aux aires générées par elle, sont spécifiées par la description de l'objet de mise en forme. Par exemple, un objet de mise en forme fo:character génère une aire de glyphe, ce qui se traduit par le dessin d'un glyphe dans le rectangle de contenu de cette aire, en fonction des traits de police glyph-orientation et blink de l'aire.
De plus, d'autres traits (par exemple, les divers traits de marque score et score-color) spécifient d'autres marques intrinsèques. Dans le cas des traits de marque (underline-score, overline-score et through-score), l'épaisseur et l'emplacement de la marque sont spécifiés par le trait nominal-font en vigueur ; lorsque la police ne précise pas ces valeurs, elles dépendent alors de la mise en œuvre.
La mise en couche des marques est décrite plus loin, on y définit un ordonnancement partiel, de quelles marques se trouvent en-dessous de quelles autres.
On définit deux marques comme étant en conflit, si celles-ci s'appliquent au même endroit dans le média de sortie. Quand c'est le cas, celle qui se trouve en-dessous n'exerce aucune action aux endroits du média de sortie où les deux marques s'appliquent.
Les marques générées par la même aire sont mises en couche ainsi : l'arrière-plan de l'aire se trouve en-dessous des marques intrinsèques de celle-ci et les marques intrinsèques en-dessous de la bordure. La disposition des couches parmi les marques intrinsèques de l'aire est déterminée par la sémantique de l'objet de mise en forme générateur de l'aire et des propriétés de cet objet. Par exemple, le dessin d'un glyphe dans une aire du même nom se place en-dessous des marques générées pour la décoration du texte.
La couche d'empilement d'une une aire se définit selon le contexte d'empilement et la valeur du trait z-index de celle-ci. On définit la couche d'empilement d'une aire A comme étant inférieure à celle d'une aire B, quand un ancêtre A' de A, ou elle-même, et B' de B ont un même contexte d'empilement et quand la valeur de z-index de A' est inférieure à celle de B'. Si ni aucune couche d'empilement n'est inférieure à l'autre, alors on les définit comme ayant la même couche d'empilement.
Soit A et B des aires, si la couche d'empilement de A est moindre que celle de B, alors toutes les marques générées par A se trouvent en dessous de toutes celles générées par B.
Si les aires A et B partagent une même couche d'empilement, les arrière-plans de A et B se trouvent en-dessous de toutes les autres marques générées par A et B. De plus, si A est un ancêtre de B (toujours avec la même couche d'empilement), alors l'arrière-plan de A se trouve en-dessous de toutes les aires de B et toutes les aires de B en-dessous des aires intrinsèques de A.
Quand A et B partagent une même couche d'empilement et quand aucune n'est un ancêtre pour l'autre, alors il y a erreur si leurs arrière-plans entrent en conflit ou si une marque qui ne soit pas d'arrière-plan de A entre en conflit avec un marque du même genre de B. Une mise en œuvre peut rétablir la situation en procédant comme si les marques de la première aire, dans l'ordre de cheminement pré-ordonné, se trouvaient en-dessous de celles de l'autre aire.
Un arbre des aires typique
Précédent |
Table des matières |
début de page |
Suivant |