<?xml version="1.0" encoding="windows-1251"?>
<!--
<!DOCTYPE article SYSTEM "docbookx.dtd">
-->
<article lang="ru">
<articleinfo>
<title>DocBook: системный подход к документации</title>
<authorgroup>
<author>
<firstname>Анатолий</firstname><surname>Белайчук</surname>
<email>bell@b-k.ru</email>
</author>
<author>
<firstname>Мария</firstname><surname>Николаева</surname>
<email>mmm@b-k.ru</email>
</author>
<author>
<firstname>Надежда</firstname><surname>Матвеева</surname>
<email>matveeva@b-k.ru</email>
</author>
<author>
<firstname>Станислав</firstname><surname>Фридкин</surname>
<email>stas@b-k.ru</email>
</author>
</authorgroup>
<copyright>
<year>2005</year>
<holder>
ООО Бизнес-Консоль, <ulink url="http://www.b-k.ru/">www.b-k.ru</ulink>
</holder>
</copyright>
</articleinfo>
<abstract>
<para>
Технология DocBook существует с 1991 года
и к сегодняшнему дню принята на вооружение многими лидерами ИТ-отрасли.
Достоинства этой основанной на XML технологии&#160;&#8212;
независимость от конкретного поставщика,
открытость для расширений, отделение контента от дизайна
и, не в последнюю очередь, свободно распространяемый инструментарий.
Особый интерес DocBook представляет для организаций,
стремящихся к систематическому документированию своей деятельности. 
</para>
</abstract>
<para>
Наблюдательный посетитель Internet может обнаружить в Сети
множество документов с однотипной навигацией между страницами
при помощи ссылок Prev, Next, Up, Top,
причем один и тот же документ может предлагаться в нескольких форматах:
каскадный HTML, единый HTML, PDF.
</para>
<figure>
<title>Документация Samba
(<ulink url="http://us4.samba.org/samba/docs/man/Samba-HOWTO-Collection/">www.samba.org</ulink>)
</title>
<graphic fileref="samba.gif"/>
</figure>
<para>
Возникает подозрение, что документы в разных форматах
генерируются автоматически из одного источника.
Из какого?
Чтобы это узнать, заглянем в код HTML:
</para>
<programlisting>
<![CDATA[
<html><head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
<title>The Official Samba-3 HOWTO and Reference Guide</title>
<meta name="generator" content="DocBook XSL Stylesheets V1.61.1"]]><co id="cf-samba-xsl" linkends="ct-samba-xsl"/><![CDATA[>
]]>
</programlisting>
<calloutlist>
<callout id="ct-samba-xsl" arearefs="cf-samba-xsl" >
<para>Свидетельство того, что HTML-страница сгенерирована XSL-скриптами DocBook.</para>
</callout>
</calloutlist>
<para>
Копнув еще глубже, обнаруживаем, что DocBook используют
многие авторитетные компании:
</para>
<itemizedlist>
<listitem><para>
Sun Microsystems
</para></listitem>
<listitem><para>
Hewlett-Packard
</para></listitem>
<listitem><para>
RedHat
</para></listitem>
<listitem><para>
O'Reilly &amp; Associates
</para></listitem>
<listitem><para>
<ulink url="http://w3.org/">World Wide Web Consortium</ulink> (W3C)
</para></listitem>
<listitem><para>
<ulink url="http://oasis-open.org/">OASIS</ulink>
</para></listitem>
</itemizedlist>
<para>
На DocBook написана документация на
Linux (<ulink url="http://www.tldp.org/LDP/intro-linux/html/index.html">www.tldp.org</ulink>),
FreeBSD (<ulink url="http://www.freebsd.org/doc/en_US.ISO8859-1/books/handbook/index.html">www.freebsd.org</ulink>),
Sun Solaris (<ulink url="http://docs.sun.com/app/docs/doc/806-7612/6jgfmsvpl?a=view">docs.sun.com</ulink>),
PHP (<ulink url="http://www.php.net/manual/ru/">www.php.net</ulink>).
</para>



<section id="start">
<title>Беглый взгляд</title>
<para>
Чем же так привлекательна эта технология?
В самом деле, ведь существует множество программ
для подготовки текстов (начиная с Microsoft Word),
настольных издательских систем (например Xerox Ventura Publisher, Adobe PageMaker)
и языков разметки (unix nroff/troff, TeX/LaTeX, тот же HTML).
Преимущества над всеми этими средствами DocBook унаследовал от XML:
</para>
<orderedlist>
<listitem><para>
простой HTML-подобный язык разметки
</para></listitem>
<listitem><para>
"идеологическая выдержанность"&#160;&#8212;
четкое разделение контента и верстки, чего нет в HTML
</para></listitem>
<listitem><para>
мощный набор стандартов и поддерживающих их инструментов,
позволяющих обрабатывать тексты: XSLT, XSL-FO, XPath
</para></listitem>
<listitem><para>
независимость от коммерческих производителей,
наличие свободно распространяемого инструментария
</para></listitem>
<listitem><para>
открытость к расширениям
</para></listitem>
</orderedlist>



<note>
<title>SGML и XML</title>
<para>
Первоначально DocBook разрабатывался
как приложение SGML (Standard Generalized Markup Language)
и обрабатывался при помощи DSSSL (Document-Style Semantics and Specification Language).
</para>
<para>
Но в дальнейшем DocBook стал эволюционировать в направлении XML,
а для обработки стал использоваться
XSLT (Extensible Stylesheet Language for Transformations).
И хотя SGML-версия DocBook продолжает использоваться в существующих проектах,
если вы собираетесь начать работать с DocBook,
то мы рекомендуем ориентироваться только на XML/XSLT-версию.
</para>
<para>
Разработка DSSSL и XSLT скриптов, предназначенных для работы с DocBook,
ведется в рамках Open Source проекта:
<ulink url="http://docbook.sourceforge.net/">docbook.sourceforge.net</ulink>.
</para>
</note>



