Написание документации, часть II: LaTeX плюс latex2html
 
Автор: (C) Кристоф Шпиль [Christoph Spiel]
Перевод: (C) Сергей Скороходов


LaTeX

Позвольте мне сначало рассказать, что такое LaTeX и с какими целями он создавался. LaTeX -- это огромный пакет дополнительных макросов для системы предпечатной типографской подготовки TeX, созданной профессором Доналдом Кнутом. Если не слишком придираться, то говоря "система LaTeX" или просто "LaTeX", мы будем иметь в виду "TeX плюс все макросы LaTeX". Собственно LaTeX был написан Лесли Лэмпортом [Laslie Lamport], который решил, что хотя TeX и очень могуч, но его слишком сложно использовать для повседневных задач. За основу он взял систему Scribe. Scribe делает упор на логическую структуру документа вместо физической разметки (для тех читателей, которые хорошо разбираются в HTML добавлю, что тэг <em> является примером логической разметки, а тэг  <i> -- соответствующей ей физической разметки).

LaTeX -- как и классический plain TeX -- позволяет на обычном компьютере создавать, готовить для печати и распечатывать документы с полиграфическим качеством оформления. Замысел был таков: автор готовит статьи или даже книги на своем личном компьютере, а затем относит дискету в полиграфический салон для того, чтобы документ был распечатан на фотонаборной машине высокого разрешения, и, наконец, получает переплетенную книгу (... затем рассылает ее во все книжные магазины квадранта альфа, делает на этом миллионы, а через два года получает Межгалактическую Пулицеровскую премию. -- ну хорошо, я несколько преувеличиваю:).

В последующих раздела я изложу очень короткое введение в LaTeX, но всем, кто хочет изучить LaTeX, я бы рекомендовал Не столь краткое введение в LaTeX [Not So Short Introduction to LaTeX]. Этот 95-страничный документ можно бесплатно скачать из Сети: смотрите в Дополнительные источники.

LaTeX устанавливается вместес большинс твом современных Linux-дистрибутивов. Проверить правильность его установки можно с помощью команды:

    latex --version

Моя система отзывается на нее так:

    TeX (Web2C 7.3.1) 3.14159
    kpathsea version 3.3.1
    Copyright (C) 1999 D.E. Knuth.
    Kpathsea is copyright (C) 1999 Free Software Foundation, Inc.
    There is NO warranty.  Redistribution of this software is
    covered by the terms of both the TeX copyright and
    the GNU General Public License.
    For more information about these matters, see the files
    named COPYING and the TeX source.
    Primary author of TeX: D.E. Knuth.
    Kpathsea written by Karl Berry and others.

Общая структура документа

Вот пример очень короткого, но, тем не менее, полноценного документа LaTeX:

    \documentclass{article}
    % preamble
    \pagestyle{empty}
    \begin{document}
    % body
    Собственно текст документа.
    \end{document}

Каждый документ LaTeX состоит из преамбулы [preamle] и тела [body]. Преамбула начинается с определения класса документа, задаваемого \documentclass[опции]{имя класса} и "простирается" до (но не включает в себя) \begin{document}. Тело -- это все, начиная с \begin{document} и до \end{document} включительно.

Преамбула данного выше примера содержит лишь одну команду: \pagestyle{empty}, которая указывает LaTeX'у игнорировать все определения страниц, такие, как "бегущие" [running] заголовки или номера страниц. Знак процента представляет комментарий, который продолжается до конца соответствующей строки.

Синтаксис

