Лекция 5. TEI
Основное назначение TEI, в отличие от DocBook, заключается не в передаче логической структуры документа, а в выделении в документе тех его составляющих, которые необходимы для конкретных целей (исследования, поиска и пр.). При этом могут оставаться без внимания (и, следовательно, без разметки) многие другие элементы структуры текста. Как и DocBook, TEI позволяет размечать документы различного уровня: от корпуса (собрания документов, не имеющего аналога в DocBook) до фрагмента технической документации.
TEI, в отличие от DocBook, не представляет собой единственное объявление типа документа. TEI имеет модульную структуру, позволяющую собирать DTD для конкретного применения из нескольких десятков модулей. Для управления такой сборкой в TEI использован механизм условных разделов DTD. Поэтому сначала рассмотрим этот механизм.
Ещё несколько слов про XML
Общая структура DTD содержит внешнее и внутреннее ограничения (3, разд. 2.8):
'<!DOCTYPE' S Name (S ExternalID)? S? ('[' intSubset ']' S?)? '>'
ExternalID указывает на внешний по отношению к DTD ресурс (URL или файл), содержащий часть объявлений (сущностей, элементов и атрибутов); текст этого ресурса называется внешним ограничением (для того XML-документа, который будет связан с рассматриваемым DTD);
intSubset содержит объявления, обладающие приоритетом по отношению к объявлениям, содержащимся во внешнем ограничении; эта совокупность объявлений называется внутренним ограничением.
В принципе, структура текста внутреннего и внешнего ограничений имеет единственное отличие (3, разд. 2.8): в части DTD, вынесенной во внешнее ограничение (или во внешние параметрические сущности) допускается использование так называемых условных разделов (conditional sections):
intSubset ::= ( markupdecl | DeclSep)*
extSubsetDecl ::= ( markupdecl | conditionalSect | DeclSep)*
markupdecl представляет объявления (сущностей, элементов и атрибутов);
DeclSep – разделители (пробельный материал, инструкции обработки и комментарии);
conditionalSect – те самые условные разделы, которые мы сейчас и рассмотрим.
Условные разделы объявления типа документа
Условный раздел имеет следующую структуру (следующие 5 правил приведены в 3, разд. 3.4; я сохранил нумерацию правил):
[61] conditionalSect ::= includeSect | ignoreSect
[62] includeSect ::= '<![' S? 'INCLUDE' S? '[' extSubsetDecl ']]>'
[63] ignoreSect ::= '<![' S? 'IGNORE' S? '[' ignoreSectContents* ']]>'
[64] ignoreSectContents ::= Ignore ('<![' ignoreSectContents ']]>' Ignore)*
[65] Ignore ::= Char* - (Char* ('<![' | ']]>') Char*)
Интерпретация этих правил проста:
[61] – условный раздел может представлять включаемый или исключаемый раздел.
[62] – включаемый раздел оформляется как начало DTD (<![), за которым (через необязательные пробелы) следует слово INCLUDE, написанное заглавными буквами, за которым через необязательные пробелы следует открывающая угловая скобка. За ней находится содержимое включаемого раздела, представляющее собой всё то, что допустимо во внешнем ограничении, – т. е. объявления, разделители и снова условные разделы. Заканчивается включаемый раздел так же, как и DTD – ']]>'.
[63] – исключаемый раздел начинается так же, как и включаемый, но вместо INCLUDE используется слово IGNORE, также написанное заглавными буквами. И заканчивается исключаемый раздел так же, как и включаемый. Однако тело исключаемого раздела определено двумя последующими правилами. Эти правила удобнее прокомментировать в обратном порядке.
[65] – игнорировать любой текст (в том числе и пустой), в котором нет характерных для DTD сочетаний символов: '<![' и ']]>'. Такой текст будем называть игнорируемым.
[64] – тело исключаемого раздела – это игнорируемый текст, за которым, возможно, идут пары, состоящие из заключенного в '<![' и ']]>' тела исключаемого раздела и игнорируемого текста. Это правило необходимо для подсчета «открывающих» ('<![') и «закрывающих» (']]>') DTD-скобок – в теле исключаемого раздела они должны быть строго вложены (когда встречается невложенная закрывающая DTD-скобка, исключаемый раздел считается законченным).
Семантика включаемого раздела проста: его текст включается в DTD, используемое XML-процессором при анализе документа. При этом выполняются обычные действия, например, подстановка значений параметрических сущностей.
Семантика исключаемого раздела сложнее. Тело исключаемого раздела полностью игнорируется XML-процессором: игнорируется наличие включаемых разделов, вложенных в исключаемый раздел; подстановка значений сущностей не выполняется, инструкции обработки игнорируются и т. д.
Применение условных разделов объявления типа документа
Пример условных разделов объявления типа документа
<!ENTITY % draft 'INCLUDE' >
<!ENTITY % final 'IGNORE' >
<![%draft;[
<!ELEMENT book (comments*, title, body, supplements?)>
]]>
<![%final;[
<!ELEMENT book (title, body, supplements?)>
]]>
Приведённый пример иллюстрирует использование условных разделов объявления типа документа: в DTD включается весь текст, который может/должен быть использован в различных ситуациях применения DTD, сами ситуации обозначаются параметрическими сущностями, имеющими значения INCLUDE или IGNORE; части текста DTD, которые должны быть использованы в соответствующей ситуации, включаются в раздел, в котором вместо ключевых слов INCLUDE или IGNORE использована ссылка на параметрическую сущность. Замена значений сущностей изменит DTD:
<!ENTITY % draft 'IGNORE' >
<!ENTITY % final 'INCLUDE' >
TEI использует сотни параметрических сущностей со значениями INCLUDE или IGNORE, что, с одной стороны, позволяет производить тонкую настройку DTD, но, с другой стороны, требует тщательного изучения DTD TEI.
Версии TEI
Текущая стабильная версия
Текущей стабильной версией TEI является версия 4. Предыдущие версии разрабатывались, в основном, для SGML. В версии 4 DTD разработано так, что обеспечивает поддержку как SGML-документов, так и XML-документов. Для работы с XML-документами при использовании полного варианта TEI, однако, необходимо включение соответствующего модуля:
<!ENTITY % TEI. XML "INCLUDE">
Руководства по настройке и применению текущей стабильной версией TEI находятся на сайте консорциума TEI 4.
TEI Light
Кроме полного варианта DTD TEI существует официальный упрощенный вариант, т. н. TEI Light. TEI Light включает несколько наиболее употребительных модулей TEI:
<!ENTITY % TEI. prose 'INCLUDE' >
<!ENTITY % TEI. linking 'INCLUDE' >
<!ENTITY % TEI. analysis 'INCLUDE' >
<!ENTITY % TEI. figures 'INCLUDE' >
<!ENTITY % TEI. extensions. ent SYSTEM 'teilitex. ent' >
<!ENTITY % TEI. extensions. dtd SYSTEM 'teilitex. dtd' >
<!ENTITY % TEI. XML "INCLUDE">
DTD TEI Light не содержит условных разделов. Руководство по TEI Light также можно найти на сайте консорциума TEI (причем на русском языке 5).
Разрабатываемая версия
В настоящее время разрабатывается пятая версия TEI. Она разрабатывается с использованием XML-схемы. Рабочий вариант пятой версии TEI (вместе с предварительной версией документации) находится на «фабрике проектов» Source Forge (проект TEI).
TEI Light
Объявление типа документа TEI Light, как правило, используется для разметки единственного документа (а не для разметки корпусов как целого). Именно такое применение TEI Light мы и будем рассматривать. Для единственного документа документ TEI Light всегда имеет один и тот же корневой элемент с именем TEI.2, состоящий из заголовка TEI и собственно размеченного текста («текста TEI»):
<!ELEMENT TEI.2 (teiHeader, text) >
Заголовок TEI (часто называемый «электронный титульный лист»), как видно из приведённого объявления элемента TEI.2, обязан присутствовать. В заголовке TEI содержится информация, аналогичная той, что находится на титульном листе печатного текста (метаданные). Она может содержать до четырех частей: библиографическое описание машиночитаемого текста, описание способа разметки, небиблиографическое описание текста (параметры текста), и архив исправлений. Более подробно заголовок будет рассмотрен ниже.
Текст TEI может быть монолитным (отдельное произведение) или объединенным (набор отдельных произведений, как, например, в антологии). В любом случае текст может иметь необязательные вводную (front) и закрывающую (back) части. Между ними располагается основная часть текста (body), которая, в случае объединенного текста, может состоять из групп (group), а они, в свою очередь, из других групп или текстов:
<!-- Вспомогательные элементы могут встречаться почти всюду -->
<!ENTYTY % text. aux
'anchor | gap | index | interp | interpGrp | lb | milestone | pb'>
<!ELEMENT text
((%text. aux;)*,
(front, (%text. aux;)*)?,
(body | group),
(%text. aux;)*,
(back, (%text. aux;)*)?
)
>
В результате разметки монолитного текста получается структура, подобная приведенной ниже:
<TEI.2>
<teiHeader> <!-- Заголовок TEI --> </teiHeader>
<text>
<front> <!-- Вводная часть...--> </front>
<body> <!-- Тело текста... --> </body>
<back> <!-- Завершающая часть ... --> </back>
</text>
</TEI.2>
Объединенный текст также имеет необязательные вводную и закрывающую части. Между ними располагается одна или несколько групп текстов, каждая из которых тоже может иметь свои собственные вводные и завершающие части. Таким образом, в результате разметки объединенного текста получается структура, подобная приведенной ниже:
<TEI.2>
<teiHeader> <!-- Заголовок объединенного текста --> </teiHeader>
<text>
<front> <!-- Вводная часть объединенного текста --> </front>
<group>
<text>
<front> <!-- Вводная часть первого текста --> </front>
<body> <!-- Тело первого текста --> </body>
<back> <!-- Завершающая часть первого текста --> </back>
</text>
<text>
<front> <!-- Вводная часть второго текста --> </front>
<body> <!-- Тело второго текста --> </body>
<back> <!-- Завершающая часть второго текста --> </back>
</text>
<!-- Другие группы или тексты -->
</group>
<back> <!-- Завершающая часть объединенного текста --> </back>
</text>
</TEI.2>
Разметка основной части текста
Элемент body содержит всю основную часть одного монолитного текста, исключая то, что относится к вводной или завершающей частям текста. Этот элемент включает несколько классов элементов:
w Блочная структура текста
Сюда входят абзац (p) и разделы (div1 … div7, div), аналогичные частям, главам и секциям (вместе взятым) DocBook; заголовки и заключения (head и trailer) разделов. В этот же класс элементов включаются обозначения структур, специфических для определенного жанра: строфа (lg), стихотворная строка (l), обозначение персонажа (speaker) и прямой речи персонажа (sp), авторские замечания (stage, как правило, в тексте пьесы).
w Закладки
Закладки – это, прежде всего, номера строк (lb, этим элементом помечаются также разрывы строк) и страниц (pb). Номера строки страниц обычно связаны с конкретным изданием. Кроме этих элементов, в классе закладок присутствует элемент, предназначенный для обозначения произвольного маркера – milestone.
w Выделения
Выделения общего вида (когда причина выделения неизвестна) размечаются элементом hi (от английского highlight). В том случае, когда причина выделения ясна, можно использовать специализированные элементы, размечающие слова или фразы: выделяемые с целью получения лингвистического или риторического эффекта (emph); написанные на языке, отличающемся от языка основного текста (foreign); упомянутые, но не использованные (mentioned); рассматриваемые как технический термин (term); содержащие название произведения (title).
Большинство элементов, не связанных непосредственно с выделениями в тексте, имеет атрибут rend, значения которого позволяют передавать типографские особенности выделения (например, особенности шрифта и блочность или потоковость выделения).
w Цитаты
TEI позволяет размечать 4 вида цитат: цитата общего вида (речь или мысль, отмеченные как принадлежащие другому автору (независимо от того, действительно ли данный отрывок является цитатой); в сюжетно-повествовательных текстах таким образом отмечается прямая речь персонажа или оратора, а в словарях элемент этот элемент можно использовать для обозначения реальных или искусственных примеров использования) размечается элементом q; слова или фразы упомянутые, но не использованные (mentioned); слова или фразы, за которые автор или рассказчик снимает с себя ответственность, что обозначается кавычками или курсивом (soCalled); слова или фразы, которые представляют собой толкование (глоссу) или определение какого-либо другого слова или фразы (gloss).
w Примечания
Любые примечания, которые печатаются в виде сносок, примечаний в конце текста, маргиналий (примечаний на полях) или как-либо по-иному, следует обозначать с помощью одного и того же элемента note.
w Перекрёстные ссылки и связи
Перекрёстные ссылки и связи внутри документа TEI и перекрёстные ссылки и связи с другими документами (TEI и не TEI) размечаются по-разному. Для ссылок внутри документа TEI используются два элемента: ref и ptr (первый – контейнер, который может содержать текст и/или другие элементы; второй – пустой). Ссылка всегда должна вести к элементу, поэтому для создания в документе точек или сегментов, на которые можно было бы ссылаться, можно использовать любые элементы TEI, в том числе и специально для этого предназначенные: anchor и seg (первый – пустой – для создания точки, на которую можно сослаться; второй – контейнер – для отметки произвольного отрезка текста).
Для связи с другими документами используются элементы xref и xptr, причем для указания точки связывания в других документах используется язык XPath.
Для всех элементов TEI определены атрибуты связывания, позволяющие во многих случаях обойтись без использования элементов ref, ptr, anchor и seg.
w Редакторская правка, пропуски, удаления и дополнения
Элементы этого класса используются для разметки исправлений, т. е. изменений, внесенных редактором в тех местах, где по его мнению, в оригинале имеется ошибка. Кроме исправления или нормализации слов и фраз, редакторы и публикаторы могут предложить вставить пропущенные материалы, не публиковать некоторые материалы или ввести материалы, вычеркнутые из оригинала. Кроме того, некоторые материалы могут оказаться исключительно сложными для передачи, поскольку их непросто разместить на странице (например, рисунки рукописи).
w Имена, даты, числа, сокращения и адреса
Этот класс содержит элементы: для разметки имён собственных (name), относящихся к персонам, и т. н. «называющих строк» (rs), которые представляют собой имена собственные, относящиеся к объектам (географические названия, названия кораблей и т. п.); дат (date) и времён (time); чисел (num); сокращений (abbr) с указанием соответствующих полных форм (в виде значения атрибута expan элемента abbr); адресов (addr). Адрес (addr), в свою очередь, состоит из строк адреса (addrLine).
w Списки
Этот класс элементов содержит собственно список (list) и элемент списка (item). Нумерованность или маркированность списка управляются атрибутами. Ненумерованный и немаркированный список может использоваться как глоссарий; в этом случае для терминов используется элемент label, а определения размечаются элементом item. Элемент label позволяет размечать достаточно произвольные списки.
w Библиографические ссылки
Для разметки библиографических ссылок используется элемент bibl. Его содержимое может (но необязательно) быть структурировано с помощью элементов author (первичные сведения об ответственности), title (заглавие), editor (вторичные сведения об ответственности), imprint, publisher и pubPlace (сведения о публикации), series (сведения о серии), biblScope (подробность и уровень описания).
w Таблицы
Этот класс элементов содержит три элемента: table, row, cell.
w Рисунки и графика
Для рисунков и графики используется один из двух элементов: figure или figDescr. Первый используется тогда, когда графика должна быть представлена в электронном документе; в этом случае графический файл должен быть представлен т. н. неразбираемой сущностью XML. Элемент используется для описания графического компонента текста в том случае, когда этот компонент по каким-то причинам не будет визуализирован.
w Интерпретация и анализ
Этот класс элементов на самом деле содержит элементы, назначение которых может меняться от приложения к приложению. Для выделения неделимых фрагментов текста (часто – слов, например, для синтаксической разметки) используется элемент s. Элементы s не следует вкладывать друг в друга, хотя это формально и не запрещено. Для создания «опорных точек» – фрагментов текста, на которые можно ссылаться, используется элемент seg. Для произвольных интерпретаций (комментариев, морфологической разметки и пр.) используется пустой элемент interp, содержащий интерпретирующую аннотацию, которую можно связать с некоторой частью текста. Элементы interp можно объединять в группы – контейнеры interpGrp.
w Техническая документация
Элементы этого класса применяются как для разметки документации (подобно DocBook), так и для целей подготовки документов TEI к публикации.
Некоторые элементы этого класса предназначены для разметки специфических фрагментов текстов документации: кратких примеров (eg); фрагментов кода (code), идентификаторов (ident); имена элементов XML или SGML (gi); ключевых слов на формальном языке (kw); математических, химических и иных формул (formula). Для записи формул, как правило, используется TEX и, при необходимости, секции символьных данных (<![CDATA[ ... ]]>).
Другие элементы предназначены для указания мест в документе, в которые будут помещены разделы, создаваемые обрабатывающим документ приложением: разделы общего вида (divGen) и указатели (index).
Кроме элементов, руководство 5 (разработанное ещё в до-Юникодовскую эру) настоятельно рекомендует для всех символов, отличных от латиницы и цифр, а также от небольшого набора знаков препинания, использовать общие сущности, обозначающие соответствующий символ, например, % вместо знака "%" (DTD TEI Light содержит 340 объявлений подобных сущностей). В настоящее время применение XML/Unicode эту рекомендацию сделало неактуальной, её следует соблюдать только в том случае, если документ будет обрабатываться в устаревшем приложении.
Разметка вводной части текста
Структура вводной части текста определяется следующим объявлением:
<!ELEMENT front
(
(divGen | titlePage | anchor | gap | index | interp
| interpGrp | lb | milestone | pb)*,
(
(
(argument | byline | docAuthor | docDate | docEdition
| docImprint | docTitle | epigraph | head
| titlePart),
(argument | byline | docAuthor | docDate | docEdition
| docImprint | docTitle | epigraph | head
| titlePart
| titlePage | anchor | gap | index
| interp | interpGrp | lb | milestone | pb)*
)
|
(div,
(div | divGen | titlePage | anchor | gap | index | interp
| interpGrp | lb | milestone | pb)*
)
|
(div1,
(div1 | divGen | titlePage | anchor | gap | index
| interp | interpGrp | lb | milestone | pb)*
)
)?
)
>
Фактически, вводная часть текста может содержать информацию о титульном листе (titlePage) и/или его фрагментах и/или элементах, расположенных на контртитуле, обороте титульного листа и т. п. (части объявления, начинающиеся с элемента argument), а также различные вводные тексты (элементы div и div1).
Титульный лист
Никакие вложенные в элемент front элементы не являются обязательными (обратите внимание на наличие знаков * и ?), однако рекомендуется использовать по крайней мере элемент titlePage, описывающий титульный лист произведения, или те элементы, которые входят в него, но могут быть использованы непосредственно в элементе front:
<!ELEMENT titlePage
(
(anchor | gap | index | interp | interpGrp | lb
| milestone | pb)*,
(byline | docAuthor | docDate | docEdition | docImprint
| docTitle | epigraph | figure | titlePart),
(byline | docAuthor | docDate | docEdition | docImprint
| docTitle | epigraph | figure | titlePart
| anchor | gap | index | interp | interpGrp
| lb | milestone | pb)*
)
>
В структуре титульного листа могут быть выделены следующие элементы, не являющиеся служебными:
w docTitle
Содержит название документа, включая все его составляющие, в том виде, как они приведены на титульном листе. Должен содержать по крайней мере один элемент titlePart.
<!ELEMENT docTitle
(
(anchor | gap | index | interp | interpGrp | lb | milestone | pb)*,
(titlePart,
(anchor | gap | index | interp | interpGrp | lb | milestone | pb)*
)+
)
>
w titlePart
Содержит подразделы или части названия произведения, как они представлены на титульном листе; этот элемент используется также для свободно размещаемых фрагментов титульного листа, не являющихся частями названия документа, для указания авторства и т. д. Может включать разнообразные элементы разметки.
w byline
Содержит первичные сведения об ответственности, приведенные на титульном листе, либо в начале или в конце произведения.
w docAuthor
Содержит имя автора документа, как приведено на титульном листе (часто, но не всегда содержится в элементе byline).
w docDate
Содержит дату (создания, печати) документа, как она представлена (обычно) на титульном листе.
w docEdition
Содержит сведения о редакции документа («Издание 2-е, исправленное и дополненное»), как они представлены на титульном листе.
w docImprint
содержит сведения об издании (место и дату публикации, название издательства), как представлено (обычно) в нижней части титульного листа.
w epigraph
содержит цитату, анонимную или с указанием автора, которая приводится в начале раздела, главы или на титульном листе.
Фрагменты титульного листа и других вводных элементов документа
Руководство 5 ошибочно описывает некоторые элементы, как допустимые во вводной и завершающей частях текста. Текущая версия DTD TEI Light некоторые из описанных в 5 элементов допускает только в завершающей части текста, но не во вводной. Приведу некоторые элементы, допустимые во вводной части текста (другие допустимые в этом месте элементы уже описаны выше):
w argument
Формальный список или описание тем, раскрываемых в данном подразделе текста.
w head
Заголовок. Может содержать многочисленные элементы фразовой разметки. Во вводной части документа часто содержит элементы argument и byline и следующие элементы:
w salute
Содержит приветствие, предваряющее предисловие, посвятительное послание или другой раздел текста, а также приветствие в конце письма, предисловия и т. п.
w dateline
Содержит краткое описание места, дату, время и т. п. создания письма, газетной статьи или другого произведения, предваряющее его как особый вид заголовка.
w opener
Группирует вместе элементы dataline, byline, salute или подобную им информацию, которая появляется в качестве вступительной части в начале раздела, особенно в начале письма. Может содержать многочисленные элементы фразовой разметки.
Крупные блоки текста во вводной части следует выделять с помощью элементов div или div1.
Разметка завершающей части текста
Структура завершающей части текста отличается от структуры вводной части наличием в ней (в конце завершающей части) элементов trailer и/или closer и определяется следующим объявлением:
<!ELEMENT back
(
(divGen | titlePage | anchor | gap | index
| interp | interpGrp | lb | milestone | pb)*,
(
(
(argument | byline | dateline | docAuthor | docDate
| epigraph | head | opener | salute | signed),
(argument | byline | dateline | docAuthor | docDate
| epigraph | head | opener | salute | signed
| titlePage | anchor | gap | index | interp
| interpGrp | lb | milestone | pb)*
)
|
(div,
(div | divGen | titlePage | anchor | gap | index
| interp | interpGrp | lb | milestone | pb)*
)
|
(div1,
(div1 | divGen | titlePage | anchor | gap | index
| interp | interpGrp | lb | milestone | pb)*
)
)?,
(trailer | closer)*
)
>
Элементы trailer и closer почти неотличимы друг от друга – они содержат, в основном, элементы фразовой разметки, closer может содержать три элемента, который не могут входить в trailer: знакомые нам salute и dateline, а также signed, который содержит заключительное приветствие и т. п., следующее за разделом текста.
Лекция 6. Структура основной части документа TEI
Основная часть текста (body), как уже говорилось выше, может содержать элементы нескольких классов:
w Блочная структура текста
w Закладки
w Выделения
w Цитаты
w Примечания
w Перекрёстные ссылки и связи
w Редакторская правка, пропуски, удаления и дополнения
w Имена, даты, числа, сокращения и адреса
w Списки
w Библиографические ссылки
w Таблицы
w Рисунки и графика
w Интерпретация и анализ
w Техническая документация
Некоторые из них используются для разметки блоков текста, другие – для разметки потоковых фрагментов текста. Не все они употребляются одинаково часто. Остановимся подробнее на некоторых часто используемых элементах.
Блочная структура текста
Полная DTD TEI имеет блочную организацию; в ней отдельные группы элементов, которые должны встречаться вместе, собраны в параметрические сущности, поэтому устройство этого DTD более или менее может быть понято (более или менее потому, что этим параметрическим сущностям даны, в отличие от DocBook, недостаточно мнемонические имена). DTD TEI Light, однако, вообще не использует параметрические сущности, что делает изучение этого DTD непростым занятием. Я соберу некоторые группы элементов TEI Light в классы, для обозначения каждого такого класса использую параметрическую сущность, которой дам своё имя.
Структура тела документа
Сначала я определю класс «маркирующих» элементов, предназначенных для отметки видимой или невидимой области в документе (эта область может вырождаться и точку, например, для элементов anchor и pb):
<!ENTITY % body. marks
"anchor | gap | index | interp | interpGrp | lb | milestone | pb"
>
Затем определяем класс элементов, которые могут входить как в заголовок, так и в завершающую часть тела (не путать с титульным листом и завершающей частью документа – TEI допускает дополнительный заголовок и завершающую часть для тела документа и даже для разделов):
<!ENTITY % body. framingElements
"byline | dateline | epigraph | salute | signed"
>
Теперь можно определить заголовок и завершающую часть тела (перечисление элементов, которые могут входить только в заголовок, и элементов, которые могут входить только в завершающую часть, я вынес в отдельные параметрические сущности). Вот структура заголовка:
<!ENTITY % body. header. elements
"( argument | docAuthor | docDate | head | opener | signed )"
>
<!ENTITY % body. header
"( %body. header. elements; | %body. marks; | %body. framingElements; )"
>
Завершающая часть в TEI Light определена несколько иным способом (явно выделена произвольная цепочка маркирующих элементов):
<!ENTITY % body. trailer. elements
"(closer | trailer | %body. framingElements; )"
>
<!ENTITY % body. trailer
"(%body. trailer. elements; , ( %body. marks; )*)"
>
Причины для такого различия в определениях заголовка и завершающей части мне непонятны – и заголовок, и завершающая часть, как мы вскоре увидим, могут встречаться в теле документа произвольное количество раз, так что можно было бы и унифицировать определения.
Теперь можно перейти к определению собственно (тела J) тела документа. Это тело тела может состоять непосредственно из размеченного текста (за которым может следовать некоторый набор разделов), либо только из некоторого набора разделов. Сначала соберём в отдельный класс элементы, которые могут быть использованы вне разделов (out of div – «внераздельная» разметка):
<!ENTITY % body. outOfDiv
"(eg | bibl | biblFull | ab | l | lg | p | sp | cit | q
| label | list | listBibl | note | stage)"
>
На уровне тела тела документа нельзя использовать произвольные разделы: это должны быть разделы уровней 0 (div0) или 1 (div1) или рекурсивные разделы (div), либо разделы, сгенерированные программно (текстовым процессором или иной программой – «автоматические разделы» divGen). Чтобы яснее выразить праворекурсивные правила, определяющие возможность использования вперемешку разделов одного и того же уровня и программно сгенерированных разделов (вместе с маркирующими элементами), определим «хвостовые» части цепочек, состоящих из одних и тех же разделов:
<!ENTITY % body. tail. R "(div | divGen | %body. marks;)" >
<!ENTITY % body. tail.0 "(div0 | divGen | %body. marks;)" >
<!ENTITY % body. tail.1 "(div1 | divGen | %body. marks;)" >
Теперь можно определить сами цепочки, состоящие из одних и тех же разделов:
<!ENTITY % body. R "(div, %body. tail. R;*)" >
<!ENTITY % body.0 "(div, %body. tail.0;*)" >
<!ENTITY % body.1 "(div, %body. tail.1;*)" >
«Ручная разметка» состоит из разделов одного и того же вида (уровней 0 или 1 или рекурсивных разделов):
<!ENTITY % body. Hand "( %body. R; | %body.0; | %body.1; )" >
Автоматическая разметка может перемежаться маркировочными элементами:
<!ENTITY % body. div. generated "(divGen, (%body. marks;)* )" >
В результате определение тела документа приобретает понятный вид: сначала в теле документа должны быть использованы элементы заголовка тела (в любом количестве; в том числе заголовок тела может и отсутствовать), затем идёт «тело тела», а затем – элементы завершающей части тела, которая также может отсутствовать:
<!ELEMENT body
(
%body. header;*,
(
(
( %body. outOfDiv; , ( %body. marks; )* )+ ,
%body. div. generated;*, %body. Hand;?
)
|
( %body. div. generated;*, %body. Hand;? )
),
%body. trailer*
)
>
Строение «тела тела» также теперь очевидно. Оно может быть образовано двумя способами:
1 (
2 ( %body. outOfDiv; , ( %body. marks; )* )+ ,
3 %body. div. generated;*, %body. Hand;?
4 )
5 |
6 ( %body. div. generated;*, %body. Hand;? )
В первом способе перед необязательными разделами следует некоторая часть текста, размеченная с использованием элементов класса body. outOfDiv (вперемешку с маркирующими элементами). Во втором – такая часть текста отсутствует.
Замечание
Наличие именно таких альтернатив в описании тела тела документа объясняется необходимостью допустить три варианта строения этой части элемента:
w Только внераздельная разметка (строка 2)
w Внераздельная разметка (строка 2), за которой следуют разделы (строка 3)
w Только разделы (строка 6)
Четвёртый вариант – отсутствие содержимого – невозможен из-за наличия скобок, окружающих «тело тела» (выделены полужирным шрифтом в объявлении body) – поскольку после скобок нет знаков ? или *, то что-нибудь из описанного внутри скобок содержимого должно присутствовать.
Если думать о DTD как о порождающей грамматике (это так в случае применения DTD в инструментах типа Altova Authentic), то объявление тела документа можно было бы ещё сократить:
<!ELEMENT body
(
%body. header;*,
(
( ( %body. outOfDiv; , ( %body. marks; )* )+ )? ,
%body. div. generated;*, %body. Hand;?
),
%body. trailer*
)
>
Однако, возможно, распознающая грамматика с таким правилом не является детерминированной – это нуждается в проверке.
На самом деле DTD TEI Light порождается из DTD TEI автоматически, поэтому подобные сокращения следует делать с осторожностью.
|
Из за большого объема этот материал размещен на нескольких страницах:
1 2 3 4 5 6 |