<para>
XML в каком-то смысле является преемником HTML,
поэтому несколько слов о преимуществах и недостатках последнего.
</para>
<para>
Роль HTML как основного носителя информации в Internet невозможно переоценить.
Этот язык разметки оказался невероятно удачным
(именно "оказался", ведь никто, включая его автора,
и близко не представлял, каким успехом он будет пользоваться).
Язык оказался простым, удобным, выразительным и технологичным.
Миллионы людей получили возможность поделиться своими знаниями,
опубликовав их в виде HTML-страничек, и они этой возможностью воспользовались.
</para>
<para>
Но "вольность" HTML, соответствующая анархическому духу Internet,
в корпоративной среде становится недостатком:
HTML-документы плохо поддаются унификации.
Технически это связано с тем, что в HTML присутствуют как структурные тэги
(например <sgmltag>&lt;h1></sgmltag>, <sgmltag>&lt;p></sgmltag>,
<sgmltag>&lt;ul></sgmltag>, <sgmltag>&lt;kbd></sgmltag>),
так и оформительские (например <sgmltag>&lt;font></sgmltag>,
<sgmltag>&lt;u></sgmltag>, <sgmltag>&lt;b></sgmltag>).
В результате каждый автор волен "раскрасить" документ так как ему нравится,
что усложняет создание корпоративных библиотек.
(Сущий кошмар в этом смысле представляют документы, экспортированные в формат HTML из Word.)
Конечно, можно в приказном порядке обязать авторов пользоваться
только ограниченным наборов набором структурных тэгов,
но лучше, чтобы это ограничение срабатывало на уровне языка разметки,
а не на дисциплинарном.
</para>
<para>
Кроме того, HTML недостаточно четко формализован.
Конечно, есть официальные стандарты W3C, но в реальности
и браузеры, и Web-мастера широко используют нестандартные конструкции.
Это затрудняет автоматизированную обработку HTML-документов,
без которой нельзя обойтись, когда речь идет о корпоративной среде.
</para>
<para>
XML и DocBook&#160;&#8212; это <emphasis>достоинства HTML без его недостатков</emphasis>:
</para>
<orderedlist>
<listitem><para>
В DocBook присутствуют только структурные тэги.
Их много (около 400), но ходовых всего пара десятков:
<sgmltag>&lt;para></sgmltag> вместо <sgmltag>&lt;p></sgmltag>,
<sgmltag>&lt;emphasis></sgmltag> вместо <sgmltag>&lt;em></sgmltag>,
<sgmltag>&lt;chapter></sgmltag> вместо <sgmltag>&lt;h2></sgmltag>,
<sgmltag>&lt;listitem></sgmltag> вместо <sgmltag>&lt;li></sgmltag> и т.д.
</para></listitem>
<listitem><para>
Формат документа жестко выдерживается:
например, каждому открывающемуся тэгу <sgmltag>&lt;para></sgmltag>
обязан соответствовать закрывающий <sgmltag>&lt;/para></sgmltag>.
В противном случае ни одна программа такой документ обрабатывать не будет.
</para></listitem>
<listitem><para>
Имея на входе четко структурированный документ,
приспособленный к автоматизированной обработке,
получение выходного документа, оформленного в корпоративном стиле,
в формате HTML, PDF, WinHelp или другом, становится  делом техники.
При том что уже есть большая часть инструментария&#160;&#8212; стандартные XSL-процессоры.
</para></listitem>
</orderedlist>
<para>
Например, вот как выглядит исходный текст DocBook этой статьи
(<ulink url="index.xml">полный исходный текст</ulink>):
</para>
<programlisting>
<![CDATA[
<?xml version="1.0" encoding="windows-1251"?>
<article lang="ru">
<articleinfo>
  <title>DocBook: системный подход к документации</title>
  ...
</articleinfo>
<abstract>
  <para>
  Технология DocBook существует с 1991 года
  ...
  </para>
</abstract>
<section id="start">
  <title>Беглый взгляд</title>
  <para>
  Чем же так привлекательна эта технология и кому она может быть полезна?
  ...
  </para>
</section>
</article>
]]>
</programlisting>
<para>
Несложно и интуитивно понятно.
По крайней мере, для человека, когда-либо имевшего дело с HTML.
Обратите только внимание на следующее:
</para>
<orderedlist>
<listitem><para>
Документ должен начинаться с XML-декларации, как в приведенном примере
(кодировка, естественно, может быть другой, например koi8-r).
</para></listitem>
<listitem><para>
Все открытые тэги должны аккуратно, с соблюдением вложенности, закрываться.
</para></listitem>
<listitem><para>
Атрибуты внутри тэгов, даже числовые, должны ставиться в кавычках
(одинарных или двойных), как <sgmltag>lang="ru"</sgmltag> в приведенном примере.
</para></listitem>
<listitem><para>
Если в вашем тексте встречается символ <sgmltag>&lt;</sgmltag>,
то замените его на <sgmltag>&amp;lt;</sgmltag>,
а символ <sgmltag>&amp;</sgmltag> на <sgmltag>&amp;amp;</sgmltag>.
</para></listitem>
<listitem><para>
Остальные мнемоники HTML, в частности <sgmltag>&amp;nbsp;</sgmltag> (явный пробел)
XML по умолчанию не понимает.
Используйте числовой код, например <sgmltag>&amp;#160;</sgmltag>
вместо <sgmltag>&amp;nbsp;</sgmltag>.
</para></listitem>
</orderedlist>
<para>
Корневой тэг <sgmltag>&lt;article></sgmltag>, использованный в рассмотренном примере,
в DocBook предназначен для относительно небольших и самостоятельных статей.
Традиционному жанру технической литературы&#160;&#8212; "Руководству"&#160;&#8212;
соответствует тэг <sgmltag>&lt;book></sgmltag>,
а для многотомной библиотеке имеется <sgmltag>&lt;set></sgmltag>.
Для того, чтобы научиться оформлять нумерованные списки, таблицы, картинки и т.д.
вам понадобится <ulink url="http://docbook.org/tdg/en/html/">справочник по тэгам DocBook</ulink>.
</para>