Абзацы
Абзацы разделяются одной или более пустыми строками. Число пустых строк не влияет на окончательный вид документа -- одна пустая строка так же хороша, как и несколько. Тоже самое относится к пробелам (разделяющим отдельные слова (но разве вы этого не знали?): сотня пробелов выглядят так же, как и один. Символы новой строки, т.е. завершители строк, считаются пробелами, как и символы табуляции.
Если мы применим эти простые правила к трем различным версиям двух приведенных ниже абзацев, то мы придем к выводу, что все они будут одинаково выглядеть на печати. Я добавил номера в начале каждой строки для того, чтобы указать на пустые строки, отделяющие абзацы друг от друга. Эти номера не являются частью текста.
Вариант A
    1    Я короткое предложение из первого абзаца.
    2
    3    А я единственное предложение второго абзаца.
  
Вариант B
    1    Я короткое предложение
    2    из первого абзаца.
    3
    4    А я
    5    единственное предложение
    6    второго
    7    абзаца.Group arguments together
  
Вариант C
    1    Я   короткое     предложение   из    первого     абзаца.
    2
    3
    4    А я единственное
    5        предложение
    6            второго абзаца.
  
Специальные символы
Большинству не буквенно-цифровых символов в LaTeX придается специальное значение. Это одно из свойств, приводящих новичков в ужас. Однако через некоторое время привыкаешь учитывать особенности поведения тех или иных символьных комбинаций.
Я собрал несколько наиболее важных специальных символов вместе со способами вставить их в текст так, чтобы они правильно отображались на печати.
\
Начинает команду: "\dots" или "\/".
Обратите внимание на то, что "\\" не вставляет в текст одиночную обратную косую черту, как могли бы подумать пишущие на C. Управляющая последовательность "\\" вставляет перевод строки, а "буквальная" обратная косая черта вставляется с помощью "$\backslash$". Для того, чтобы еще больше все запутать: "", т.е. обратная косая черта, за которой следует пробел -- это тоже команда! Она вставляет так называемый "управляемый" пробел, т.е. такой пробел (точнее: в точности один такой пробел), который никогда не "съедается", подобно обычным пробелам, как это объяснялось в разделе "Абзацы".
{}
Группирует аргументы вместе.
Для того, чтобы вставить собственно символ фигурной скобки, его надо "заэскейпить" с помощью обратной косой черты: "\{" или "\}".
%
Начинает комментарий, продолжающийся до конца строки.
Комментарии продолжаются до и включают символ новой строки в ее конце. Этим комментарии в LaTeX отличаются от однострочных комментариев во всех обычных языках программирования, которые не включают символ новой строки. С точки зрения пользователя это означает, что символ новой строки можно замаскировать, заканчивая строку комментарием.
 Hessenberg-%
    Triangular % <- обратите внимание на пробел непосредственно перед символом %
    Reduction
 
эквивалентно
    Hessenberg-Triangular Reduction
 
Для вывода на печать символа процента воспользуйтесь "\%".
~
Вставляет неразрывный пробел, так же как "&nbsp;" в HTML.
$math$
Переключение между обычным и математичекским режимом (модой).
Последовательностьnbsp;math будет выведена в режиме печати математических формул. Для того, чтобы вывести на печать знак доллара, воспользуйтесь "\$".
Команды
Как правило команда LaTeX начинаются с обратной косой черты "\" и продолжается до следующего не-буквенного символа (команды первого типа) или состоит из единственного символа, не являющегося цифрой или буквой (команды второго типа). Таким образом, команды "\raggedleft" и "\makebox" принадлежат к первому типу, а "\\" и "\"" -- ко второму. Аргументы передаются командам в фигуных скобках "{", "}". Пустой аргумент может быть опущен.
Примеры:
    \raggedleft{}                      % нет аргументов
    \raggedleft                        % тоже самое, что и выше
    \makebox{Text inside of a box.}    % единственный аргумент
    \parbox{160pt}{This text is
    typeset inside of a box.}          % два аргумента
Число аргументов, которые можно передавать команде, фиксировано. Некоторые команды, однако, могут принимать необязательные аргументы-опции. Такие необязательные аргументы передаются в квадратных скобках ("[" и "]") и обычно пердшествуют обязательным параметрам, подобно тому, как в большинстве утилит UN*X опции в командной строке предшествуют аргументам.
Пример:
    \parbox[t]{10cm}{Это абзац, выровненный
    по верхнему краю.} % одна опция, два аргумента
В этом примере t является необязательным параметром-опцией.
Пробельные символы, которые следуют за командами первого типа без аргументов (такой, как вторая команда "\raggedleft" в примере выше) "съедаются", т.е. не попадают в выходной файл компилятора, например -- на печать.
Окружения [environments]
Окружения предстваляются парами следующего вида:
\begin{название_окружения}
Текст, содержащийся в окружении.
\end{название_окружения}
Окружение изменяет внешний вид текста, в нем содержащегося. Окружение управляет выравниваением, шириной полей и т.д. Вот некоторые предопределенные окружения: center, description, enumerate, flushleft, flushright, itemize, list, minipage, quotation, quote, tabbing, table, tabular, verbatim и verse.
Окружения могут буть вложенными. Например, для того, чтобы цитата оказалась выравненной по правому краю, можно воспользоваться окружениями flushright и quotation.
    \begin{flushright}
        \begin{quotation}
            Letters are things,     \\
            not pictures of things. \\
            -- Eric Gill
        \end{quotation}
    \end{flushright}
Окружение воздействует только на текст внутри него, все изменения, такие, как различия в отступе инкапсулируются внутри окружения. Ну, по крайней мере до того момента, как вы измените глобальную переменную, но вам ничего не угрожает, т.к. я не собираюсь рассказывать, как это делается:).

