Пользователь

Добро пожаловать,

Регистрация или входРегистрация или вход
Потеряли пароль?Потеряли пароль?

Ник:
Пароль:

Меню сайта




Ваше мнение
Поиск по сайту

Активно и часто использую
Использую редко
Обхожусь стандартным рубрикатором
Не знаю, что это такое
Я и сам не знаю, что ищу


Результаты
Другие опросы

Всего голосов: 488
Комментарии: 0


Наши партнеры



Статистика




Programming books  Download software  Documentation  Scripts  Content Managment Systems(CMS)  Templates  Icon Sets  Articles  Contacts  Voting  Site Search




Книги-online



Модель Областей
 

Назад

Оглавление

В конец страницы

Вперёд

Краткое Содержание
4 Модель Области
    4.1 Введение
    4.2 Прямоугольные Области
    4.3 Пространство и Обусловленность
    4.4 Блок-Области
    4.5 Строчные Области
    4.6 Инлайн-Области
    4.7 Ограничения Упорядочивания
    4.8 Условия Keeps и Breaks
    4.9 Модель Представления
    4.10 Образец Дерева Областей


4 Модель области

В XSL создаётся дерево объектов форматирования (ОФ), которое служит в качестве места расположения входов или спецификаций для форматировщика. Форматировщик генерирует иерархический порядок областей, обеспечивающий получение результирующего форматирования.
В данном разделе определена общая модель областей и то, как они взаимодействуют. Задачей является представить абстрактный каркас, используемый при описании семантики ОФ. Это должно рассматриваться как описание серии ограничений для соответствующих реализаций, а не предписание к использованию какого-то особого алгоритма.


4.1 Введение

Форматировщик генерирует упорядоченное дерево, дерево областей, которое описывает геометрическое структурирование для носителя вывода. Термины потомок, родственный, предок, и родитель(ский) относятся к структуре дерева. В дереве имеется корневой узел/root node.

Каждый узел дерева областей, кроме root, называется областью и ассоциирован с прямоугольным участком устройства вывода. Области не являются ОФ; напротив, ОФ генерирует ноль или более прямоугольных областей, и обычно каждая область генерируется уникальным объектом в дереве ОФ.

ПРИМЕЧАНИЕ:

Исключением является лишь тот случай, когда несколько узлов "листьев" дерева ОФ комбинируются для генерации единой области, например, когда несколько символов последовательности генерируют одиночный лигатурный глиф. В таких случаях соответствующие свойства, такие как font-family и font-size, одинаковы для всех генерирующих объектов форматирования (см. раздел [4.7.2 Конструирование Строк]).

Область имеет content-rectangle/прямоугольник содержимого, часть которого назначается его дочерним областям, и необязательные padding/заполнение и border/рамку. На диаграмме показано, как эти участки соотносятся. Внешняя граница рамки называется border-rectangle/прямоугольник рамки, а внешний край заполнения называется padding-rectangle/прямоугольник заполнения.

Каждая область имеет набор уточнений, отображение имён в значения, - способ, которым элементы имеют атрибуты, а ОФ имеют свойства. Уточнения используются для вывода области или для определения ограничений для результата форматирования, или для того и другого. Уточнения используются строго для целей форматирования или для определения ограничений, которые могут называться уточнения форматирования, а уточнения, используемые для вывода/отображения, могут,  в свою очередь, называться уточнения отображения. Уточнения, чьи значения копируются или происходят из свойства с тем же или соответствующим именем, перечислены в разделах [C Свойства. Резюме.] и [5 Очистка/Разрешение Свойств]; другие уточнения перечислены ниже.

ПРИМЕЧАНИЕ:

Уточнения также ассоциируются с ОФ в процессе очистки. Некоторые уточнения получают значение в ходе форматирования, а другие уже существуют после очистки.

Семантика каждого типа объекта форматирования (ОФ), генерирующего области, дана в терминах генерируемых областей и их места в иерархии дерева областей/area-tree. В дальнейшем это может подвергнуться изменениям путём взаимодействия между различными типами ОФ.
Свойства ОФ определяют, какие области генерируются и как содержимое ОФ распределено между ними. (Например, слово, которое не переносится, может не иметь глифов, распределённых по областям на двух отдельных строчных областях/line-areas.)

Уточнения области могут быть:

directly-derived/прямо происходящими: значениями уточнений directly-derived являются вычисленные значения свойства с тем же или соответствующим именем в генерирующем ОФ, или

indirectly-derived/косвенно происходящими: значения уточнений indirectly-derived являются результатом вычисления с участием вычисленных значений одного или более свойств генерирующего ОФ, других уточнений этой области или других взаимодействующих областей (предков, родителей, "родственников" и/или потомков) и/или одного или более значений, конструируемых форматировщиком. Формула обсчёта может зависеть от типа ОФ.

Данное описание принимает, что очищенные значения вычислены для всех свойств объектов форматирования в результирующем дереве, т.е., все относительные и связанные значения вычисляются, а наследуемые значения публикуются, как описано в разделе [5 Очистка/Разрешение Свойств]. Это позволяет процессу наследования быть описанным лишь однократно и исключает необходимость повторения информации при вычислении значений в данном описании.

Уточнения indirectly-derived: 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 и script.


4.2 Прямоугольные области

4.2.1 Типы областей

Имеются области двух типов: block-areas/блок-области и inline-areas/инлайн-области. Они различаются тем, как они обычно упаковываются форматировщиком. Область может иметь блок области или инлайн-области в качестве потомков, как определено генерирующим объектом форматирования, но все потомки данной области обязаны быть одного типа. Хотя блок- и инлайн-области обычно упакованы, некоторые области могут быть позиционированы явно.

Строчная область/line-area это особый вид блок-области, все потомки которой являются инлайн-областями. Область глифа/glyph-area это особый вид инлайн-области, не имеющей дочерних областей и имеющей в качестве содержимого одиночное изображение глифа.

Типичные примеры областей: параграф, отображённый с использованием ОФ fo:block, генерирующего блок-области, и символ, отображённый с использованием ОФ fo:character, генерирующего инлайн-область (фактически, область глифа/glyph-area).


4.2.2 Обычные уточнения

Ассоциированными с любой областью являются два направления, получаемые из свойств writing-mode и reference-orientation генерирующего объекта форматирования: block-progression-direction - это направление для упаковки дочерних для данной области блок-областей, а inline-progression-direction  - это направление для упаковки дочерних для данной области инлайн-областей.
Ещё одно уточнение, shift-direction, имеется в инлайн-областях и относится к направлению, в котором осуществляются смещения базовой линии. glyph-orientation определяет ориентацию избражений-глифов в результирующем отображении.

Если reference-orientation области - 0, тогда верхний, нижний, левый и правый края содержимого параллельны соответствующим краям предка области и согласованы с ними. Иначе края повёрнуты от краёв родителя области, как описано в разделе [7.20.3 "reference-orientation"].
Направления inline-progression-direction и block-progression-direction определяются размещением этих краёв, как описано в разделе [7.27.7 "writing-mode"].

Булево уточнение is-reference-area определяет, устанавливает или нет область систему координат для спецификации отступов. Область, для которой это уточнение - true, называется reference-area/ссылка-область. Только reference-area может иметь направление block-progression-direction, отличающееся от родительского. reference-area может быть блок-областью или инлайн-областью.

Булево уточнение is-viewport-area определяет, устанавливает или нет область "окно", через которое можно просматривать её потомков, и может использоваться для представления сжатого или прокручиваемого материала; например, в печатающих приложениях, где нужны "просачивание" и отделка. Область, для которой данное уточнение - true, называется viewport-area/область-порт просмотра.

Обычной конструкцией является пара viewport/reference. Имеется порт просмотра V reference-area блок-области R, где R - единственный потомок V и start-edge и end-edge content-rectangle/прямоугольника содержимого R параллельны start-edge и end-edge прямоугольника содержимого V.

Каждая область имеет уточнения top-position, bottom-position, left-position и right-position, задающие расстояния от краёв content-rectangle до аналогично именованных краёв ближайшего предка - reference-area (или page-viewport-area - в случае, если области генерируются потомками ОФ, чьи absolute-position установлены в fixed); left-offset и top-offset определяют величину, на которую relatively-positioned/относительно-позиционируемая область сдвигается/shifted при отображении. Эти уточнения получают свои значения в ходе процесса форматирования ил, в случае с абсолютно позиционируемыми областями, в ходе очистки.