<note>
<title>Стандарт DocBook</title>
<para>
Тэги DocBook стандартизованы на уровне спецификаций,
выпускаемых комитетом при консорциуме OASIS
(Organization for the Advancement of Structured Information Standards,
<ulink url="http://www.oasis-open.org/">www.oasis-open.org</ulink>),
в который  входят, в частности, представители Hewlett-Packard, IBM и Sun Microsystems.
Возглавляет его Норман Уолш (Norman Walsh)&#160;&#8212; человек,
который является автором большей части DocBook.
</para>
<para>
По состоянию на март 2005 года последней официальной версией спецификации
является версия 4.2, датированная июлем 2002г.
Номер последней рабочей версии&#160;&#8212; 4.4.
Эти версии существуют в виде XML и SGML.
В версии 5.0 планируется переход к единой схеме, совместимой как с SGML, так и с XML.
</para>
<para>
Материальное воплощение DocBook&#160;&#8212; это XML-схемы (DTD) и скрипты (DSSSL, XSLT).
Они распространяются свободно: их разрешается использовать с любыми целями,
модифицировать и тиражировать без ограничений и специального разрешения.
Единственное, что запрещается в соответствии с духом Open Source&#160;&#8212;
это ограничить других в свободном использовании и распространении
DocBook или его модификаций.
</para>
<para>
Стандартом в популярном изложении служит
<ulink url="http://docbook.org/tdg/en/html/">Definitive Guide</ulink> Нормана Уолша.
На том же сайте <ulink url="http://docbook.org">docbook.org</ulink> находится
<ulink url="http://docbook.org/tdg/simple/en/html/sdocbook.html">Simplified DocBook</ulink>,
в котором произведена селекция:
исходные примерно четыреста тэгов сведены к порядка ста наиболее употребительных
(скорее всего и это много больше, чем вам реально понадобится).
Для настройки XSLT-инструментария и параметров, влияющих на вид выходных документов,
вам понадобится руководство <ulink url="http://www.sagehill.net/docbookxsl">DocBook XSL: The Complete Guide</ulink>
и справочник <ulink url="http://docbook.sourceforge.net/release/xsl/current/doc/reference.html">DocBook XSL Stylesheet Reference Documentation</ulink>.
</para>
</note>
</section>



<section id="tools">
<title>Инструментарий</title>
<para>
DocBook уже достиг той степени зрелости, что им можно начать пользоваться,
не тратя ни денег на покупку ПО, ни времени на его настройку.
По крайней мере, если на первых порах вы согласны ограничиться HTML
в качестве формата выходных документов.
Причем это относится и к документам на русском языке.
</para>
<para>
Для работы с DocBook вам понадобятся:
</para>
<orderedlist>
<listitem><para>
редактор для набивки исходного текста
</para></listitem>
<listitem><para>
конверторы для преобразования исходного текста в выходные форматы
</para></listitem>
</orderedlist>
<para>
Для ввода исходного текста подойдет обычный текстовой редактор.
Если он умеет работать с XML&#160;&#8212; отлично: это обеспечит вам дополнительный сервис,
например он будет "на лету" обнаруживать ошибки разметки.
Максимум комфорта даст специализированный XML-инструментарий.
Например, в меню продукта Altova Authentic слово DocBook присутствует в явном виде.
К тому же, Desktop Edition этого продукта является бесплатным.
Проблема только в том, что вам врядли удастся найти русифицированный XML-редактор.
И поэтому для пользователей, не владеющих английским, обычный текстовой редактор,
но с русским интерфейсом, скорее всего окажется удобнее.
</para>
<para>
Сохраните текст в файле с расширением <filename class="extension">.xml</filename>.
Если ваш редактор не проверяет корректность XML-документа,
то самый простой способ проверить&#160;&#8212;
<ulink url="index.xml">открыть его</ulink> при помощи Internet Explorer.
Если все в порядке, IE отобразит ваш документ в виде структурного дерева,
в котором можно сворачивать и разворачивать отдельные ветки,
соответствующие разделам документа.
</para>
<para>
Конверторы&#160;&#8212; это, в первую очередь, XSLT-процессор и скрипты.
И то, и другое вы получите в составе дистрибутива
практически любой более-менее современной версии Linux.
Скрипты постоянно развиваются:
например, в версии 1.68 исправлены огрехи в предметном указателе на русском языке,
поэтому их стоит сразу обновить,
<ulink url="http://docbook.sourceforge.net/projects/xsl/">загрузив последнюю версию</ulink>
и развернув архив на сервере.
</para>
<para>
XSLT-процессор для Windows можно скачать, например,
по ссылке <quote>Windows binaries</quote>
с сайта <ulink url="http://xmlsoft.org/">xmlsoft.org</ulink>,
а XSL-скрипты от платформы не зависят.
</para>
<para>
На unix преобразование исходного документа в формат HTML выполняется следующей командой:
</para>
<programlisting>
$ xsltproc<co id="cf-run-proc" linkends="ct-run-proc"/> /usr/docbook/xsl-stylesheets/html/chunk.xsl<co id="cf-run-script" linkends="ct-run-script"/> article.xml<co id="cf-run-src" linkends="ct-run-src"/>
</programlisting>
<para>
где
</para>
<calloutlist>
<callout id="ct-run-proc" arearefs="cf-run-proc" >
<para>вызываемая программа, XSLT-процессор (один из нескольких возможных)</para>
</callout>
<callout id="ct-run-script" arearefs="cf-run-script" >
<para>директория на вашем сервере, куда вы положили XSLT-скрипты,
и вариант генерации выходного документа, конкретно в виде каскадного HTML</para>
</callout>
<callout id="ct-run-src" arearefs="cf-run-src" >
<para>исходный документ DocBook</para>
</callout>
</calloutlist>
<para>
Готово!
В текущем каталоге должны появится HTML-файлы,
по одному на раздел статьи и один на общее оглавление.
</para>
</section>



