Основная идея книжки Бирна в том, что вместо буквенных обозначений точек, углов и прочего используется цветовое кодирование элементов построения, и оно же повторяется в тексте. Выглядит это прикольно, серьезные люди, правда, предположительно пожимая плечами, говорят, что это не нужно, но как по мне, так и правда намного компактней и читается совешенно без проблем. Для примера, вот сравнение доказательства одной и той же теоремы в традиционном виде (не до конца) и в веселеньком:
В общем, думаю, идея понятна.
Но, ясное дело, влоб такое рисовать очень занудно. По уму надо чтобы на элементы сделанного построения можно было ссылаться в тексте, а изменения в самом построении (цвета, пропорции) автоматически отражались на внутритекстовых изображениях. Это я сделал в итоге так: на каждое доказательство создается новый инстанс метапоста, а внутри него производится много картинок, использующих одни и те же переменные. Поменял что-то в изначальных определениях - поменялось все что нужно везде. Вот пример:
То же доказательство, записывается так:[код и разметка] \startProposition[title={Prop. V. Theor.}, reference=prop:I.V]
\problemNP{I}{n}{any isosceles triangle \drawLine[bottom]{AB,AC,BC} if the equal sides be produced, the external angles at the base are equal, and the internal angles at the base are also equal.}
\startCenterAlign
Produce \drawUnitLine{AB} and \drawUnitLine{AC} \inpost[post:II],\\
take $\drawUnitLine{BD} = \drawUnitLine{CE}$ \inprop[prop:I.III];\\
draw \drawUnitLine{BE} and \drawUnitLine{CD}.
Then in
\drawFromCurrentPicture{
draw byNamedAngle(BAC);
draw byNamedLineSeq(0)(AB,AC,CE,BE);
}
and
\drawFromCurrentPicture{
draw byNamedAngle(BAC);
draw byNamedLineSeq(0)(AB,AC,CD,BD);
}\\
we have $\drawUnitLine{AB,BD} = \drawUnitLine{AC,CE}$ (const.),\\
\drawAngle{BAC} common to both,\\
and $\drawUnitLine{AB} = \drawUnitLine{AC}$ (hyp.)\\
Again in \drawLine{BC,CE,BE} and \drawLine{BC,CD,BD}\\
we have $\drawUnitLine{BD} = \drawUnitLine{CE}$, $\drawAngle{CEB} = \drawAngle{BDC}$ and $\drawUnitLine{BE} = \drawUnitLine{CD}$,\\
$\therefore \drawAngle{DCE,DCB} = \drawAngle{EBD,CBE}$ and $\drawAngle{DCB} = \drawAngle{CBE}$ \inprop[prop:I.IV]\\
but $\drawAngle{BCA,DCB} = \drawAngle{ABC,CBE}$, $\therefore \drawAngle{BCA} = \drawAngle{ABC}$.
\stopCenterAlign
Внутри \defineNewPicture{...} описывается построение, а в тексте доказательства идут разные ссылки на его элементы. Пространство для улучшения, конечно, остается довольно большое: автоматическое именование углов, к примеру, добавил только когда писал этот пост. Можно еще, к примеру, добавить определение составных линий, типа AD ← AB,BD и аналогично для многоугольников, и т. п., но в целом уже достаточно удобно.
Некоторые проблемы, с которыми пришлось столкнуться:
Обтекание текстом картинок в техе работает так: вначале определяются длины строк, а затем в них вгоняется абзац. Это работает, если строки одной высоты, но в этой книжке высота строк постоянно меняется:
Если, к примеру, тут две миниатюры окружностей окажутся на одно строке, нужно отвести одно количество коротких строк, а если на разных, то другое, но заранее это предсказать проблематично. Не уверен, что это вообще можно решить с разумными трудозатратами, не ломая все остальное. В моей версии поля заметно увеличены и иллюстрации в большинстве случаев помещаются на них, а для остальных количество укороченных строк задается вручную. Другая проблема, которую тоже видно на этой странице - миниатюры окружностей на соседних строках расположены далеко друг от друга и если высота строк определяется границами миниатюр, то визуально расстояние между строками будет слишком большим. Это приходится, опять же, решать вручную. На практике такое встречается очень редко и хлопот не доставляет.
Верстка местами в оригинале очень вычурная. К примеру, тут:
слово triangle обтекает треугольник в следующей строчке. Такое воспроизводить я даже не пытался (хотя технически вручную и можно). Думаю, все равно так делать скорее плохо чем хорошо, так что не жалко.
В оригинале вообще довольно много небрежностей и некрасивостей. Например, в самом начале есть список используемых символов:
Значок ∵ в книге не исользуется вовсе, вместо него автор везде пишет словом, because. Значки «не больше чем» и «не меньше чем» также не встречаются (вообще, их все я везде заменил на привычные < и >). Даже вместо минуса чуть ли не везде написано словом minus. Еще почему-то QED написано разными шрифтами:
Это тоже похоже на явный косяк, так что фиг с ним. Вообще по поводу одинакового внешнего вида я не особенно парился, это было бы слишком много ручной работы и слишком мало смысла.
Некоторые стили встречаются по одному разу. К примеру:
Такой вот полосатый угол в книге ровно один и, более того, без него легко можно было бы обойтись, но такой стиль я добавил все равно. Пусть будет.
Ну и буквицы.
Это такой временный вариант, основная идея которого в том, чтобы, буквицы не повторялись. Тут просто растут случайные завитушки с каплями на концах иа контуре литеры и рамки. Рисуются они пока адски медленно, но часто это делать и не нужно. Кроме того, так в книжке нет ни одного заранее подготовленного изображения, все генерируется параметрически (не считая шрифта, который сейчас Libertine; идеологически верно было бы взять Computer Modern, но мне на вид с ним меньше нравится, хотя никто и не мешает). Возможно, отрисую как-нибудь на досуге буквицы из оригинала, чтобы можно было подставить их и поупарывать на предмет максимально точного воспроизведения первоисточника.
Дальше буду думать в сторону перевода на русский и, вероятно, попробую оформить так какие-то штуки из школьной программы, чтобы испытать на детях, когда дорастут.
Ну и теперь еще надо куда-нибудь ссылочку кинуть, а то книжка-то очень широкоизвестная в узких кругах, а мужики-то не знают.
Если совсем лень качать исходники и собирать все, пдфку можно посмотреть в релизах, постараюсь поддерживать там все в актуальном состоянии.
Upd-1 Ух ты, как быстро, спасибо! Уже нашелся первый идиотский (прошу прощения, это, конечно, очень глупо вышло) и первый сущностный баги. Закономерные вопросы: Зачем вообще нужна эта книжка? Книжка сама по себе, конечно, представляет больше историческую, чем какую-либо другую ценность, очень многое можно было бы улучшить, но я старался воздерживаться от этого, а для начала просто воспроизвести задумку Бирна нормальными средствами (то есть с минимумом ручного труда). Сам подход мне (да и не только мне, про эту книжку писал, например, Тафти, как про пример хорошей подачи информации) кажется занятным и с помощью представленных средств, можно в перспективе сделать более интересный материал. Зачем вообще в наши дни делать что-то в техе? Возможно, есть средства для таких целей лучше, мне они неизвестны. Могу сказать точно, что используя, скажем, InDesign добиться того же результата было бы точно не быстрее. Почему ConTeXt? Изначально планировалось использовать LaTeX, но удовлетворяющей всем требованием библиотеки для MetaPost мне найти не удалось, а в ConTeXt все работает из коробки. В настоящий момент используется ConTeXt с LuaTeX (в котором метапост встроен в виде mplib и работать с ним так гораздо удобнее, чем со отдельностоящим), перевести все на LuaLaTeX должно быть не очень сложно, но это не в приоритете. В любом случае, MetaPost код на ConTeXt никак не завязан и его можно использовать с чем угодно.