?

Log in

Byrne's Euclid, MetaPost, TeX (ConTeXt) - jemmybutton

> Recent Entries
> Archive
> Friends
> Profile

January 8th, 2017


Previous Entry Share Next Entry
12:49 pm - Byrne's Euclid, MetaPost, TeX (ConTeXt)

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

Основная идея книжки Бирна в том, что вместо буквенных обозначений точек, углов и прочего используется цветовое кодирование элементов построения, и оно же повторяется в тексте. Выглядит это прикольно, серьезные люди, правда, предположительно пожимая плечами, говорят, что это не нужно, но как по мне, так и правда намного компактней и читается совешенно без проблем. Для примера, вот сравнение доказательства одной и той же теоремы в традиционном виде (не до конца) и в веселеньком:


В общем, думаю, идея понятна.

Но, ясное дело, влоб такое рисовать очень занудно. По уму надо чтобы на элементы сделанного построения можно было ссылаться в тексте, а изменения в самом построении (цвета, пропорции) автоматически отражались на внутритекстовых изображениях. Это я сделал в итоге так: на каждое доказательство создается новый инстанс метапоста, а внутри него производится много картинок, использующих одни и те же переменные. Поменял что-то в изначальных определениях — поменялось все что нужно везде. Вот пример:


То же доказательство, записывается так:
[код и разметка]

\startProposition[title={Prop. V. Theor.}, reference=prop:I.V]

\defineNewPicture{

pair A, B, C, D, E;

picture q;

A := (0, 0);

B := A shifted (u, -2u);

C := B xscaled -1;

D := 9/5[A,B];

E := 9/5[A,C];

draw byAngle(B, A, C, black, 0);

draw byAngle(A, B, C, byblue, 0);

draw byAngle(B, C, A, byblue, 0);

draw byAngle(C, B, E, byyellow, 0);

draw byAngle(D, C, B, byyellow, 0);

draw byAngle(B, D, C, byred, 0);

draw byAngle(C, E, B, byred, 0);

byAngleDefine(E, B, D, black, 1);

byAngleDefine(D, C, E, black, 1);

byLineDefine(B, D, byyellow, 0, 0);

byLineDefine(C, E, byyellow, 0, 0);

byLineDefine(B, E, byblue, 0, 0);

byLineDefine(C, D, byblue, 0, 0);

byLineDefine(A, B, byred, 0, 0);

byLineDefine(A, C, byred, 0, 0);

byLineDefine(B, C, black, 0, 0);

draw byNamedLineSeq(0)(BE,noLine,BC,noLine,CD,BD,AB,AC,CE);

}

\drawCurrentPictureInMargin

\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.)\\

$\therefore \drawAngle{BCA,DCB} = \drawAngle{ABC,CBE}$, $\drawUnitLine{BE} = \drawUnitLine{CD}$ and $\drawAngle{CEB} = \drawAngle{BDC}$ \inprop[prop:I.IV].

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 никак не завязан и его можно использовать с чем угодно.

(11 comments | Leave a comment)

Comments:


[User Picture]
From:p2004r
Date:January 8th, 2017 12:51 pm (UTC)
(Link)
Иногда стороны "линиями со штрихами" обозначают.
[User Picture]
From:jemmybutton
Date:January 8th, 2017 06:47 pm (UTC)
(Link)
Вы про такое http://images.slideplayer.com/28/9349385/slides/slide_2.jpg ?
Теоретически, можно не меняя саму книжку изменить оформление графических элементов глобально, например на такое (как черно-белый вариант). Или (это у меня было в планах) можно еще добавить небольшие буквенные обозначения.
[User Picture]
From:p2004r
Date:January 9th, 2017 08:48 pm (UTC)
(Link)
Да, на рисунке именно такие обозначения. Но меня терзают смутные детские воспоминания "что в тексте были вместо буквенных обозначений кусочки таких линий с рисунка". Углов не помню..
[User Picture]
From:jemmybutton
Date:January 9th, 2017 09:18 pm (UTC)
(Link)
Элементы такого оформления мне тоже попадались, кажется, но какого-то внятного решения для того, чтобы подобное автоматизировать найти так и не удалось. По идее (и в идеале), если разметку еще улучшить, можно сделать вообще один файл с доказательствами и менять стиль с цветных картинок до буквенных обозначений в любых пропорциях (включая «отрезки так, а углы — сяк») почти без редактуры. Сегодня вот поменял синтаксис для многоугольников, чтобы удобней было с отдельными точками работать, отсюда уже можно будет двигаться к опциональному добавлению буквенных обозначений (как предлагал Тафти в Envisioning Information).
[User Picture]
From:thornik
Date:January 8th, 2017 02:38 pm (UTC)
(Link)
"Выглядит это прикольно" - тут ошибка, вместо "приколько" - "дебильно".
Математикой (и геометрией в частности) занимаются науки ради, а не скоротать время в поезде. Использовать цветные линии можно в ребусах для детей, а тут это неприемлемо. Да и чисто практическое соображение - распечатал ты НА ЛАЗЕРНОМ ПРИНТЕРЕ страницу и сидишь, "втыкаешь". Прикольно? Далеко не.
[User Picture]
From:p2004r
Date:January 8th, 2017 02:44 pm (UTC)
(Link)
Ну какие "лазерные принтеры" в 1847?
[User Picture]
From:thornik
Date:January 8th, 2017 10:22 pm (UTC)
(Link)
Ну какие "цветные палочки" в 21 веке?! Математическая нотация уже устоялась, зачем городить детсад? Если уж так чешется заниматься разукрашиванием (привет, Штирлиц!), можно слегка улучшить текст: к словам "отрезок AB" добавлять цветную горизонтальную палочку, такую же как на рисунке (чтобы быстрее её находить). Ну и совсем стыдно не сделать интерактивную книгу, где при наведении мыши на "отрезок AB", на рисунке этот отрезок будет сиять. ВОТ куда бы направить людские мозги, а не дрочение трупа TeX над не менее старыми, да ещё англоязычными книгами. Нам, русским, какая с этой книги польза??
[User Picture]
From:jemmybutton
Date:January 8th, 2017 10:51 pm (UTC)
(Link)
Смените тон, пожалуйста, тогда и поговорим, если хотите, а говном тут кидаться совершенно ни к чему.
[User Picture]
From:OSlavinsky
Date:January 9th, 2017 02:16 pm (UTC)

<q>зачем городить детсад?</q>

(Link)
Известно ли Вам, что многие дошкольники классифицируют фигуры как топологические объекты, а не посредством количества углов.
Разные представления одних и тех же сущностей предпочтительней для молодого незакостенелого ума.
[User Picture]
From:Qulinxao Qulinxao
Date:January 11th, 2017 03:02 pm (UTC)
(Link)
https://github.com/jemmybutton/byrne-euclid/blob/master/byrne_context.tex#L212

перепутаны стороны.(это опечатка у Бирна?)

зы. Вы сделали замечательный труд

о сей(бирновской) "раскаске" услышал тут:

Four Algorithmic Journeys: Epilogue ( https://www.youtube.com/watch?v=ptqzhxGPGy0&t=2880 )
[User Picture]
From:jemmybutton
Date:January 11th, 2017 06:43 pm (UTC)
(Link)
Исправил: https://github.com/jemmybutton/byrne-euclid/commit/23df752b44d4c0d08f28d7823132151c9dfc2a72#diff-ce29b5befc0686b45157d97a74d17263L212
У Бирна там всё верно, это я ошибся. К сожалению, пока там наверняка немало ошибок, но я стараюсь их ловить. Спасибо большое!

> Go to Top
LiveJournal.com