<section id="tuning">
<title>Настройка</title>
<para>
Первый, самый простой уровень настройки&#160;&#8212; это выбор стартового скрипта.
</para>
<para>
В приведенном ранее примере таковым является <filename>html/chunk.xsl</filename>.
Он наиболее употребительный, но не единственный.
Другие варианты:
</para>
<itemizedlist>
<listitem><para>
<filename>html/docbook.xsl</filename>&#160;&#8212; устаревший вариант,
<filename>html/chunk.xsl</filename> его заменяет
</para></listitem>
<listitem><para>
<filename>html/onechunk.xsl</filename>&#160;&#8212; генерация единого HTML для всего документа
</para></listitem>
<listitem><para>
<filename>htmlhelp/htmlhelp.xsl</filename>&#160;&#8212; генерация HTML Help
</para></listitem>
<listitem><para>
<filename>manpages/docbook.xsl</filename>&#160;&#8212; генерация man pages
(формат традиционной документации в unix/linux)
</para></listitem>
<listitem><para>
<filename>fo/docbook.xsl</filename>&#160;&#8212; генерация XSL-FO
для последующего преобразования в PDF и другие ориентированные на печать форматы
</para></listitem>
</itemizedlist>
<para>
Более широкие возможности для управления внешним видом выходного документа предоставляют
параметры, которых только для chunk.xsl насчитывается более 200.
Пример: заставим выделять в отдельный файл первый раздел документации
и зададим кодировку выходного документа windows-1251 вместо UTF-8, принятой по умолчанию:
</para>
<programlisting>
$ xsltproc --param chunk.first.sections 1 \
> --stringparam chunker.output.encoding windows-1251 \
> /usr/docbook/xsl-stylesheets/html/chunk.xsl article.xml
</programlisting>
<para>
Для реальной работы захочется задать как минимум десяток параметров,
однако делать это через командную строку неудобно.
Значит, пора создать так называемый "XSL драйвер".
Создайте в текущей директории файл с именем <filename>mydocbook.xsl</filename> и следующим содержимым:
</para>
<programlisting>
<![CDATA[
<?xml version="1.0"?>
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:import href="/usr/docbook/xsl-stylesheets/html/chunk.xsl"/>
<xsl:param name="chunk.first.sections" select="1"/>
<xsl:param name="chunker.output.encoding" select="'windows-1251'"/>
</xsl:stylesheet>
]]>
</programlisting>
<para>
Подайте его на вход XSLT процессору:
</para>
<programlisting>
$ xsltproc mydocbook.xsl article.xml
</programlisting>
<para>
Теперь вы вольны экспериментировать: задавать файл стилей CSS,
управлять автоматической нумерацией, размещением оглавлений и многим другим.
Все вопросы применения и настройки XSLT великолепно изложены в книге
<ulink url="http://www.sagehill.net/docbookxsl">DocBook XSL: The Complete Guide</ulink>,
а актуальный перечень параметров содержится в справочнике
<ulink url="http://docbook.sourceforge.net/release/xsl/current/doc/reference.html">DocBook XSL Stylesheet Reference Documentation</ulink>.
</para>
<para>
В результате манипуляций с параметрами вы добьетесь того,
что сгенерированные HTML-страницы будут полностью удовлетворять
вашим представлениям об эстетике и эргономике
или просто соответствовать принятому корпоративному стилю:
</para>
<figure>
<title>Фрагмент документации Бизнес-Консоль</title>
<graphic fileref="real.gif"/>
</figure>
<para>
Максимальной гибкости в использовании XSL-скриптов можно достичь,
если подменять не только значения параметров,
но и код, используемый для обработки тех или иных тэгов.
Например, если вас не устраивает то, как отрабатывается тот или иной шаблон,
вы просто копируете его из файла в каталоге <filename>/usr/docbook/xsl-stylesheets</filename>
в свой драйвер и правите его так, как считаете нужным.
Шаблоны, которые вы напишете, перекроют импортируемые.
</para>
<para>
Похожим способом можно не только менять обработку существующих тэгов,
но и вводить свои собственные.
Искушенный читатель мог заметить, что в примере исходного файла
мы опустили DTD-декларацию, т.е. не связали наш документ с XML-схемой DocBook.
Это было сделано не случайно. 
</para>
<para>
Прежде всего заметим, что XSLT процессор указания DTD не требует.
Естественно, при этом возможна ситуация,
когда ваш документ будет правильным XML, но не будет соответствовать схеме DocBook.
Например, в нем будут придуманные вами тэги.
XSL-скрипты в такой ситуации ведут себя очень разумно:
содержащийся внутри таких тэгов текст попадет в выходной документ,
при этом он будет выделен красным цветом.
Теперь вам осталось написать свой обработчик (<command>xsl:template</command>)
для изобретенного вами тэга и вставить его в драйвер <filename>mydocbook.xsl</filename>.
(Еще лучше&#160;&#8212; поместить обработчик в отдельный файл
и включить его в драйвер командой <command>xsl:import</command>.)
</para>
<para>
Вот в такой свободе и раскрывается преимущество открытых технологий
над закрытыми коммерческими решениями.
</para>
</section>