Задание структуры документа

В зависимости от documentclass LaTeX знает о трех или четырех уровнях заголовков. В класс article три уровня разделов, в то время, как в классе book сожержит главу в качестве четвертого заголовка самого верхнего уровня.

\chapter{Название главы} % только в классах book и report

\section{Название раздела}

\subsection{Название подраздела}

\subsubsection{Заголовок подраздела подраздела }

Обратите внимание, что как и в POD, который обсуждается в Части I, команды секционирования работают подобно разделителям. Они не группируют текст с помощью маркировки начала и окончания раздела, но простое их появление задает деление текста на группы. Как вы увидите в следующем месяце, в DocBook все иначе.

Списки

В состав LaTeX входит три окружения для создания списков:

Они соответствуют ненумерованному списку, нумерованному списку и списку определений в HTML или спискам =item *, =item 1 и =item термин в POD.

Собственно элементы списка вводятся командой "\item" и могут состоять из нескольких абзацев.

В списке описаний необязательный параметр, задаваемый команде "\item" -- "\item[термин]" -- указывает термин. Последующий текст служит определение термина.

Примеры:

Список из ненумерованных элементов
    Что может сделать для Вас emacs:
    \begin{itemize}
        \item Вырезание и вставка блоков текста
        \item Переформатирование и выравнивание абзацев
        \item Проверка правописания в документах
    \end{itemize}
Нумерованный список
    Первый запуск emacs
    \begin{enumerate}
        \item Запускаем emacs из командной строки:
        \texttt{\$ emacs}
        emacs покажет экран запуска, а затем переключится в буфер
        под названием \texttt{*scratch*}.
        \item Нажмите клавишу~Control, а затем нажмите~H. Внизу экрана
  появится приглашение или окно emacs.
        \texttt{C-h (Введите ?, чтобы увидеть другие опции)-}
        \item Для того, чтобы запустить учебник emacs, нажмите~T .
    \end{enumerate}
Список описаний
    Некоторые команды emacs:
    \begin{description}
        \item[C-x C-c] Выйти из emacs.
        \item[C-x f] Открыть файл.
        \item[C-x r k]
            Стереть [kill] прямоугольник, заданный отметкой и указателем,
   т.е. активной областью [active region].
    \end{description}

Перекрестные ссылки

Для любой перекрестной ссылки требуется две части: та, которая "отсылает" (собственно ссылка -- link) и та, на которую указывается (привязка или метка -- anchor). Привязки в LaTeX'е вставляеются командой \label{имя-ссылки}. Каждая метка находится в каком-то разделе и на какой-то конкретной странице. Эти сведения можно получить командами \ref{имя-ссылки} и \pageref{имя-ссылки} соответственно, вызвав их в любом месте документа.

Примеры использования \ref:

    \section{Установка}\label{section:setup}
    ...
    \section{Заключение}\label{section:summary}
    Как было сказано в разделе~\ref{section:setup} 'Установка',
 ...

Пример использования \pageref:

    \section{Установка}\label{section:setup}
    Сталь, используемый в пробной камере, легирована Ti (0,5\%),
 Cr (0,1\%) и Mn (0,1\%).\label{definition:chamber-alloy}
 \section{Эксперименты}\label{section:experiments}
 Для некоторых пробных камер, выполненых из нержавеющей стали
 (см. точный состав на стр.~\pageref{definition:chamber-alloy}),
 ...

