Помните, я писал, как ненавижу ТеХ, но продолжаю им пользоваться, потому что ничего лучше пока не придумали? Так вот. Придумали.
DocBook гораздо семантичнее ТеХа. У него, правда, нет таких потрясающих возможностей, но всегда можно их одолжить (у ТеХа, HTML или во что ещё вы его будете выводить), дописав пару своих правил к XSL-преобразованию. Чем я и собираюсь заняться через месяцок-другой в рамках работы над переводом «Погружения».
А пока я пишу дипломную в LaTeX и плююсь. Плююсь и пишу. Нет, тридцать лет назад это была гениальная штука, но в двадцать первом веке его синтаксис и некоторые базовые концепции производят впечатление наколенной поделки.
Рассмотрим, к примеру, создание глав. Если я хочу начать новую главу, я пишу \chapter{Интеграл Пуассона}. При этом глава нумеруется и вносится в оглавление. Есть ещё другая команда с похожим именем \chapter*{Интеграл Пуассона}, которая отличается от первой сразу двумя вещами: глава не нумеруется и не попадает в оглавление. О том, что в далёкой России введения и заключения принято не нумеровать, но включать в оглавление, Кнут не подумал. Вообще, складывается такое впечатление, что он не думал ни о ком, кроме себя.
Вот и размножаются по отечественным трудам такие крокодилы:
% Глава ненумерованная, но присутствующая в оглавлении
\newcommand*{\chaptertoc}[1]
{
\phantomsection
\addcontentsline{toc}{chapter}{#1}
\chapter*{#1}
}
Или количество аргументов у команды. Никогда не известно, сколько их. Я не нашёл ни одного справочника, где была бы полная документация по всем командам. Гуглишь полчаса, а потом в чьём-то блоге находишь рецепт, что можно передать какой-то необязательный параметр, которого нет ни в одной книге, но он работает! Как вообще человечество узнаёт об их существовании?
Двайте немного пофантазируем, каким мог бы быть правильный ТеХ. Эти и многие другие проблемы можно было бы решить, сделав синтаксис чуточку строже и расширив команды параметрами. Вот, посмотрите сами. Пусть каждый вызов команды имеет синтаксис
- вызов_команды ::= «\» название [необязательные_параметры] [аргумент]
- необязательные_параметры ::= «[» (название_параметра «=» значение_параметра)* «]»
- аргумент ::= сущность
- значение_параметра ::= сущность
(Давно не пользовался БНФ, поправьте в комментариях, если ошибся.)
Как это выглядит на практике?
% начало классическое
\chapter{Интеграл Пуассона} % нумеровать и в оглавление добавлять
\chapter*{Тригонометрический вектор} % не нумеровать и в оглавление не добавлять
% а тут начинается веселье
\chaptertoc[enumerate=false]{Введение} % не нумеровать, но в оглавление добавлять
\thebibliography[width=99 addtotoc=true] % а вы мучились с фантомами?
{
...
}
% ладно, допустим, thebibliography не знает такого параметра
% тогда навесим на неё свой обработчик
\addhook-before[cmd=thebibliography]
{
\if[cond=#addtotoc]
{
\chapter[enumerate=false phantom=true]{Литература}
}
}
Никаких крокодилов! Да и команду chapter* можно не включать в стандартную библиотеку, потому что её несложно будет определить самому пользователю при необходимости:
\newcommand*[cmd=chapter*]
{
\chapter[enumerate=false addtotoc=false ##]{#arg}
}
Как вы догадались, ## служит для передачи всех аргументов из текущей команды в вызываемую.
Но самый смак будет с параметрами! Например, сейчас, если мы хотим немножко подкрутить отображение заголовков глав, нужно переопределять разные команды, названия которых иногда совершенно неочевидны, и в документации их не так-то просто найти. Гораздо проще не переопределять команды целиком, а только изменять параметры, и не скопом, а по одному:
\setcounterformat[counter=section]
{
§~\arabic{section}
}
\setdefaultparam[cmd=section]
{
number-after = .
}
Такое определение заставит все последующие вызовы section ставить точку после номера в заголовке и предварять номер раздела (параграфа) соответствующим знаком везде, где он будет использоваться (ref).
Окружения тоже не нужны.
\itemize
{
\item{ Элемент маркированного списка. }
\item{ Другой элемент — нумерованный список:
\enumerate[bullet=1)]
{
\item{ раз; }
\item{ два; }
\item{ три. }
}
}
}
You must be logged in to post a comment.