<section id="convertor">
<title>Выходные форматы</title>
<para>
Преобразование из DocBook в HTML в стандартных XSL-скриптах
отработано практически идеально.
</para>
<para>
Нет проблем также с генерацией в Windows HTML Help.
Скрипт <filename>htmlhelp/htmlhelp.xsl</filename> создает набор файлов HTML
и необходимые служебные файлы.
После этого запускаете help-компилятор <filename>hhc.exe</filename>,
который компания Microsoft распространяет свободно, и получаете HTML Help.
</para>
<para>
Но в том, что касается генерации PDF, проблемы, увы, есть.
И если для документов на английском языке получить выходной документ
приемлемого качества довольно просто, то добиться того же
для документа на русском&#160;&#8212; занятие не для слабонервных.
</para>
<para>
Сначала немного теории.
PDF из DocBook получают в два этапа:
сначала DocBook преобразуют в промежуточный формат&#160;&#8212;
такой, для которого уже есть готовая программа преобразования в PDF.
Таких промежуточных форматов два: XSL-FO и TeX.
Стандартные xsl-скрипты поддерживают преобразование в XSL-FO,
но дальше начинаются проблемы.
</para>
<para>
Хорошо известны два свободно распространяемых транслятора из XSL-FO в PDF:
PassiveTeX и Apache FOP (<ulink url="http://xml.apache.org/fop/">xml.apache.org/fop</ulink>).
Первый никогда не рассматривался его автором в качестве серьезного продукта,
второй выглядит посолиднее, все-таки Apache Foundation&#160;&#8212; это марка.
Но увы, последняя версия FOP 0.20.5 была выпущена еще в июле 2003г.
После этого разработчиками было заявлено о намерении выпустить версию 1.0,
полностью переписав код, но по состоянию на начало 2005г.
<quote>никаких прогнозов по поводу сроков дать невозможно</quote>.
</para>
<para>
Из коммерческих FOP-процессоров, пожалуй, лучшим на сегодняшний день
является продукт XEP от компании RenderX ценой около 300 долл.
Это зрелый продукт и проблем с русским языком у него нет,
благо вся команда разработчиков русскоязычная.
К сожалению, "из коробки" кириллические шрифты в нем не работают
и нет инструкции, которая толково объясняла бы как их включить.
Но разобраться можно, и после того как кириллические шрифты подключены,
все работает гладко.
Работают даже переносы для русского текста.
</para>
<para>
Вторая альтернатива&#160;&#8212; промежуточное преобразование в LaTeX.
Стандартные XSL-скрипты его не поддерживают, но есть, например, db2latex&#160;&#8212;
также пакет XSL-скриптов, который можно заставить делать то, что нужно.
"Из коробки" он с русскими буквами тоже не работает&#160;&#8212;
как минимум, в XSLT-драйвере надо прописать следующее:
</para>
<programlisting>
<![CDATA[
<xsl:output method="text" encoding="UTF-8" indent="yes"/>
<xsl:param name="latex.inputenc">utf8</xsl:param>
<xsl:param name="latex.document.font">pscyr</xsl:param>
]]>
</programlisting>
<para>
Сгенерированный документ в формате LaTeX можно преобразовать в PDF командой pdflatex,
также штатно имеющейся в Linux.
После этого русский текст появляется, но до удовлетворительного результата еще далеко:
остаются огрехи в графике, в выравнивании текста, в закладках PDF и т.п.
Нас пакет db2latex не устроил еще и тем, что в нем не поддерживается атрибут
<sgmltag>morerows</sgmltag>, т.е. в таблицах невозможно объединять ячейки по вертикали.
К тому же стало ясно, что для доведения этого варианта до ума
не обойтись без глубокого изучения TeX/LaTeX, а это в наши планы не входило.
</para>
<para>
Не в последнюю очередь источником проблем PDF является компания Adobe.
Трудности с поддержкой русского языка возникают чуть ли не во всех ее продуктах:
и в Photoshop, и во FrameMaker, и в Acrobat.
(Видимо среди программистов в Adobe не оказалось выходцев из бывшего СССР.)
Вот что официально пишет компания по поводу Adobe Acrobat версии 6:
<quote>при создании PDF из HTML файлов текст, набранный кириллическими шрифтами,
заменяется неправильными символами или пустотами</quote>.
Иными словами, <quote>не работает&#160;&#8212; и не должно!</quote>
</para>
<para>
Самый простой и надежно работающий вариант генерации PDF на русском&#160;&#8212;
это Adobe Acrobat Distiller.
Немаловажно то, что он включает шрифты в создаваемый документ,
что гарантирует его прочтение на любом компьютере,
а не только на том, что оснащен русской версией Windows.
Поступаем следующим образом:
штатными средствами (<filename>onechunk.xsl</filename>) создаем единый HTML;
настраиваем CSS так, чтобы документ хорошо смотрелся в печатном варианте;
отправляем его в Acrobat Distiller и получаем на выходе PDF.
</para>
<para>
Недостатки этого варианта: в результирующем PDF нет ссылок и закладок,
т.е. это не гипертекстовый документ, а предназначенный в основном для печати;
в оглавлении нет номеров страниц.
Преимуществом же является то, что при помощи CSS можно точно подобрать шрифты,
отступы, отбивки, расположение картинок и тем самым добиться
индивидуального дизайна ваших документов.
На пути XSL-FO этой цели добиться сложнее&#160;&#8212;
потребуется глубокая адаптация XSL-скриптов.
</para>