block-progression-dimension и inline-progression-dimension области задают расширение прямоугольника содержимого области по двум относительным измерениям.

Остальные уточнения включают:

  • is-first и is-last, которые являются булевыми уточнениями, обозначают порядок, в котором области генерируются и возвращаются данным ОФ. (См. [6.1.1 Определения, Обычные для Многих ОФ].
    is-first будет true для первой области (или единственной области), генерируемой и возвращаемой объектом форматирования, а is-last будет true для последней области (или единственной области));

  • величина пространства за пределами border-rectangle/прямоугольника рамки: space-before, space-after, space-start и space-end (хотя многие из них должны быть 0/zero в определённых классах области);

    ПРИМЕЧАНИЕ:

    "Before", "after", "start" и "end" обозначают относительные направления и описаны ниже.

  • толщина заполнения каждой из 4 сторон: padding-before, padding-after, padding-start и padding-end;

  • style/стиль, thickness/толщина и color/цвет каждой из 4 сторон рамки: border-before, и т.д.;

  • фон области: background-color, background-image и другие уточнения фона; и

  • nominal-font/номинальный шрифт области, как определено свойствами шрифта и символьными потомками ОФ, генерирующего области. (См. [5.5.7 Свойства Шрифта])

Если не специфицировано иное, уточнения ОФ имеются в каждой из генерируемых областей и с одним и тем же значением. (Тем не менее, см. разделы [4.7.2 Построение Строк] и [4.9.4 Рамка, Заполнение и Фон].)


4.2.3 Геометрические определения

Как описано выше, content-rectangle это прямоугольник, ограничивающий внутреннюю часть заполнения и используемый для описания ограничений позиционирования областей-потомков. Бывает и так, что маркировка глифов-потомков или других областей может появиться вне прямоугольника содержимого.

К этому имеет отношение и allocation-rectangle/прямоугольник размещения области, используемый для описания ограничения позиции области внутри области-родителя. Для инлайн-областей это либо normal-allocation-rectangle, либо large-allocation-rectangle.
normal-allocation-rectangle расширяется до content-rectangle при block-progression-direction и до border-rectangle при inline-progression-direction.
large-allocation-rectangle это border-rectangle. Если не специфицировано иное, allocation-rectangle области будет normal-allocation-rectangle.

Normal-allocation-rectangle инлайн-области

Large-allocation-rectangle инлайн-области

Для блок-области allocation-rectangle расширяется до border-rectangle при block-progression-direction и за пределы content-rectangle при inline-progression-direction на величину, равную end-indent, а в противоположном направлении - на величину, равную start-indent.

ПРИМЕЧАНИЕ:

Включение пространства за пределами border-rectangle блок-области при inline-progression-direction не влияет на ограничения размещения и предназначено для обеспечения совместимости с моделью бокса CSS.

Прямоугольники allocation- и content-rectangles блок-области

Края прямоугольника обозначаются так:

  • before-edge это край, появляющийся первым при направлении block-progression-direction и перпендикулярный ему;

  • after-edge это край, противоположный before-edge;

  • start-edge появляющийся первым при направлении inline-progression-direction и перпендикулярный ему;

  • end-edge это край, противоположный start-edge.

Для задач этого определения content-rectangle области использует направления inline-progression-direction и block-progression-direction данной области; но border-rectangle, padding-rectangle и allocation-rectangle используют направления своей области-предка. Таким образом, края, назначенные для content-rectangle, могут не соответствовать так же именованным краям прямоугольников padding-, border- и allocation-rectangles. Это важно в тех случаях, когда вложенные блок-области имеют различные writing-modes/режимы письма.

На диаграмме показано соответствие между различными названиями краёв при смешанном writing-mode:

Каждая инлайн-область имеет alignment-point/точку выравнивания, определяемую форматировщиком, на крае start-edge её allocation-rectangle; для glyph-area эта точка будет на start-edge глифа на его базовой линии выравнивания (см. ниже). Это зависит от вида письма и не обязательно соответствует координатной точке (0,0), используемой для данных, описывающих форму глифа.


4.2.4 Упорядочивание дерева

В дереве области набор областей с имеющимся предком расположен упорядоченно. Термины initial, final, preceding и following имеют к этому отношение.

В любом упорядоченном дереве порядок родственных соотношений расширяется до порядка всего дерева в целом по меньшей мере двумя путями:

  • В порядке дерева pre-order traversal потомки каждого узла (их порядок относительно друг друга не изменяется) следуют после узла, но предшествуют любым последующим родственникам узла или его предков.

  • В порядке дерева post-order traversal потомки каждого узла предшествуют узлу, но следуют после любых предшествующих родственников узла или его предков.

"Предшествование" и "следование", применённое к не-родственникам, будет зависеть от используемого порядка расширения, который обязан быть специфицирован. Однако, при любом заданном порядке, листья дерева (узлы без потомков) упорядочиваются недвусмысленно/явно.


4.2.5 Ограничения стэкирования

В этом разделе даётся понятие об ограничениях block-stacking и inline-stacking. Они определяются как упорядоченные взаимоотношения, т.е., если A и B имеют ограничения упаковки, это не обязательно означает, что B и A имеют ограничение упаковки. Эти определения рекурсивны по своей природе, и некоторые варианты могут зависеть от более простых вариантов того же самого определения. Здесь нет зацикливания, но только последовательность рекурсий. Задачей определения является идентификация тех областей на любом уровне дерева, которые имеют до себя только пустое пространство.

Уточнение area-class это перечислимое значение, установленное в xsl-normal для области, упакованной вместе с другими областями в последовательность.
Область normal это такая область, для которой данное уточнение установлено в xsl-normal.
Область page-level-out-of-line это область с area-class/классом xsl-footnote, xsl-before-float или xsl-fixed; размещение этих областей управляется предком fo:page-sequence генерирующего их объекта форматирования.
Область reference-level-out-of-line это область с area-class/классом xsl-side-float или xsl-absolute; размещение этих областей управляется ОФ, генерирующим соответствующий reference-area.
Область anchor это область с area-class xsl-anchor; размещение этих областей управляется произвольно и не влияет на порядок упаковки в стэк.
Области с area-class xsl-normal, xsl-footnote или xsl-before-float определены как stackable/стэкируемые, что означает, что они предположительно должны быть подобающим образом стэкированы.

Ограничения Block-stacking/стэкирования блока.

Если P это блок-область, тогда имеется fence preceding\предшествующее ограждение P, если P является reference-area или если border-before-width или padding-before-width в P являются non-zero/ненулевыми.
Аналогично, имеется fence following\последующее ограждение P, если P является reference-area или если border-after-width или padding-after-width в P являются non-zero/ненулевыми.

