В. А. Капустин Содержание Формальные структуры текстовых документов 1 Курс лекций

Вид материалаКурс лекций
Лекция 6.Структура основной части документа TEI
Блочная структура текста
Структура тела документа
Другие элементы блочной структуры
Подобный материал:
1   ...   9   10   11   12   13   14   15   16   17

Лекция 6.Структура основной части документа TEI


Основная часть текста (body), как уже говорилось выше, может содержать элементы нескольких классов:
  • Блочная структура текста
  • Закладки
  • Выделения
  • Цитаты
  • Примечания
  • Перекрёстные ссылки и связи
  • Редакторская правка, пропуски, удаления и дополнения
  • Имена, даты, числа, сокращения и адреса
  • Списки
  • Библиографические ссылки
  • Таблицы
  • Рисунки и графика
  • Интерпретация и анализ
  • Техническая документация

Некоторые из них используются для разметки блоков текста, другие – для разметки по­то­ковых фрагментов текста. Не все они употребляются одинаково часто. Остановимся под­робнее на некоторых часто используемых элементах.

Блочная структура текста


Полная DTD TEI имеет блочную организацию; в ней отдельные группы элементов, кото­рые должны встречаться вместе, собраны в параметрические сущности, поэтому устройс­т­во этого DTD более или менее может быть понято (более или менее потому, что этим па­раметрическим сущностям даны, в отличие от DocBook, недостаточно мнемонические имена). DTD TEI Light, однако, вообще не использует параметрические сущности, что де­лает изучение этого DTD непростым занятием. Я соберу некоторые группы элементов TEI Light в классы, для обозначения каждого такого класса использую параметрическую сущ­ность, которой дам своё имя.

Структура тела документа


Сначала я определю класс «маркирующих» элементов, предназначенных для отметки ви­димой или невидимой области в документе (эта область может вырождаться и точку, например, для элементов anchor и pb):

% body.marks
"anchor | gap | index | interp | interpGrp | lb | milestone | pb"
>

Затем определяем класс элементов, которые могут входить как в заголовок, так и в завер­шающую часть тела (не путать с титульным листом и завершающей частью документа – TEI допус­кает дополнительный заголовок и завершающую часть для тела документа и да­же для разделов):

"byline | dateline | epigraph | salute | signed"
>

Теперь можно определить заголовок и завершающую часть тела (перечисление элемен­тов, которые могут входить только в заголовок, и элементов, которые могут входить толь­ко в завершающую часть, я вынес в отдельные параметрические сущности). Вот структура заголовка:

% body.header.elements
"( argument | docAuthor | docDate | head | opener | signed )"
>
% body.header
"( %body.header.elements; | %body.marks; | %body.framingElements; )"
>

Завершающая часть в TEI Light определена несколько иным способом (явно выделена про­извольная цепочка маркирующих элементов):

% body.trailer.elements
"(closer | trailer | %body.framingElements; )"
>
"(%body.trailer.elements; , ( %body.marks; )*)"
>

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

Теперь можно перейти к определению собственно (тела ) тела документа. Это тело тела может состоять непосредственно из размеченного текста (за которым может следовать не­который набор разделов), либо только из некоторого набора раз­делов. Сначала соберём в отдельный класс элементы, которые могут быть использованы вне разделов (out of div – «внераздельная» разметка):

% body.outOfDiv
"(eg | bibl | biblFull | ab | l | lg | p | sp | cit | q
| label | list | listBibl | note | stage)"
>

На уровне тела тела документа нельзя использовать произвольные разделы: это должны быть разделы уровней 0 (div0) или 1 (div1) или рекурсивные разделы (div), либо разде­лы, сгенерированные программно (текстовым процессором или иной программой – «ав­то­матические разделы» divGen). Чтобы яснее выразить праворекурсивные правила, определяющие возможность использования вперемешку разделов одного и того же уров­ня и программно сгенери­ро­ванных разделов (вместе с маркирующими элементами), оп­ределим «хвостовые» части цепочек, состоящих из одних и тех же разделов:

% body.tail.R "(div | divGen | %body.marks;)" >
% body.tail.0 "(div0 | divGen | %body.marks;)" >
% body.tail.1 "(div1 | divGen | %body.marks;)" >

Теперь можно определить сами цепочки, состоящие из одних и тех же разделов:

% body.R "(div, %body.tail.R;*)" >
% body.0 "(div, %body.tail.0;*)" >
% body.1 "(div, %body.tail.1;*)" >

«Ручная разметка» состоит из разделов одного и того же вида (уровней 0 или 1 или рекур­сивных разделов):

Автоматическая разметка может перемежаться маркировочными элементами:

В результате определение тела документа приобретает понятный вид: сначала в теле до­кумента должны быть использованы элементы заголовка тела (в любом количестве; в том числе заголовок тела может и отсутствовать), затем идёт «тело тела», а затем – элементы завершающей части тела, которая также может отсутствовать:

body
(
%body.header;*,
(
(
( %body.outOfDiv; , ( %body.marks; )* )+ ,
%body.div.generated;*, %body.div.byHand;?
)
|
( %body.div.generated;*, %body.div.byHand;? )
),
%body.trailer*
)
>

Строение «тела тела» также теперь очевидно. Оно может быть образовано двумя спосо­бами:

1 (
2 ( %body.outOfDiv; , ( %body.marks; )* )+ ,
3 %body.div.generated;*, %body.div.byHand;?
4 )
5 |
6 ( %body.div.generated;*, %body.div.byHand;? )

В первом способе перед необязательными разделами следует некоторая часть текста, раз­меченная с использованием элементов класса body.outOfDiv (вперемешку с маркиру­ю­щими элементами). Во втором – такая часть текста отсутствует.

Замечание

Наличие именно таких альтернатив в описании тела тела документа объясняется не­об­ходимостью допустить три варианта строения этой части элемента:
  • Только внераздельная разметка (строка 2)
  • Внераздельная разметка (строка 2), за которой следуют разделы (строка 3)
  • Только разделы (строка 6)

Четвёртый вариант – отсутствие содержимого – невозможен из-за наличия скобок, ок­ружающих «тело тела» (выделены полужирным шрифтом в объявлении body) – по­скольку после скобок нет знаков ? или *, то что-нибудь из описанного внутри скобок содержимого должно присутствовать.

Если думать о DTD как о порождающей грамматике (это так в случае применения DTD в инструментах типа Altova Authentic), то объявление тела документа можно бы­ло бы ещё сократить:

body
(
%body.header;*,
(
( ( %body.outOfDiv; , ( %body.marks; )* )+ )? ,
%body.div.generated;*, %body.div.byHand;?
),
%body.trailer*
)
>

Однако, возможно, распознающая грамматика с таким правилом не является детер­ми­нированной – это нуждается в проверке.

На самом деле DTD TEI Light порождается из DTD TEI автоматически, поэтому подоб­ные сокращения следует делать с осторожностью.

Раздел


Все разделы ручной разметки (рекурсивные div и разделы всех уровней – от div0 до div7), имеют оди­на­ковую структуру (с той лишь оговоркой, что в разделы div0div6 входят разделы следующего уровня, в раздел div – только разделы div, а в div7 ника­кие разделы не входят – место вхождения таких разделов я выделил полужирным шриф­том). Структура раздела напоминает структуру тела тела документа (и даже можно ис­пользовать уже объявленные сущности):

div
(
%body.header;*,
(
( (div | divGen), (%body.marks;)* )+
|
(
( %body.outOfDiv; , (%body.marks;)* )+,
( (div | divGen), (%body.marks;)* )*
)
),
%body.trailer;*
)
>

Приведу для примера объявление раздела первого уровня:

div1
(
%body.header;*,
(
( (div2 | divGen), (%body.marks;)* )+
|
(
( %body.outOfDiv; , (%body.marks;)* )+,
( (div2 | divGen), (%body.marks;)* )*
)
),
%body.trailer;*
)
>

В этих объявлениях важно обратить внимание на структуру тела раздела. Существуют два варианта этой структуры:
  • Тело раздела начинается с раздела (более глубокого уровня в случае нумерованного раздела; ре­кур­сивного раздела div в случае рекурсивного раздела div; или сгене­ри­рованного раздела).

В этом случае элементы, расположенные вне разделов, на уровне раздела употреб­лять нельзя. На уровне раздела используются исключительно разделы более глубо­кого уровня, сгенерированные разделы и маркирующие элементы.
  • Тело начинается с элементов, которые расположены вне раздела.

В этом случае за цепочкой элементов, которые расположены вне раздела (возмож­но, разбавлен­ной маркирующими элементами), идёт цепочка разделов более глубо­кого уровня, сгенерированных разделов и маркирующих элементов.

Таким образом, раздел может начинаться с элементов, которые допустимы в разделе (%outOfDiv;), и состоять только из таких элементов, но вслед за такими элементами могут идти другие разделы.

Генерируемые разделы – divGen – представляют собой пустой элемент.

Другие элементы блочной структуры


К блочной структуре также относятся:
  • p – абзац
  • ab – «анонимный блок», содержащий произвольную часть текста (например, фра­зу), без семантической нагрузки, которую несёт абзац
  • lg – стихотворная строфа
  • l – стихотворная строка
  • stage – авторские замечания (ремарки в пьесе и т.п.)