<note>
<title>DocBook Website</title>
<para>
Еще одно применение DocBook&#160;&#8212; создание интернет-сайтов.
Идея заключается в следующем: пользуясь тэгами DocBook,
вы создаете по одному XML-файлу на каждую страницу сайта
(корневой тэг <sgmltag>&lt;website></sgmltag>)
плюс один XML-файл, содержащий оглавление.
Затем обрабатываете эти файлы при помощи XSL-скриптов
(<ulink url="http://docbook.sourceforge.net/release/website/">docbook.sourceforge.net/release/website</ulink>)
и получаете на выходе набор HTML-страниц, составляющих вебсайт.
</para>
<para>
В ходе генерации к каждой странице автоматически подверстывается
панель с иерархическим оглавлением сайта, пункты которого можно сворачивать-разворачивать.
Также автоматически в оглавлении выделяются новые/измененные страницы.
Примечательно, что ссылки между страницами сайта делаются
не при помощи привычных <sgmltag>&lt;a href=…></sgmltag>,
а при помощи тэга docbook <sgmltag>&lt;olink></sgmltag>.
Это гарантирует, что все внутренние ссылки на результирующем сайте будут корректными.
</para>
<para>
Основное достоинство этой технологии, как и DocBook в целом,&#8212;
последовательное отделение контента от дизайна.
Скажем, сайты <ulink url="http://www.docbook.org/">www.docbook.org</ulink>,
<ulink url="http://www.docbook.ru/">www.docbook.ru</ulink>,
сделанные по этой технологии, выглядят по-академически строго.
Но, воспользовавшись стандартными приемами кастомизации DocBook,
вы сможете радикально менять дизайн и верстку своего сайта,
абсолютно не затрагивая при этом его контент.
</para>
</note>
</section>



<section id="writer">
<title>Для технического писателя</title>
<para>
Какими достоинствами обладает DocBook с точки зрения человека,
профессионально занимающегося подготовкой технических текстов?
</para>
<para>
Традиционно под документацией в первую очередь понимался напечатанный документ или книга.
Но сегодня документация в большинстве случаев требуется и в печатном, и в электронном виде.
Если у вас уже есть документ, сверстанный для печати, то самый простой (и универсальный)
способ сделать его электронный вариант&#160;&#8212; воспользоваться Adobe Acrobat Distiller.
Вы получите PDF, который можно записать на CD или выложить на сайт.
</para>
<para>
Однако PDF&#160;&#8212; это эрзац, не родной для Internet формат.
Ваши документы не станут органической частью сайта
и будут раздражать пользователя длительной загрузкой.
К ним не удастся привязать стандартное оформление сайта (шапки, панели, сервисы),
в них затруднено использование ссылок и поиск средствами сайта.
</para>
<para>
Еще одно дешевое решение&#160;&#8212; выполнить экспорт в HTML, например, из Microsoft Word.
С точки зрения интеграции с Internet-сайтом этот вариант ненамного лучше PDF&#160;&#8212;
такие документы также будут выбиваться из общего стиля сайта.
Формально это, конечно, будет HTML, но по существу&#160;&#8212; нет,
ведь даже сменить шрифт или увеличить размер символов при просмотре в браузере
пользователь не сможет, поскольку все жестко прописано в сгенерированном HTML-коде.
</para>
<para>
Концептуально подход DocBook к выпуску документации в нескольких форматах
является наиболее грамотным: исходный текст, абсолютно не привязанный к выходному формату,
и управляемые параметрами программы генерации выходных документов.
Задача генерации HTML-документов решена на отлично,
с PDF потребуется больше усилий, но и эта задача решается.
</para>
<para>
Кроме того, техническому писателю необходим сервис:
автоматическая нумерация разделов, таблиц, рисунков,
автоматическое формирование оглавления, перечня рисунков, алфавитного указателя.
Со всеми этими задачами DocBook прекрасно справляется.
</para>
</section>