Определение собственных команд и окружений

Одним из главных преимуществ системы предпечатной подготовки LaTeX является то, что пользователь имеет возможность определять собственные команды и окружения. Скажем, вы хотите использовать специальную разметку для всех заменяемых параметров в описании утилиты UN*X, например чтобы:

    cd directory

отображалась, скажем, так:

cd directory

Здесь cd соответствует имени утилиты, а directory -- заменяемый параметр.

Часто имя утилиты выделяется полужирным шрифтом, а заменяемые параметры -- курсивом. Хорошим решением будет такое:

    \utilityname{cd} \replaceable{directory}

где команды \utilityname и \replaceable переключают, соответственно, шрифт "жирность" и "курсивность" шрифта. Использование команд \utilityname и \replaceable позволит сделать оформление всего документа последовательным:

    \utilityname{pushd} \replaceable{directory}
    \utilityname{ls} \replaceable{filename}

Для того, чтобы определить новую команду LaTeX, воспользуйтесь

\newcommand{имя-команды}[число-аргументов ]{последовательность команд}

где имя-команды -- имя команды, число-аргументов -- число аргументов, которые принимает новая команда (по умолчанию 0 можно опустить), а последовательность комманд -- последовательнось команд LaTeX, которые должны быть выполнены при вызове имя-команды.