Если A и B являются стэкируемыми областями и S является последовательностью спецификаторов пробелов (см. [4.3 Заполнение и Обусловленность]), определено, что A и B имеют ограничение block-stacking S, если выдерживается одно из следующих условий:

  • B это блок-область, являющаяся первым нормальным потомком A, а S  это последовательность, состоящая из space-before для B.

  • A это a block-area блок-область, являющаяся последним нормальным потомком B, а S  это последовательность, состоящая из space-after для A.

  • A и B оба являются блок-областями, и либо

    a. B является следующей стэкируемой областью-родственником  A, а S  это последовательность, состоящая из space-after для A и space-before для B;

    b. B это первый нормальный потомок блок-области P, B не является строчной областью, отсутствует предшествующее ограждение P, A и P имеют ограничение стэкирования блока S', а S состоит из S' и последующего space-before для B; или

    c. A является последним нормальным потомком блок-области P, A не является строчной областью, отсутствует последующее ограждение P, P и B имеют ограничение стэкирования блока S'', а S состоит из space-after для A с последующим S''.

    d. A имеет ограничение стэкирования блока S' с блок-областью E, E имеет ограничение стэкирования блока S'' с B, E является empty (т.е. имеет нулевые рамку, заполнение и block-progression-dimension и не имеет нормальных потомков), и S состоит из S' с последующим S''.

  • ПРИМЕЧАНИЕ:

    Использование "stackable" в двух местах в вышеприведённом определении позволяет применять ограничения стэкирования блока между областями area-class/класса-области xsl-before-float или xsl-footnote.

    Смежные края с блок-стэкированием

    Если A и B имеют ограничения блок-стэкирования, то adjacent edges/смежные края в A и B являются упорядоченной парой, рекурсивно определяемой как:

    • Если 1, before-edge в content-rectangle в A и before-edge в allocation-rectangle в B.

    • Если 2, after-edge в allocation-rectangle в A и after-edge в content-rectangle в B.

    • Если 3a, after-edge в allocation-rectangle в A и before-edge в allocation-rectangle в B.

    • Если 3b, первый из смежных краёв в A и P и before-edge в allocation-rectangle в B.

    • Если 3c, after-edge в allocation-rectangle в A и второй из смежных краёв в P и B.

    • Если 3d, первый из смежных краёв в A и E и второй из смежных краёв в E и B.

    Пример. На данной диаграмме каждый узел представляет блок-область. Примем, что ширина всех заполнений и рамок равна 0 ни одна из областей не является reference-area. Тогда P и A имеют ограничение стэкирования блока, как и A и B, A и C, B и C, C и D, D и B, B и E, D и E, E и P; только эти пары на диаграмме имеют ограничения стэкирования блока. Если B имеет ненулевое padding-after, тогда D и E не должны будут иметь какого-либо ограничения стэкирования блока (хотя B и E могут продолжать иметь ограничение стэкирования блока).

    Пример ограничения блок-стэкирования

    Ограничения инлайн-стэкирования.

    В этом разделе рекурсивно определяются ограничения inline-stacking между двумя областями (либо двумя inline-areas/инлайн-областями, либо одной inline-area и одной line-area/строчной областью), а также даются объяснения предшествующего ограждения и последующего ограждения; эти определения тесно взаимосвязаны. Имеется некоторая параллель с определением ограничений block-stacking, но с определённым усложнением, так как мы можем иметь ограничение стэкирования между inline-areas, которые упакованы в противоположных направлениях inline-progression-directions. (Это не проблема для ограничений block-stacking, поскольку блок-область, не являющаяся reference-area, не может иметь block-progression-direction, отличное от своего родителя.)

    Если P и Q имеют ограничение инлайн-стэкирования, тогда P имеет fence preceding/предшествующее ограждение Q при условии, что P это reference-area/ссылочная область, или она имеет ненулевую border-width/ширину рамки или padding-width/ширину заполнения у первого смежного края P и Q.
    Так же, Q имеет fence following/последующее ограждение P при условии, что Q это reference-area, или она имеет ненулевую border-width/ширину рамки или padding-width/ширину заполнения у второго смежного края P и Q.

    Если A и B это нормальные области, а S это последовательность space-specifiers/спецификаторов заполнения, определено, что A и B имеют ограничение inline-stacking S, при соблюдении одного из следующих условий:

  • A это инлайн- или строчная область, B это инлайн-область, являющаяся первым нормальным потомком A, а S это последовательность, состоящая из space-start из B.

  • B это инлайн- или строчная область, A это инлайн-область, являющаяся последним нормальным потомком B, а S это последовательность, состоящая из space-end из A.

  • Каждая из A и B это либо инлайн-, либо строчная область, и либо

    a. обе A и B являются инлайн-областями, B это следующий нормальный родственник A, а S это последовательность, состоящая из space-end из A и space-start из B;

    b. B это инлайн-область, являющаяся первым нормальным потомком инлайн-области P, P не имеет последующего ограждения A, A и P имеют ограничение inline-stacking S', inline-progression-direction в P то же самое, что и inline-progression-direction ближайшей области - общего предка для A и P, а S состоит из S' с последующим space-start из B.

    c. A это инлайн-область, являющаяся последним нормальным потомком инлайн-области P, P не имеет предшествующего ограждения B, P и B имеют ограничение inline-stacking S'', inline-progression-direction в P то же самое, что и inline-progression-direction ближайшей области - общего предка для P и B, а S состоит из space-end из A с последующим S''.

    d. B это инлайн-область, являющаяся последним нормальным потомком инлайн-области P, P не имеет последующего ограждения A, A и P имеют ограничение inline-stacking S', inline-progression-direction в P противоположно inline-progression-direction ближайшей области - общего предка для A и P, а S состоит из S' с последующим space-end из B.

    e. A это инлайн-область, являющаяся первым нормальным потомком инлайн-области P, P не имеет предшествующего ограждения B, P и B имеют ограничение inline-stacking S'', inline-progression-direction в P противоположно inline-progression-direction ближайшей области - общего предка для P и B, а S состоит из space-start из A с последующим S''.

  • Смежные края с Inline-stacking/инлайн-стэкированием

    Смежные края с Inline-stacking, продолжение

    Если A и B имеют ограничение inline-stacking, смежные края из A и B являются упорядоченной парой, определённой как:

    • Если 1, start-edge в content-rectangle/прямоугольнике содержимого для A и start-edge в allocation-rectangle/прямоугольнике размещения для B.

    • Если 2, end-edge в allocation-rectangle для A и end-edge в content-rectangle для B.

    • Если 3a, end-edge в allocation-rectangle для A и start-edge в allocation-rectangle для B.

    • Если 3b, первый из смежных краёв A и P и start-edge в allocation-rectangle для B.

    • Если 3c, end-edge в allocation-rectangle для A и второй из смежных краёв P и B.

    • Если 3d, первый из смежных краёв A и P и end-edge в allocation-rectangle для B.

    • Если 3e, start-edge в allocation-rectangle для A и второй из смежных краёв P и B.

    Две области являются adjacent/смежными, если они имеют ограничение block-stacking или inline-stacking. Это следует из определений, что области одного типа (inline или block) могут быть смежными только в том случае, если все их не-общие предки - того же самого типа (до, но не включая их ближайшего общего предка). Таким образом, например, две inline-области, расположенные в различных строчных областях, никогда не будут смежными.

    Область A начинает область P, если A является потомком P, а P и A имеют ограничение block-stacking или inline-stacking. В этом случае второй из смежных краёв P и A определяется как leading edge/ведущий край в P. Спецификатор пространства/space-specifier, применяемый к ведущему краю, определяется также как begin/начало P.

    Аналогично, область A заканчивает область P, если A является потомком P, а A и P имеют ограничение block-stacking или inline-stacking. В этом случае первый из смежных краёв A и P определяется как trailing edge/ведомый край в P. Спецификатор пространства, применяемый к ведомому краю, определяется также как end/конец P.


    4.2.6 Таблицы базовых линий шрифта

    Каждый вид письма имеет предпочтительную "baseline/базовую линию" для выравнивания глифов. В западном письме обычно используется "alphabetic/алфавитная" базовая линия, которая находится около низа заглавных букв или касается его. Кроме того, для каждого шрифта имеется предпочтительный способ выравнивания внедрённых глифов из других видов письма, например, для западных шрифтов имеются разные базовые линии для выравнивания внедрённых идеографических или индийских глифов.

    Каждая блок- и инлайн-область имеет уточнение dominant-baseline-identifier (доминантного идентификатора базовой линии), значением которой является идентификатор базовой линии, соответствующий типу выравнивания, ожидаемому для потомков инлайн-области этой области, и каждая inline-area имеет alignment-baseline/базовую линию выравнивания, которая специфицирует, как эта область выровнена относительно родителя. Эти уточнения интерпретируются так, как описано в разделе [7.8.1 Шрифты и Данные Шрифтов].

    Для каждого шрифта actual-baseline-table/таблица текущих базовых линий отображает эти идентификаторы в точке start-edge/начального края области. Злоупотребляя терминологией, строка в inline-progression-direction через точку, соответствующую dominant-baseline-identifier, называется "dominant baseline/доминантной базовой линией."


    4.3 Пространство и обусловленность

    Спецификатор пространства/space-specifier это составной тип данных, компонентами которого являются minimum, optimum, maximum, conditionality/обусловленность и precedence/приоритет.

    Minimum, optimum и maximum это размеры, которые могут быть использованы для определения ограничения на расстоянии, то есть расстояние предпочтительно должно быть optimum и в любом случае не меньше minimum и не больше maximum. Любое из этих значений может быть отрицательным, что может вызвать (к примеру) перекрытие областей, но, в любом случае, minimum должен быть меньше чем или равен значению optimum, а optimum - меньше чем или равен значению maximum.

    Обусловленность это перечислимое значение, которое управляет воздействием space-specifier в начале или в конце ссылочной или строчной области. Возможные значения: retain и discard; условный спецификатор пространства - это тот, для которого данное значение - discard.

    Приоритет имеет значение - целое число или специальную лексему force. Форсирующий  спецификатор пространства - это тот, для которого данное значение - force.

    Последовательно введённые спецификаторы пространства могут взаимодействовать друг с другом. Ограничение, вводимое последовательностью спецификаторов пространства, вычисляется путём обсчёта для каждого спецификатора пространства его ассоциированного resolved space-specifier/разрешённого спецификатора пространства в соответствии с их обусловленностью и приоритетом, как показано ниже в правилах разрешения пространства.

    Ограничение, вводимое дистанционно последовательностью разрешённых спецификаторов пространства, является дополнительным; то есть дистанция ограничена в пределах: не меньше, чем сумма разрешённых минимальных значений, и не больше, чем сумма разрешённых максимальных значений.


    4.3.1 Правила разрешения (вычисления) пространства

    Чтобы вычислить разрешённый спецификатор пространства данного спецификатора пространства S, примем максимальное ограничение inline-стэкирования или block-стэкирования S', содержащее спецификатор пространства S как элемент последовательности (S' это последовательность спецификаторов пространства; см. [4.2.5 Ограничения Стэкирования]). Разрешённый из S спецификатор пространства является не-условным, форсирующим спецификатором пространства, вычисленным в терминах данной последовательности.

  • Если любой из спецификаторов пространства в S' является условным и начинает ссылочную область или строчную область, тогда он подавляется, что означает - его разрешённый спецификатор пространства равен нулю. Кроме того, любые условные спецификаторы пространства, следующие непосредственно за ним в последовательности, также подавляются.

    Если условный спецификатор пространства оканчивается ссылочной или строчной областью, тогда он подавляется вместе с любыми другими спецификаторами пространства, непосредственно предшествующими ему в последовательности.

  • Если любой из оставшихся спецификаторов пространства в S' форсирован, то все нефорсируемые спецификаторы пространства подавляются, а значение каждого из форсируемых спецификаторов пространства принимается как его разрешённое значение.

  • Альтернативно, если все оставшиеся спецификаторы пространства в S' являются нефорсируемыми, то разрешённый спецификатор пространства определяется в терминах тех неподавляемых спецификаторов пространства, приоритет которых в цифровом выражении более высокий, и среди тех, чьё оптимальное выражение является наибольшим. Все другие спецификаторы пространства подавляются. Если имеется только один из них, тогда его значение принимается в качестве разрешённого.

    Иначе, если имеется два или более спецификаторов пространства, все одного высшего приоритета и наибольшего оптимума, разрешённый спецификатор пространства последнего спецификатора пространства в последовательности выводится из этих пространств путём взятия их общего оптимального значения как оптимума, наибольшего из минимальных значений как минимума и наименьшего из максимальных значений как максимума, а все остальные спецификаторы пространства подавляются.

  • Если S является субъектом ослабления ограничений, то его максимальное значение устанавливается в текущий размер block-progression-dimension содержащей блок-области. См. [4.3.2 Переограниченные/Overconstrained Спецификаторы Пространства]

  • Пример. Предположим, что последовательность значений пространства, вводимых в начале ссылочной области такая:
    первое, пространство со значением в 10 пунктов (то есть minimum, optimum и maximum все равны 10 пунктам) и обусловленность discard;
    второе, пространство со значением в  4 пункта и обусловленность retain;
    и третье, пространство со значением в  5 пунктов и обусловленность discard;
    все три пространства имеют нулевой приоритет.
    Затем первое (10 пунктов) пространство подавляется по правилу 1, а второе (4 пункта) пространство подавляется по правилу 3.
    Разрешённое значение третьего пространства является не-условным в 5 пунктов, даже если оно первоначально взято из условного пространства.

    Заполнение блок-области не взаимодействует с любым спецификатором пространства (за исключением тех, по определению, в которых наличие заполнения у краёв before- или after-edge не даёт областям с любой стороны от себя иметь ограничение стэкирования.)

    Рамка заполнения у краёв before-edge или after-edge блок-области B может быть специфицирована как обусловленная. Если это так, то она устанавливается в нуль, если её ассоциированный край является ведущим краем в ссылочной области, а уточнение is-first в B является false, или если её ассоциированный край является ведомым краем ссылочной области, а уточнение is-last в B - false. В любом из этих случаев рамка или заполнение принимаются равными нулю для задач определений ограничения стэкирования.

    Рамка или заполнение около start-edge или end-edge инлайн-области I могут быть специфицированы как условные. Если это так, то она устанавливается в нуль, если её ассоциированный край является ведущим краем в строчной области, а уточнение is-first в I - false, или если её ассоциированный край является ведомым краем строчной области, а уточнение is-last в I является false. В любом из этих случаев рамка или заполнение принимаются равными нулю для задач определений ограничения стэкирования.


    4.3.2 Переограниченные спецификаторы пространства

    Если область P генерируется ОФ, имеющим block-progression-dimension как "auto", то ограничения, включающие before-edge и after-edge содержащего прямоугольника для P, вместе с ограничениями между различными потомками P дают в результате ограничение действующего значения block-progression-dimension. Если block-progression-dimension вместо этого специфицировано как длина, тогда это может в результате дать "переограниченное" дерево областей, например, не полностью заполненный fo:block со специфицированным размером. В этом случае некоторые ограничения между P и его потомками должны быть ослаблены; те, которые подходят для данного использования, называются субъектами для ослабления переограничения и рассматриваются так же, как в предыдущем разделе.

    • Если значение display-align установлено в "after" или "center" и P является первой нормальной областью, сгенерированной ОФ, тогда space-before первого нормального потомка P является субъектом ослабления переограничения.

    • Если значение display-align установлено в "before" или "center" и P является последней нормальной областью, сгенерированной ОФ, тогда space-after последнего нормального потомка P является субъектом ослабления переограничения.


    4.4 Блок-области

    Блок-области имеют несколько уточнений, которые обычно действуют на размещение своих потомков.
    line-height используется при расчётах размещения в строках. Уточнение line-stacking-strategy контролирует тип размещения, используемый для строчных областей-потомков, и имеет перечислимое значение (font-height, max-height или line-height). Всё это подробно описано ниже. Все области имеют эти уточнения, но они действуют только на области, имеющие стэкированных строчных областей-потомков.

    Уточнения space-before и space-after определяют расстояние между блок-областью и окружающими блок-областями.

    Блок-область, которая обычно не является строчной областью, обычно имеет свои размеры в направлении inline-progression-direction, определяемые её отступами start-indent и end-indent и размерами её ближайшей родительской ссылочной области/reference-area.
    Блок-область, которая не является строчной областью, обязана быть правильно стэкирована (как определено ниже в разделе [4.4.1 Стэкированные Блок-Области]), если только не определено иное в её генерирующем ОФ. В этом случае её block-progression-dimension будет субъектом ограничений на базе block-progression-dimensions и space-specifiers её потомков. См. [4.3.2 Переограниченные space-specifiers/Спецификаторы Пространства]


    4.4.1 Стэкированные блок-области

    Блок-области - потомки области - обычно стэкируются в block-progression-direction внутри своей родительской области, и это является методом по умолчанию при позиционировании блок-областей. В то же время объекты форматирования свободны при специфицировании других методов позиционирования дочерних областей у тех областей, которые ими генерируются, например, элементы списка или таблицы.

    Для родительской области P, потомки которой являются блок-областями, P определено как properly stacked/правильно стэкированное, если соблюдаются все нижеследующие условия:

  • Для каждой блок-области B, являющейся потомком P, выдерживается следующее:

    • before-edge и after-edge её прямоугольника размещения параллельны before-edge и after-edges прямоугольника содержимого P,

    • start-edge её прямоугольника размещения параллелен start-edge прямоугольника содержимого R (где R это ближайшая ссылочная область-предок для B), а смещение от него внутрь эквивалентно расстоянию start-indent блок-области плюс её start-intrusion-adjustment (описано далее) минус значения её border-start, padding-start и space-start, и

    • end-edge  её прямоугольника размещения параллелен end-edge прямоугольника содержимого R, а смещение от него внутрь эквивалентно расстоянию end-indent блок-области плюс её end-intrusion-adjustment (определено ниже) минус значения её border-end, padding-end и space-end.

    ПРИМЕЧАНИЕ:

    Предполагается применять значение отступа к прямоугольнику содержимого, но ограничение записано в терминах прямоугольника размещения, поскольку, как описано ранее ([4.2.3 Геометрические Определения]), края прямоугольника содержимого могут не соответствовать аналогично именованным краям прямоугольника размещения.

    Уточнения start-intrusion-adjustment и end-intrusion-adjustment используются при работе с вторжениями поплавков в направлении inline-progression-direction.

  • Для каждой пары нормальных областей B и B' в поддереве ниже P, если B и B' имеют ограничение стэкирования блока S и B не является пустой (см. [4.2.5 Ограничения Стэкирования]), тогда расстояние между смежными краями B и B' составляется из ограничения, вводимого разрешёнными значениями спецификаторов пространства в S.

    Пример. На данной диаграмме, если область A имеет значение space-after в 3 пункта, B - space-before в 1 пункт, C - space-before в 2 points, все с приоритетом force и с нулевыми рамками и заполнением, тогда ограничения разместят прямоугольник размещения для B на 4 пункта ниже, чем прямоугольник размещения для A, и прямоугольник размещения для C на 6 пунктов ниже, чем прямоугольник размещения для A. Таким образом, 4-пунктовый зазор получает цвет фона от P, а 2-пунктовый зазор перед C получает цвет фона от B.


  • 4.4.2 Подгонка вторжений

    Подгонка вторжений (start- и end-) определяется для вычисления отступов, которые появляются как результат всплывания "поплавков".

    Если A и B это области, имеющие одного ближайшего предка - ссылочную область, тогда A и B определены как inline-overlapping/инлайн-перекрывающиеся, если имеется некоторая строка, параллельная inline-progression-direction, которая пересекает прямоугольники размещения для A и B.

    Если A это область класса xsl-side-float  с  float="start" и B это блок-область, а A и B имеют одного ближайшего предка - ссылочную область, тогда A определена как encroach(/вдающаяся?) в B, если A и B являются inline-перекрывающимися и start-indent в B меньше, чем сумма start-indent в A и inline-progression-dimension в A.
    start-encroachment(/вдавливание?) A в B определяется как величина, на которую start-indent в B меньше, чем сумма start-indent в A и inline-progression-dimension в A.

    Если A это область класса xsl-side-float  с  float="end" и B это блок-область, а A и B имеют одного ближайшего предка - ссылочную область, тогда A определена как encroach(/вдающаяся?) в B, если A и B являются inline-перекрывающимися и end-indent в B меньше, чем сумма end-indent в A и inline-progression-dimension в A.
    end-encroachment для A в B определяется тогда как величина, на которую end-indent в B меньше, чем сумма end-indent в A и inline-progression-dimension в A.

    Если B это блок-область, не являющаяся строчной областью, тогда её local-start-intrusion-adjustment вычисляется как максимум следующих размеров:

  • zero/нуль;

  • если предок для B не является ссылочной областью: start-intrusion-adjustment родителя для B; и

  • если B имеет float-displace="block", тогда для каждой области A класса xsl-side-float с float="start" такой, что генерирующий ОФ для A не является потомком генерирующего ОФ для B и A вдаётся в некоторую строчную область - потомок B: start-encroachment для A в B; и

  • если B имеет float-displace = "block", тогда для каждой области A класса xsl-side-float  с  float="start" такой, что A и B являются inline-перекрывающими, и для каждого предка B блок-области B', который является потомком ближайшей ссылочной области предка для B такой, что A вдаётся/encroaches в строчную область-потомок для B': start-encroachment/углубление для A в B'.

  • start-intrusion-adjustment/подгонка-начального-"вторжения" блок-области B определяется тогда как максимум local-start-intrusion-adjustments нормальных блок-областей, генерируемых и возвращаемых генерирующим ОФ для B.

    Если L это строчная область/line-area, тогда её start-intrusion-adjustment вычисляется как максимум следующих размеров:

  • start-intrusion-adjustment предка для L;

  • для каждой области A класса xsl-side-float с float="start" такой, как A, вдающаяся в L: start-encroachment для A в L; и

  • если предок для L имеет float-displace = "indent", тогда для каждой области A класса xsl-side-float с float="start" такой, что A и L являются inline-перекрывающимися, и для каждой блок области-предка B' для L, которая является потомком ближайшей ссылочной области-предка для L такой, что A вдаётся в некоторую дочернюю строчную область L' для B': start-encroachment для A в B'.

  • end-intrusion-adjustment для блок-области вычисляется точно так же. То есть:

    Если B это блок-область и не строчная область, тогда её local-end-intrusion-adjustment вычисляется как максимум следующих размеров:

  • нуль;

  • если для B предок  не является ссылочной областью: end-intrusion-adjustment предка для B; и

  • если B имеет float-displace="block", тогда для каждой области A класса xsl-side-float с float="end" такой, что генерирующий ОФ для A не является потомком генерирующего ОФ для B, и такой, что A вдаётся в некоторую строчную область-потомок для B: end-encroachment для A в B; и

  • если B имеет float-displace = "block", тогда для каждой области A класса xsl-side-float с float="end" такой, что A и B являются inline-перекрывающими, и для каждой блок-области - предка B' для B, которая является потомком ближайшей ссылочной области-предка для B, такой, что A вдаётся в дочернюю инлайн- область для B': end-encroachment для A в B'.

  • end-intrusion-adjustment блок-области B определяется тогда как максимум local-end-intrusion-adjustments нормальных блок-областей, генерируемых и возвращаемых ОФ для B.

    Если L это строчная область, тогда её end-intrusion-adjustment вычисляется как максимум следующих размеров:

  • end-intrusion-adjustment родителя для L;

  • для каждой области A класса xsl-side-float с float="end" такой, что A вдаётся в L: end-encroachment для A в L; и

  • если родитель для L имеет float-displace = "indent", тогда для каждой области A класса xsl-side-float с float="end" такой, что A и L являются inline-перекрывающими, и для каждой блок-области - предка B' для L, являющеёся потомком ближайшей ссылочной области - предка для L, такой, что A вдаётся в некоторую дочернюю строчную область L' для B': end-encroachment для A в B'.


  • 4.5 Line-areas/Строчные области

    Строчная область это особый тип блок-области, генерируемый тем же самым ОФ, который генерирует и её предка. Строчные области не имеют рамок и заполнения, т.е. border-before-width, padding-before-width, и т.п. все установлены в нуль. Строчные области стэкируются/упаковываются внутри строчной области относительно baseline-start-point/начальной точки базовой линии, которая является точкой, определённой форматировщиком на start-edge прямоугольника содержимого строчной области.

    Прямоугольник размещения строки определяется значением уточнения line-stacking-strategy: если имеется значение font-height, прямоугольник размещения будет nominal-requested-line-rectangle, как определено ниже; если имеется значение max-height, прямоугольник размещения будет maximum-line-rectangle, как определено ниже; и если имеется значение line-height, прямоугольник размещения будет per-inline-height-rectangle, как определено ниже. Если уточнение line-stacking-strategy установлено в font-height или max-height, то space-before и space-after оба устанавливаются в половину начального значения; иначе оба они устанавливаются в нуль.

    Прямоугольник nominal-requested-line-rectangle строчной области это прямоугольник, чей start-edge параллелен start-edge прямоугольника содержимого ближайшей ссылочной области-предка и смещён от неё на величину, равную сумме start-indent и start-intrusion-adjustment строчной области, чей end-edge параллелен end-edge прямоугольника содержимого ближайшей ссылочной области-предка и смещён от неё на величину, равную сумме end-indent и end-intrusion-adjustment строчной области, чей before-edge отделён от baseline-start-point на высоту текста/text-altitude родительской блок-области и чей after-edge отделён от baseline-start-point на глубину текста/ text-depth родительской блок-области. Он имеет один и тот же block-progression-dimension/размер-прогрессии-блока для каждой дочерней строчной области в блок-области.

    maximum-line-rectangle/максимальный-прямоугольник-строки для строчной области это такой прямоугольник, чьи start-edge и end-edge параллельны и прилегают к start-edge и end-edge в nominal-requested-line-rectangle/изначально-запрашиваемом-строчном-прямоугольнике и чьё расширение в направлении block-progression-direction является минимально необходимым для вмещения nominal-requested-line-rectangle и прямоугольников размещения всех строчных областей, стэкированных внутри строчной области; это может варьироваться в зависимости от потомков строчной области.

    Номинальный и максимальный строчные прямоугольники

    per-inline-height-rectangle/прямоугольник-инлайн-высоты для строчной области это прямоугольник, чьи start-edge и end-edge параллельны и прилегают к start-edge и end-edge в nominal-requested-line-rectangle и чьё расширение в направлении block-progression-dimension определяется так:

    Расширяемый прямоугольник/expanded-rectangle строчной области это прямоугольник с start-edge и end-edge, прилегающими к соответствующим краям своего прямоугольника размещения, и чьи before-edge и after-edge находятся снаружи относительно соответствующих краёв прямоугольника размещения на расстоянии, равном (a.) половине ведущего значения/half-leading, если прямоугольник размещения области специфицирован как normal-allocation-rectangle при описании генерирующего ОФ, или (b.) - space-before и space-after (соответственно), если прямоугольник размещения области специфицирован как large-allocation-rectangle.
    expanded-nominal-requested-line-rectangle это прямоугольник со start-edge и end-edge, прилегающими к соответствующим краям в nominal-requested-line-rectangle, и чьи before-edge и after-edge находятся снаружи относительно соответствующих краёв nominal-requested-line-rectangle на расстоянии, равном половине ведущего значения.

    Расширение прямоугольника per-inline-height-rectangle в направлении block-progression-direction определяется тогда как минимум, необходимый для вмещения прямоугольников expanded-nominal-requested-line-rectangle и расширенных прямоугольников всех инлайн-областей, стэкированных внутри строчной области; это может варьироваться в зависимости от потомков строчной области.

    ПРИМЕЧАНИЕ:

    Использование прямоугольника nominal-requested-line-rectangle позволяет равное baseline-to-baseline распределение пространства.
    Использование прямоугольника maximum-line-rectangle позволяет применять константное пространство между строчными областями.
    Использование прямоугольника per-inline-height-rectangle и нулевых space-before и space-after позволяет применять стэкирование строчных боксов в стиле CSS. Также значений half-leading включается в расширенный прямоугольник/expanded-rectangle, невзирая на наличие обусловленности, и, таким образом, обусловленность line-height "discard" в данном случае не действует.


    4.6 Inline-areas/Инлайн-области

    Инлайн-область имеет своё собственное уточнение line-height, которое может отличаться от line-height содержащей её блок-области. Это может влиять на размещение её строчной области-предка, если line-stacking-strategy установлена в line-height.
    Инлайн-область имеет таблицу actual-baseline-table для своего шрифта nominal-font. Она имеет уточнение dominant-baseline-identifier, которое определяет выравнивание её стэкированных инлайн-областей-потомков.

    Инлайн-область может или может не иметь дочерние области и, если это так, может или может не быть ссылочной областью/reference-area. Размеры прямоугольника содержимого для инлайн-области без потомков вычисляется так, как специфицировано генерирующим ОФ, так же, как это происходит в инлайн-области с блок-областями-потомками.

    Инлайн-область с инлайн-областями-потомками имеет прямоугольник содержимого, расширяющийся от своей доминантной базовой линии (см. [4.2.6 Таблицы Базовых Линий Шрифтов]) на величину text-depth в направлении block-progression-direction, а в противоположном направлении - на величину text-altitude; в направлении inline-progression-direction он расширяется от start-edge прямоугольника размещения своего первого потомка до end-edge прямоугольника размещения своего последнего потомка. Прямоугольник размещения такой инлайн-области равен её прямоугольнику содержимого.

    Прямоугольник размещения инлайн-области без потомков является normal-allocation-rectangle или large-allocation-rectangle, как специфицировано в описании генерирующего ОФ.

    ПРИМЕЧАНИЕ:

    Если line-stacking-strategy установлена в line-height, размещение выполняется относительно расширенного прямоугольника/expanded-rectangle.

    Инлайн-области с потомками могут включать части инлайн-математических выражений или области, возникшие при использовании смешанных систем письма (слева-направо и справа-налево, например).


    4.6.1 Стэкированные инлайн-области

    Инлайн-области - потомки области обычно стэкируются в направлении inline-progression-direction внутри своей родительской области, это метод по умолчанию при позиционировании инлайн-областей.

    Инлайн-области стэкируются относительно dominant baseline/доминантной базовой линии, как определено ранее ([4.2.6 Таблицы Базовых Линий Шрифтов]).

    Для родительской области P, чти потомки являются инлайн-областями, P определена как properly stacked/правильно стэкированная, если соблюдаются все следующие условия:

  • Для каждой инлайн-области I - потомка P, start-edge, end-edge, before-edge и after-edge прямоугольника размещения I параллельны соответствующим краям прямоугольника содержимого ближайшей ссылочной области - предка I.

  • Для каждой пары нормальных областей I и I' в субдереве ниже P, если I и I' имеют ограничение инлайн-стэкирования S, расстояние между смежными краями в  I и I' соответствует ограничению, вводимому разрешёнными значениями спецификаторов пространства в S.

  • Для любой инлайн-области I - потомка P, расстояние в направлении shift-direction между доминантной базовой линией в P и alignment-point/точкой-выравнивания в I равно смещению между доминантной базовой линией в P и базовой линией в P, соответствующей уточнению alignment-baseline в I, плюс сумма смещений базовой линии для I и всех её предков, являющихся потомками P.

    Первое слагаемое вычисляется для компенсации смешанных систем письма с различными типами базовых линий, а другие слагаемые включают преднамеренные смещения базовых линий для, например, под- и надиндексов.


  • 4.6.2 Глиф-области

    Наиболее типичной инлайн-областью является глиф-область, которая содержит представление для символа (или символов) конкретного шрифта.

    Глиф-область имеет ассоциированный nominal-font/номинальный шрифт, определяемый типографскими уточнениями области, которые применяются к её символьным данным, и glyph-orientation/ориентацию глифа, определяемую её режимом письма writing-mode и reference-orientation, которая определяет ориентацию глифа при выводе.

    Alignment-point и dominant-baseline-identifier глиф-области устанавливаются в соответствии с используемой системой письма (например, базовая линия глифа в западных языках) и используются для управления размещением инлайн-областей - потомков строчной области. Форматировщик может генерировать инлайн-области с отличными от родительских направлениями inline-progression-directions для установки корректного стэкирования инлайн-области при наличии смешанных систем письма.

    Глиф-область не имеет потомков. Её направление block-progression-dimension и таблица actual-baseline-table одни и те же для всех глифов шрифта. В соответствующих реализациях может иметься возможность выбора обсчёта block-progression-dimension для глиф-области на базе реального размера глифа, а не на общем размере для всех глифов шрифта.


    4.7 Ограничения упорядочивания

    4.7.1 Общие ограничения упорядочивания

    Поднабор S областей, возвращаемых объекту форматирования, называется properly ordered/правильно упорядоченным, если области в этом поднаборе имеют тот же порядок, что и их генерирующие объекты форматирования. К примеру, если A1 и A2 являются областями в S, возвращаемом дочерними ОФ F1 и F2, где F1 предшествует F2, тогда A1 обязано предшествовать A2 в предупорядоченном пересечении в дереве областей. Если F1 равно F2 и A1 возвращается до A2, тогда A1 обязано предшествовать A2 в pre-order-traversal дерева областей.

    Для каждого ОФ F и каждого area-class/класса областей C, поднабор, состоящий из областей, возвращаемых в F с area-class C, обязан быть правильно упорядоченным, если иное не специфицировано.


    4.7.2 Конструирование строк

    В этом разделе рассматривается ограничения упорядочивания, применяемые при форматировании fo:block или подобных объектов уровня блока.

    ОФ уровня блока F уровня блока, конструирующий строки, выполняет это путём конструирования блок-областей, которые он возвращает своему родительскому ОФ, и размещения нормальных областей и/или областей-якорей, возвращаемых в F его дочерними ОФ как потомков тех блок-областей или строчных областей, которые он конструирует как потомков блок-областей.

    Для каждого ОФ F можно сформировать упорядоченный раздел P, состоящий из упорядоченных поднаборов S1, S2, ..., Sn нормальных областей и областей-якорей, возвращаемыми дочерними ОФ, с соблюдением всех следующих условий:

  • Каждый поднабор состоит из последовательности инлайн-областей или из одиночной блок-области.

  • Упорядочивание раздела следует после деревом ОФ. Конкретнее, если A находится в Si и B - в Sj с i < j, или если A и B находятся в одном поднаборе Si с A перед B в порядке поднабора, тогда или A возвращается предшествующим родственным ОФ для B, или A и B возвращаются одним ОФ с A, возвращаемым перед B.

  • Разделение происходит в месте разрывов строк. Конкретнее, если A это последняя область в Si и B это первая область в Si+1, то действующие правила языка и письма обязаны разрешать разрыв строки между A и B, в контексте всех областей в Si и в Si+1.

  • Форсированные разрывы строк соблюдаются. Конкретно, если A это глиф-область, генерируемая fo:character, чей символ Unicode - U+000A, тогда A обязано быть последней областью в содержащем её поднаборе Si.

  • Упорядочивание следует порядку дерева областей, за исключением замещений и удалений некоторых глифов. Конкретно, если B1, B2, ..., Bp являются нормальными областями - потомками области или областей. возвращаемыми F (упорядоченными pre-order traversal в дереве областей), тогда имеется соответствие один-к-одному между этими дочерними областями и поднаборами упорядочивания (т.е.  n = p), и для каждого i,

    • если Si состоит из одиночной блок-области, то Bi это данная блок-область, и

    • если Si состоит из инлайн-областей, то Bi это инлайн-область, чьи дочерние области - те же самые, что и инлайн-области в Si, и так же упорядоченные, за исключением тех, чьи действующие правила языка и письма вызывают замещение глиф-областей, их вставку или удаление, тогда замещённые или вставленные глиф-области появляются в дереве областей в соответствующем месте, а удалённые глиф-области не появляются в дереве областей.
      Удаления производятся в тех случаях, когда глиф-область, являющаяся последней в поднаборе Si, имеет значение suppress-at-line-break для suppress, предполагая, что i < n и Bi+1  - это строчная область. Удаления производятся также, если глиф-область, первая в поднаборе Si, имеет значение suppress-at-line-break для suppress, предполагая, что i > 1 и Bi-1 - это строчная область. Вставка и замещение могут производиться при добавлении дефисов для переносов или изменений в грамматике при установке переносов, или при конструировании изображения глифа на основе силлабификации, или формировании лигатуры.

  • Замещения последовательности из глиф-областей одной глиф-областью должны производиться только тогда, когда поле, рамки и заполнение в направлении inline-progression-direction (start- и end-), значения baseline-shift и letter-spacing равны нулю, treat-as-word-space равно false, а значения всех других относящихся к делу уточнений совпадают (т.е., alignment-adjust, alignment-baseline, color trait, background traits, dominant-baseline-identifier, font traits, text-depth, text-altitude, glyph-orientation-horizontal, glyph-orientation-vertical, line-height, line-height-shift-adjustment, text-decoration, text-shadow).

    ПРИМЕЧАНИЕ:

    Строчные области не получают уточнения фона/background или text-decoration от своего ОФ, или любого другого уточнения, требующего генерации знака во время отображения.


    4.7.3 Inline-building/Инлайн-конструирование

    В этом разделе описаны ограничения упорядочивания, применяемые при форматировании fo:inline или подобных объектов инлайн-уровня.

    ОФ F инлайн-уровня, конструирующий одну или более инлайн-областей, выполняет это путём размещения нормальных инлайн-областей и/или якорных инлайн-областей, возвращаемых в F его дочерними ОФ, как потомков инлайн-областей, генерируемых им.

    Для каждого такого ОФ F обязана иметься возможность формирования упорядоченного разделения P, состоящего из упорядоченных поднаборов S1, S2, ..., Sn нормальных и/или якорных инлайн-областей, возвращаемых дочерними ОФ, таким, что всё ниже следующее соблюдается:

  • Каждый поднабор состоит из последовательности инлайн-областей или из одиночной блок-области.

  • Упорядочивание подразделения следует порядку дерева ОФ, как определено выше.

  • Разделение производится в местах разрывов строк, как определено выше.

  • Форсированные разрывы строк соблюдаются, как определено выше.

  • Раздел соблюдает порядок дерева областей, исключая замещения и удаления отдельных глифов, как определено выше.


  • 4.8 Keeps и Breaks

    Условия keep и break применяются для классов областей, которые обычно являются областями станицы-ссылки/page-reference, областями столбцов/column-areas строчными областями. Подходящий класс для данного условия называется context/контекст, а область в данном классе - context-area/контекстная область.
    Как определено в разделе [6.4.1 Введение], page-reference-areas это области, генерируемые fo:page-sequence с использованием спецификаций в fo:page-master, а column-areas/области столбцов это области normal-flow-reference-areas, генерируемые из region-body/тела области, или region-reference-areas, генерируемые из других типов region-master/мастера областей.

    Условие keep или break это открытый оператор для ОФ и соотношений дерева областей, генерируемых им с соответствующими контекстными областями. Эти соотношения дерева в основном определены терминами leading/ведущих или trailing/ведомых областей.
    Если A это потомок P, тогда A определяется как leading в P, если A не имеет предшествующего родственника - нормальной области и не имеет каких-либо областей-предков, предшествующих, но не включающих P. Аналогично, A определяется как trailing в P, если A не имеет последующего родственника - нормальной области и не имеет каких-либо областей-предков, предшествующих, но не включающих P.
    Для любого данного ОФ next/следующий ОФ в потоке является первым последующим ОФ (в порядке pre-order пересечения ), который не является потомком данного ОФ и который генерирует и возвращает нормальные области.

    Условия break это либо break-before, либо break-after. Условие break-before satisfied/выполняется, если первая область, генерируемая и возвращаемая ОФ, является ведущей в context-area/контекстной области. Условие break-after зависит от следующего ОФ в потоке; оно выполняется, если нет последующих ОФ или если первая нормальная область, генерируемая и возвращаемая данным объектом форматирования, является ведущей в контекстной области.

    Условия break вводятся в свойствах break-before и break-after. Очищенное значение page для этих уточнений вводит условие break с контекстом, состоящим из областей page-reference-areas; значение even-page или odd-page вводит условие break с контекстом, состоящим из областей even-numbered page-reference-areas или odd-numbered/нечётнло нумерованных page-reference-areas, соответственно; значение column вводит условие break с контекстом, состоящим из областей столбцов/column-areas. Значение auto в уточнении break-before или break-after не вводит условия break.

    Условия keep это условия keep-with-previous, keep-with-next или keep-together. Условие keep-with-previous в объекте выполняется, если первая область, генерируемая и возвращаемая ОФ, является ведущей в context-area/контекстной области или если нет предшествующих областей в пересечении post-order дерева областей. Условие keep-with-next выполняется, если последняя область, генерируемая и возвращаемая ОФ, не является ведомой в контекстной области или если нет последующих областей в пересечении pre-order дерева областей. Условие keep-together выполняется, если все области, генерируемые и возвращаемые ОФ, являются потомками одной контекстной области.

    Условия keep вводятся компонентами "within-page", "within-column" и "within-line" свойств "keep-with-previous", "keep-with-next" и "keep-together". Очищенное значение каждого компонента специфицирует strength/силу вводимого условия keep, где более высокие номера - более сильные, чем низкие, а значение always сильнее, чем все цифровые значения. Компонент со значением auto не вводит условие keep. Компонент "within-page" вводит keep-условие с контекстом, состоящим из областей page-reference-areas; "within-column" - с контекстом, состоящим из областей столбцов; и "within-line" - с контекстом, состоящим из строчных областей.

    Дерево областей должно удовлетворять всем вводимым условиям break. Каждое условие keep также обязано быть выполнено, исключая случаи, когда это может вызвать невыполнение условий break или stronger keep. Если не все условия из набора keep равной силы могут быть выполнены, тогда обязаны быть выполнены некоторые условия из набора максимально удовлетворяющих условий данной силы (вместе со всеми условиями break и максимальным набором условий stronger keep, если имеются).


    4.9 Модель представления

    В этом разделе объясняется соотношение между деревом областей и визуальным представлением.

    Области генерируют три типа меток/marks:
    (1) фон/background области, если имеется,
    (2) метки, присущие данной области (glyph/глиф, image/изображение или decoration/декорация) если имеются, и
    (3) рамка/border области, если имеется.

    Дерево областей выводится путём отображения меток в устройстве вывода в соответствии с областями дерева областей. В данном разделе описаны геометрическое размещение таких меток и то, как разрешаются конфликты между метками.


    4.9.1 Геометрия

    Каждая область выводится в определённом месте. Семантика ОФ описывает место размещения внутренних меток, относящихся к размещению объекта, т.е. левый, правый, верхний и нижний края прямоугольника содержимого объекта. В этом разделе описывается, как определяется место размещения области, которая определяет размещение своих внутренних меток.

    Для каждой страницы область page-viewport-area изометрически соответствует носителю вывода.

    Область page-reference-area смещается от page-viewport-area, как описано ниже в разделе [4.9.2 Геометрия Порта Просмотра].

    Все области в дереве, имеющие класс области xsl-fixed, позиционируются так, чтобы левые, правые, верхние и нижние края их прямоугольников содержимого (содержащих прямоугольников) были смещены внутрь от прямоугольника содержимого их предка - области page-viewport-area - на расстояния, определённые уточнениями left-position, right-position, top-position и bottom-position, соответственно.

    Любая область в дереве, являющаяся потомком области viewport-area, выводится так, как описано в разделе [4.9.2 Геометрия Порта Просмотра].

    Все прочие области в дереве позиционируются так, чтобы левые, правые, верхние и нижние края их прямоугольников содержимого были смещены внутрь от прямоугольника содержимого их ближайшего предка  - ссылочной области/reference-area на расстояния, определённые уточнениями left-position, right-position, top-position и bottom-position, соответственно. Эти области смещаются вниз и влево на величины уточнений top-offset и left-offset, соответственно, если область имеет для relative-position значение relative.


    4.9.2 Геометрия порта просмотра

    Ссылочная область, являющаяся потомком viewport-area/порта просмотра, позиционируется так, что start-edge и end-edge её прямоугольника содержимого параллельны start-edge и end-edge прямоугольника содержимого её родительского порта просмотра. Start-edge её прямоугольника содержимого смещён от start-edge прямоугольника содержимого её родительского порта просмотра на величину inline-scroll-amount, а before-edge её прямоугольника содержимого смещён от before-edge прямоугольника содержимого её родительского порта просмотра на величину block-scroll-amount.

    Если направление block-progression-dimension ссылочной области больше, чем это же направление порта просмотра и уточнение overflow для ссылочной области имеет значение scroll, то величины inline-scroll-amount и block-scroll-amount определяются механизмом прокрутки, если он имеется, предоставляемым пользовательским агентом. Иначе - обе величины равны нулю.


    4.9.3 Видимость

    Видимость меток зависит от их местоположения, значения visibility области и значения overflow любого предка порта просмотра.

    Если область имеет значение видимости hidden, она не генерирует меток.

    Если область имеет значение overflow - hidden, или если окружение - нединамическое и overflow установлено в scroll, тогда область определяет clipping rectangle/прямоугольник усечения, который определяется как прямоугольник, выводимый из значения уточнения clip для области; и для любой метки, генерируемой одной из её областей-предков, части метки, находящиеся вне прямоугольника усечения, не выводятся.


    4.9.4 Рамка, заполнение и фон

    Прямоугольники рамки и заполнения определяются относительно прямоугольника содержимого значениями обычных уточнений ширины заполнения и рамки (border-before-width, и т.д.).

    В любой области, не являющейся дочерней относительно порта просмотра, рамка отображается между прямоугольником рамки/border-rectangle и прямоугольником заполнения/padding-rectangle в соответствии с обычными уточнениями цвета рамки и стиля. Для потомков порта просмотра рамка не отображается.

    Для области, не являющейся частью пары порт просмотра/ссылка, фон отображается. Для области, являющейся портом просмотра или ссылочной областью в паре порт просмотра/ссылка, если очищенное значение background-attachment равно scroll и величина block-progression-dimension ссылочной области больше, чем та же величина в порте просмотра, то фон отображается в ссылочной области, но не в порте просмотра, в противном случае фон отображается в порте просмотра, но не в ссылочной области.

    Фон, если имеется, отображается в прямоугольнике заполнения в соответствии с уточнениями background-image, background-color, background-repeat, background-position-vertical и background-position-horizontal.


    4.9.5 Внутренние метки

    Для каждого класса объектов форматирования метки, принадлежащие его генерируемым областям, специфицируются в описании ОФ. Например, объект fo:character генерирует глиф-область, и она отображается путём прорисовки глифа внутри прямоугольника содержимого этой области в соответствии с уточнениями шрифта области и уточнениями glyph-orientation и blink.

    Кроме того, другие уточнения (например, различные уточнения score/подчёркивание и score-color) специфицируют и иные внутренние метки. В случае с уточнениями score (underline-score, overline-score и through-score), толщина линии и позиция специфицируются действующим nominal-font/номинальным шрифтом; там, где шрифт не специфицирует эти величины, они зависят от реализации.


    4.9.6 Расположение по слоям и конфликт меток

    Метки располагаются по слоям (как описано ниже), что определяет частичное упорядочивание меток - то, какие метки расположены ниже (других).

    Две метки определены как конфликтующие, если они применяются к одной и той же точке носителя вывода. Если две метки конфликтуют, та, которая ниже, не влияет на точку носителя вывода в том месте, где они обе применяются.

    Метки, генерируемые одной и той же областью, располагаются слоями: фон области находится ниже внутренних меток области, а внутренние метки области находятся ниже рамки.
    Расслоение среди внутренних меток области определяется семантикой генерирующего ОФ области и его свойствами. Например, прорисовка глифа в глиф-области производится ниже меток, генерируемых для text-decoration.

    Упаковочный слой области определяется контекстом стэкирования и значением его (слоя) z-индекса. Слой стэкирования/упаковки области A определяется как меньший относительно слоя упаковки области B, если некоторый ancestor-or-self/предок-или-сама A' для A и B' для B имеют одинаковый контекст стэкирования, и z-индекс для A'  - меньше, чем z-индекс для B'.
    Если ни один слой стэкирования не является меньшим относительно другого, тогда они определяются как расположенные в одном слое стэкирования.

    Если A и B это области и слой стэкирования для A меньше, чем слой стэкирования для B, тогда все метки, генерируемые A, находятся ниже всех меток, генерируемых B.

    Если A и B это области одного слоя стэкирования, то фон A и B проявляется ниже всех других меток, генерируемых A и B. Далее, если A это предок B (в том же слое стэкирования), то фон A находится ниже всех областей B, а все области в B находятся ниже внутренних областей (и рамки) A.

    Если  A и B имеют общий слой стэкирования и ни один из них не является предком для другого, то будет считаться ошибкой, если конфликтуют их фоны или если нефоновая метка в A конфликтует с нефоновой меткой в B. Конкретные реализации могут выполнять исправление, продолжая работу так, как будто метки из первой области с порядком пересечения pre-order находятся ниже меток другой области.


    4.10 Образец дерева областей

     

    Назад

    Оглавление

    В начало страницы

    Вперёд



    Внимание! Если у вас не получилось найти нужную информацию, используйте рубрикатор или воспользуйтесь поиском


    .



    книги по программированию исходники компоненты шаблоны сайтов C++ PHP Delphi скачать