<section id="team">
<title>Для коллективной работы</title>
<para>
Но по-настоящему преимущества DocBook раскрываются в коллективной работе.
Представим себе, что над документацией работает команда, включающая:
</para>
<orderedlist>
<listitem><para>
авторов, разбирающихся в сути той или иной области и поставляющих контент
</para></listitem>
<listitem><para>
редактора или литературного обработчика,
который принимает фрагменты будущей документации у авторов,
выправляет текст и собирает его в единое целое
</para></listitem>
<listitem><para>
дизайнера, отвечающего за верстку и художественное оформление документа
</para></listitem>
</orderedlist>
<para>
В такой ситуации остро встает проблема разделения контента и дизайна.
Если авторы работают с Word, то их документы содержат и контент (собственно текст),
и дизайн (шрифты, оформление абзацев, страниц и т.д.).
Поэтому дальше идет трудоемкая ручная работа:
редактор собирает фрагменты и приводит верстку
в соответствие со стилем, заданным дизайнером
(теоретически в этом могли бы помочь собственный механизм стилей Word,
но на практике он работает не очень хорошо.)
</para>
<para>
Еще хуже становится дело, когда автору необходимо внести правку в свой фрагмент.
Предположим, что программисты доработали продукт, и в документацию надо добавить
описание нового параметра.
Позволять авторам работать напрямую с выходным документом нельзя&#160;&#8212;
возникнет конфликт совместного доступа.
Значит, автор внесет правку в копию, и после этого, опять-таки вручную,
редактор должен будет интегрировать ее в главный документ.
Накладные расходы становятся непропорционально большими:
даже если надо исправить небольшой фрагмент текста,
приходится привлекать редактора, который должен выполнить ответственную операцию.
В результате общая производительность труда оставляет желать лучшего.
</para>
<para>
Как в этой же ситуации строится работа через DocBook:
</para>
<orderedlist>
<listitem><para>
редактор намечает структуру будущего документа:
делит его на главы или более мелкие разделы
</para></listitem>
<listitem><para>
для каждого раздела редактор создает отдельный файл DocBook,
содержащий только название раздела
</para></listitem>
<listitem><para>
редактор раздает файлы авторам для работы над контентом
</para></listitem>
<listitem><para>
дизайнер разрабатывает файл CSS, определяя в нем стили
для оформления регулярного текста, заголовков, ссылок, таблиц, рисунков и т.д.
</para></listitem>
<listitem><para>
редактор создает головной файл документа, содержащий ссылки на разделы
</para></listitem>
<listitem><para>
выходной документ создается из набранных фрагментов автоматически
</para></listitem>
</orderedlist>
<para>
Вот как при этом будет выглядеть начальный файл первого раздела <filename>start.xml</filename>,
который получает автор для работы:
</para>
<programlisting>
<![CDATA[
<?xml version="1.0" encoding="windows-1251"?>
<section id="start">
<title>Беглый взгляд</title>
</section>
]]>
</programlisting>
<para id="sgml-entity">
А вот как будет выглядеть головной файл:
</para>
<programlisting>
<![CDATA[
<?xml version="1.0" encoding="windows-1251"?>
<!DOCTYPE set PUBLIC "-//OASIS//DTD DocBook XML V4.2//EN"
"/usr/docbook/xml-dtd/docbookx.dtd"]]><co id="cf-dtd-system" linkends="ct-dtd-system"/><![CDATA[ [
<!ENTITY start SYSTEM "start.xml">]]><co id="cf-dtd-declare" linkends="ct-dtd-declare"/><![CDATA[
<!ENTITY tools SYSTEM "tools.xml">
...
]>
<article lang="ru">
<articleinfo>
  <title>DocBook: системный подход к документации</title>
  ...
</articleinfo>
<abstract>
  <para>
  Технология DocBook существует с 1991 года
  ...
  </para>
</abstract>
&start;]]><co id="cf-dtd-call" linkends="ct-dtd-call"/><![CDATA[
&tools;
...
</article>
]]>
</programlisting>
<calloutlist>
<callout id="ct-dtd-system" arearefs="cf-dtd-system">
<para>
Местоположение файла SGML-схемы (DocBook DTD) на сервере.
</para>
</callout>
<callout id="ct-dtd-declare" arearefs="cf-dtd-declare">
<para>
В SGML-декларации определяются составные части документа.
</para>
</callout>
<callout id="ct-dtd-call" arearefs="cf-dtd-call">
<para>
Составные части вставляются в документ.
</para>
</callout>
</calloutlist>
<para>
Авторам не обязательно ждать пока соберется общий документ,
они вполне могут запускать DocBook на своем фрагменте и смотреть,
как он будет выглядеть в отформатированном виде.
После такой предварительной отладки редактор может быть уверен,
что получил от автора синтаксически правильный документ DocBook.
</para>
<para>
Поскольку весь документ разбит на составные части,
которые к тому же являются текстовыми файлами,
такая организация работы великолепно ложится на систему контроля версий
(например RCS или CVS).
</para>
<para>
Снова вернемся к ситуации, когда в документ надо внести небольшую правку.
Последовательность действий при работе с DocBook:
</para>
<orderedlist>
<listitem><para>
Автор достает из системы контроля версий нужный фрагмент документа,
правит его, автономно просматривает и помещает исправленный вариант
обратно в систему контроля версий.
</para></listitem>
<listitem><para>
Редактор просматривает новый текст, при необходимости корректирует.
Но, в отличие от работы с Word, его заботит только контент.
</para></listitem>
<listitem><para>
Автоматически генерируется выходной документ.
</para></listitem>
</orderedlist>
<para>
Очень технологично, минимум накладных расходов.
Одновременно, не мешая друг другу, над документом может работать большая команда.
</para>
</section>



<section id="structure">
<title>Контент, дизайн и структура</title>
<para>
Единственное, что нас не устроило в работе с DocBook&#160;&#8212; это "хвосты" SGML,
которые появились <link linkend="sgml-entity">в головном файле</link>
для организации ссылок на разделы документа.
Во-первых, неправильно, что каждый файл должен быть упомянут дважды
(один раз в определении, второй в размещении)&#160;&#8212;
там, где дублирование, появляются ошибки.
</para>
<para>
Во вторых, это неадекватный способ для работы со сложными структурами.
В рассмотренном примере всего два фрагмента,
реальные же документы на программные продукты, например,
нашей компании состоят из примерно трехсот
при глубине вложенности разделов равной четырем.
Возникает естественное желание сделать структуру более наглядной.
А как наиболее наглядно можно отразить иерархическую структуру,
каковой является документ DocBook?
Очевидно, иерархией каталогов.
</para>
<para>
Поэтому мы реализовали следующую схему работы с разветвленными документами DocBook:
под раздел любого уровня создается отдельный каталог.
Контент раздела помещается в XML-файл, лежащий в этом каталоге,
а для вложенных подразделов создаются свои подкаталоги.
Сборка фрагментов осуществляется автоматически несложной программой,
написанной на unix shell и XSLT.
Правильный порядок следования разделов достигается при помощи нестандартного атрибута
<sgmltag>nr</sgmltag> в тэгах <sgmltag>&lt;section></sgmltag>.
SGML-декларации становятся ненужными.
</para>
<para>
Последнее представляется важным с точки зрения не столько технологической
(в конце концов, с дублированием имен разделов можно было бы справиться),
сколько концептуальной.
Если необходимость разделения контента и дизайна&#160;&#8212; это более-менее общее место,
то мы пошли дальше и добились разделения контента, дизайна и структуры.
</para>
<para>
Что это означает на практике?
Абстрагирование вышележащих разделов от нижележащих
и возможность легкого изменения структуры.
Раздел верхнего уровня "не знает", какие подразделы
окажутся в нем в результате эволюции документа: какие подкаталоги будут, те и включатся.
А если у редактора возникла идея перенести какой-то подраздел
из одной части документа в другую, переместить его выше или ниже по иерархии,
то это делается максимально просто: с помощью проводника Windows.
</para>
<para>
Небольшое замечание: в DocBook для маркировки разделов
имеются тэги с жестким позиционированием в иерархии:
<sgmltag>&lt;sect1></sgmltag>, <sgmltag>&lt;sect2></sgmltag>&#160;&#8212;
разделы соответственно первого и второго уровня&#160;&#8212;
и рекурсивный тэг <sgmltag>&lt;section></sgmltag>.
Для того, чтобы можно было манипулировать структурой описанным выше способом,
мы используем только <sgmltag>&lt;section></sgmltag>.
</para>
</section>