Для нашего примера, определим \utilityname и \replaceable следующим образом:

    \newcommand{\utilityname}[1]{\textbf{#1}}
    \newcommand{\replaceable}[1]{\textit{#1}}

Предопределенные комнады \textbf и \textit переключают стиль шрифта на текстовой полужирный (в противоположность математическому полужирному шрифту) и тектсовой курсивный соответственно. Аргументы обозначаются #цифра, где цифра может принимать значения от 1 до 9.

Для того, чтобы дать представление о полезности наши "свежеопределенных" команд, предположим, что мы хотим сгенерировать указатель для всех утилит, упомянутых в тексте. Команда \index{термин} помещает термин в указатель. Для этого нам достаточно лишь изменить определение \utilityname:

    \newcommand{\utilityname}[1]{\textbf{#1}\index{#1}}

и все! (Для любопытных: уровни индексов разделяются символами вертикальной черты. Так что, вероятно, мы предпочтем команду \index{utility|#1}, которая соберет все утилиты в симпатично выглядящую группу. За деталями обращайтесь к документации по makeindex).

Новые окружения определяются так:

\newenvironment{имя-окружения}[число-аргументов ]{стартовая-последовательность}{завершающая-последовательность }

главное отличие заключается в том, что \newenvironment две командные последовательности: одна, starting-sequence, открывает окружение, а другая, ending-sequence, завершает его. Продолжая пример с оформлением цитат, выровненых по правому краю, мы определим собственное окружение для оформления цитат:

    \newenvironment{myquotation}% Обратите внимание: "%" маскирует новую строку
    {\begin{flushright}\begin{quotation}}%
    {\end{quotation}\end{flushright}}

которое можно будет использовать так:

    \begin{myquotation}
        Letters are things,     \\
        not pictures of things. \\
        -- Eric Gill
    \end{myquotation}

Ни команды, ни окружения нельзя определять несколько раз с помощью \newcommand или \newenvironment. Эти команды можно использовать только при при перовом определении. Переопределение можно выполнить с помощью \renewcommand и \renewenvironment. Их синтаксис тотже, что и у их "первичных" родственников.

Физическая разметка [Inline Markup]

LaTeX предоставляет богатейшие возможности физической разметки, меняющей внешний вид текста. Здесь я ограничусь обсуждением лишь тех трех команд, которые уже упоминались при обсуждении формат "Старой, доброй и простой документации Perl" [Perl's plain old documentation]: выделения (эмфазы), курсива, полужирного и машинописного стиля шрифта.

Выделение и Курсив
\textit{аргумент} -- Печатает аргумент текстовым курсивом.
\emph{аргумент} -- Производит выделение аргумента. По умолчанию, в зависимости от текущих установок шрифта, включает/выключает курсивное или наклонное начертание. Если текущее начертание прямое, то команда \emph включает курсивное начертание, если же текущая установка -- курсив, то эта команда устанавливает прямое начертание шрифта. Таким образом выделенный текст всегда бросается в глаза.
Полужирный шрифт
\textbf{аргумент} -- выводит аргумент полужирным шрифтом.
На основе команды \textbf мы можем определять свои собственные команды логической разметки, например так:
    \newcommand{\important}[1]{\textbf{#1}}
Машинописный шрифт
\texttt{аргумент} -- выводит аргумент на печать моноширинным "машинописным" шрифтом.
Как и \textbf, \texttt можно "заворачивать" в определенные пользователем команды:
    \newcommand{\sourcecode}[1]{\texttt{#1}}

Последовательность вызова утилит LaTeX

Обычно файлы LaTeX имеют расширение tex. Эти tex-файлы преобразуются в так называемые файлы, не зависящие от устройства (dvi). dvi файлы являются двоичным представлением исходного текста. Их можно просмотреть в консольном режиме с помощью dvisvga (при условии, что терминал поддерживает графику высокого разрешения), или, например, с помощью xdvi в среде X11. Часто файлы dvi преобразуют в Postscript с помощью dvips. Если предпочтителен формат PDF, то утилита pdflatex может создать pdf из tex за один шаг.

latex2html

Пока все нормально. LaTeX позволяет подготовить великолепно выглядящие документы на Postscript'е, а "единоутробная" утилита pdf делает то же самое, но в переносимом формате документов. Разве мы не говорили, что нам нужет и HTML тоже? Конечно говорили! Но тут LaTeX нам не помощник, для этого нам нужен другой инструмент: latex2html. Эта утилита преобразует исходные файлы LaTeX в набор html-файлов, связанные гиперссылками в соответствии со структурой исходного документа.

Загрузить latex2html можно с его домашней страницы: http://www.latex2html.org. Можно взять его и на http://www.ctan.org, а лучше с одного из зеркал. Для того, чтобы выяснить, установлен ли latex2html в вашей системе выполните команду:

    latex2html --version

должно быть что-то вроде этого:

    This is LaTeX2HTML Version 2K.1beta (1.57)
    by Nikos Drakos, Computer Based Learning Unit, University of Leeds.

Что следует изменить для того, чтобы сделать документы LaTeX пригодными для обработки latex2html? Хорошая новость -- почти ничего! Убедитесь, что в преамбуле указаны пакеты html и makeindex, т.е. как минимум добавьте следующее

    \usepackage{html,makeidx}

в преамбулу вашего документа. Теперь файл my_document.tex может быть преобразован в HTML следующим вызовом

    latex2html my_document.tex

Еще раз о ссылках

latex2html берет на себя заботу практически обо всех проблемах, возникающих при преобразовании файла LaTeX в набор html-файлов. Однако ссылки на другие части того же документа или на другие документы концептуально отличаются в печатной документации и HTML. Рассмотрим следующий фрагмент LaTeX

    Ниже мы обобщим наши результаты, используя
 цилиндрическую систему координат. Смотрите
 определение координатной системы на
 странице~\pageref{definition:coordinate-system}.

в котором LaTeX послушно заменяет \pageref{definition:coordinate-system} номером страницы, ка которой находится метка \label{definition:coordinate-system} В чем проблема? Первое, у набор страниц html нет твердо определенного понятия "номер страницы". Во-вторых, latex2html заменяет \pageref{definition:coordinate-system} ссылкой на то место, где отображается сответствующая \label{definition:coordinate-system} часть документа. Эта метка отображается темным квадратом в графическом браузере или маркером "[*]" в текстовых браузерах. Такая конструкция выглядит неуклюже, почти мешает, но это не вина latex2html:

Ниже мы обобщим наши результаты, используя цилиндрическую систему координат. Смотрите определение координатной системы на странице [*].

Latex2html нуждается в нашей помощи! Для экранной версии, абзац с ссылкой нужно перефразировать, например так:

    Ниже мы обобщим наши результаты,
 используя <a>цилиндрическую
 систему координат<</a>>.

где мы указали гиперссылку с помощью anchor-тэгов HTML. Для того, чтобы было возможным создавать различные версии в зависимости от выходного формата, в latex2html определена команда \hyperref.

\hyperref[тип-ссылки]{текст для html-версии}{текст, предшествующий ссылке в LaTeX-версии}{текст, следующий за ссылкой в LaTeX версии}

Необязательный параметр тип-ссылки устанавливает, какой счетчик будет использоваться ссылкой:

"ref"
Перекрестная ссылка на номер раздела, как в команде \ref. Текстом ссылки становится номер секции ("4", "1.5.2", "3.4.2.1" и т.д).
"page" или "pageref"
Ссылается на номер страницы, как \pageref. Текстом ссылки становится номер страницы ("25", "xxiii" и т.д).

Вот наш пример, переписанный с использованием \hyperref

    Ниже мы обобщим наши результаты, используя
 \hyperref[pageref]%
 {цилиндрическую систему координат}% для HTML
 {цилиндрическую систему координат. Смотрите% для LaTeX
 определение координатной системы на странице~}
 {}% завершающий текст для LaTeX, в переводе пуст
 {definition:coordinate-system}.% метка, на которую ссылается ссылка

LaTeX преобразует это так

Ниже мы обобщим наши результаты, используя цилиндрическую систему координат. Смотрите определение координатной системы на странице 97.

а latex2html создает

Ниже мы обобщим наши результаты, используя цилиндрическую систему координат.

после обработки того же исходного текста.

Гиперссылки

Когда на сцене появляюстя гиперссылки, мы сталкиваемся еще с одной проблемой, похожей на ту, с которой мы столкнулись при обработке перекрестных ссылок. Для HTML версии документа гиперссылки жизнено необходимы, в печатной -- не слишком полезны: сравните "Щелкните мышью вот здесь" и "Нажмите карандашом на эту букву". Но иногда, автору действиотельно требуется включить URL в печатный текст. latex2html предоставляет две команды, которые позволяют это сделать.

\htmladdnormallink{текст ссылки}{универсальный локатор ресурса}

\htmladdnormallinkfoot{текст ссылки}{универсальный локатор ресурса}

В HTML версии обе команды генерируют гиперссылку вида <a href = "URL">текст ссылки</a>. В LaTeX версии первая только вставляет текст ссылки, полностью подавляя вывод части URL. Вторая команда добавляет к этому сноску, содержащую универсальный локатор ресурса. Типичным примером применения этих команд может служить следующий

Текст этой статьи можно скачать с нашего \htmladdnormallink{веб-сайта}{http://www.linux-gazette.org}.

и

Текст этой статьи можно скачать с нашего \htmladdnormallinkfoot{веб-сайта}{http://www.linux-gazette.org}.

в LaTeX результат первой команды будет

Текст этой статьи можно скачать с нашего веб-сайта.

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

Текст этой статьи можно скачать с нашего веб-сайта.

Команды, специфичные для конкретного формата

В качестве крайнего средства можно использовать несколько команд, позволяющих автору полностью разделить текст между LaTeX и HTML версиями:

Советую прибегать к разделению текстов только в том случае, когда никакая другая специализированная команда или окружение latex2html не в состоянии создать желаемую разметку. Разделение на разные ветви всегда требует дополнительных усилий по их синхронизации.

Плюсы и минусы latex2html

Плюсы
  • Определяемые пользователям команды и окружения LaTeX дают возможность настроить все в соответствии с вашими требованиями.
  • Вывод на печать максимально возможного качества.
  • Позволяет работать с таблицами и графикой (в этой статье не рассматривается)
Минусы
  • "Несоответствие входных сопротивлений" между LaTeX и HTML, которое не может быть полностью устранено с помощью latex2html.
  • Трудности и длительность усвоения LaTeX

Дополнительные источники

В следующем месяце мы обсудим DocBook


Кристоф Шпиль [Christoph Spiel]

Крис руководит расположенной в Верхней Баварии (Германия) компанией, консультирующей по вопросам Open Source Software. Не смотря на то, что по образованию он физик (он получил ученую степень Доктора Философии в Мюнхенском Технологическом Университете), его главные интересы вращаются вокруг численных методов, гетерогенных сред программирования и разработки программного обеспечения. Связаться с ним можно по адресу [email protected].