В. А. Капустин Содержание Формальные структуры текстовых документов 1 Курс лекций
Вид материала | Курс лекций |
Лекция 6.Структура основной части документа TEI Блочная структура текста Структура тела документа Другие элементы блочной структуры |
- Курс лекций по дисциплине " основы компьютерных технологий" Часть I. Microsoft Word, 432.92kb.
- Сферы использования текстовых документов, 52.06kb.
- Курс, 1-й семестр лекции (51 час), экзамен практикум на ЭВМ (68 часов), зачет (с оценкой), 24.4kb.
- Календарный план курса учебных занятий по спецкурсу «Формальные языки моделирования, 61.45kb.
- Тема: Создание документов в текстовых редакторах, 13.54kb.
- Н. Э. Баумана Кафедра Компьютерные системы и сети Г. С. Иванова, Т. Н. Ничушкина Оформление, 109.65kb.
- Формальные и неформальные структуры, их роль в организации содержание, 304.91kb.
- Текстовые редакторы это программы для создания и редактирования текстовых документов, 263.8kb.
- Курс лекций Преподаватель Михайлов Н. Л. Рыбинск 2001, 562.19kb.
- Курс лекций Барнаул 2001 удк 621. 385 Хмелев В. Н., Обложкина А. Д. Материаловедение, 1417.04kb.
Лекция 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), имеют одинаковую структуру (с той лишь оговоркой, что в разделы div0 – div6 входят разделы следующего уровня, в раздел 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 – авторские замечания (ремарки в пьесе и т.п.)