<section id="company">
<title>Тотальное документирование</title>
<para>
Стоит ли вашей компании внедрять DocBook?
Если речь идет об автоматизации труда одного человека&#160;&#8212; технического писателя,
то, пожалуй, нет: проще продолжать работать по-старинке.
</para>
<para>
Но если компания или организация стремится к прозрачности своих бизнес-процессов,
то написание документации становится уделом многих.
В основе современных методов контроля качества лежит максима
<quote>напиши, что делаешь, делай как написал</quote>.
Это означает, что значительная часть персонала,
вплоть до менеджеров нижнего звена и даже рядовых исполнителей,
участвует в документировании процессов управления.
К тому же, документирование бизнес-процессов&#160;&#8212;
это не то, что можно один раз поручить внешним консультантам
и после этого навсегда зафиксировать.
Бизнес-процессы постоянно меняются, что должно отражаться в документации.
То есть, мы приходим к уже <link linkend="team">описанной ситуации</link>
<quote>много авторов&#160;&#8212; один редактор</quote>.
</para>
<para>
Эта же ситуация характерна для ИТ- и консалтинговых компаний,
главный актив которых&#160;&#8212; знания.
Где они хранятся, как накапливаются?
Худший вариант&#160;&#8212; в головах сотрудниках,
самый распространенный&#160;&#8212; в файлах Word на персональных компьютерах.
</para>
<para>
Идеальный&#160;&#8212; в виде текстов, подготовленных в едином стандарте
и помещенных в общее хранилище.
Именно этого позволяет добиться DocBook.
</para>
<para>
Сложно ли внедрить DocBook?
По опыту нашей компании,
вовлечь в работу широкий круг исполнителей можно достаточно быстро.
</para>
<para>
Последовательность внедрения:
</para>
<orderedlist>
<listitem><para>
Подготовьте небольшой документ DocBook, относящийся к вашей предметной области,
и раздайте его авторам (или опубликуйте на внутреннем сайте) в качестве образца.
Для ввода текста на первых порах можно обойтись обычными текстовыми редакторами.
</para></listitem>
<listitem><para>
Определите местоположение документов и порядок совместной работы.
Если у вас нет системы контроля версий, начните просто с сетевого диска.
</para></listitem>
<listitem><para>
Проинсталлируйте инструментарий XSLT и настройте его так,
чтобы получать на выходе документы, оформленные в корпоративном стиле
и готовые к публикации на внешнем или внутреннем сайте.
Или же подготовленные в соответствии с требованиями заказчика,
например с рамками в стиле ГОСТ.
</para></listitem>
</orderedlist>
</section>



<section id="strategy">
<title>XML-стратегия</title>
<para>
DocBook основан на технологиях XML и, в частности, XSLT.
Надо ли бояться, если эти технологии для вас внове?
По нашему мнению, XML заслуживает того, чтобы каждой ИТ-компании
сформировать по отношению к нему собственную стратегию использования.
XML&#160;&#8212; это не дань моде, хотя и не палочка-выручалочка.
Это эффективное решение для широкого круга задач,
которые до сих пор плохо поддавались автоматизации.
</para>
<para>
Компьютеры давно уже приспособили к хранению и обработке,
с одной стороны,&#8212; жестко структурированных и объемных данных,
а с другой&#160;&#8212; слабоструктурированной информации,
такой как текстовые документы.
Сила же XML заключается в том, что он позволяет эффективно организовывать
и обрабатывать (при помощи XSLT) квазиструктурированную информацию,
лежащую <emphasis>между</emphasis> этими полюсами.
Примеры такой полуструктурированной информации в деятельности IT-компании:
</para>
<itemizedlist>
<listitem><para>
спецификации и API
</para></listitem>
<listitem><para>
требования заказчика и сценарии использования (use cases)
</para></listitem>
<listitem><para>
тестовые данные и сценарии
</para></listitem>
<listitem><para>
часто задаваемые вопросы
</para></listitem>
<listitem><para>
учебные курсы с лекциями, примерами и тестами
</para></listitem>
</itemizedlist>
<para>
Для такой информации характерна коллекция объектов
с одинаковой структурой верхнего уровня и текстовыми описаниями на нижних уровнях.
В отличие от представления такой информации в виде текста,
XML позволяет отразить ее структуру.
С другой стороны, по сравнению с базами данных XML
обладает гораздо большей гибкостью, при том что объемы информации здесь невелики
и мощь СУБД не требуется.
</para>
<para>
Существует множество примеров успешного использования DocBook в подобных задачах.
Например, учебная лекция может быть представлена в виде одного XML-файла,
из которого автоматически формируются
</para>
<orderedlist>
<listitem><para>
слайды для лекции
</para></listitem>
<listitem><para>
раздаточные материалы
</para></listitem>
<listitem><para>
тестовые данные для лабораторной работы
</para></listitem>
<listitem><para>
экзаменационные задачи, вопросы и тесты
</para></listitem>
</orderedlist>
<para>
DocBook умеет формировать выходные документы не только в различных форматах,
но и с различным содержанием&#160;&#8212; например, в зависимости от читателя
(лектор/студент, заказчик/исполнитель).
В DocBook такая возможность называется <command>profiling</command>,
и в приведенном примере с учебной лекцией она оказывается очень кстати.
</para>
<para>
Таким образом, для технологически продвинутых компаний DocBook
станет органическим дополнением уже используемых XML-приложений, а для остальных&#160;&#8212;
технологическим заделом, который будет способствовать внедрению XML.
</para>
</section>
</article>

