花式Euclid在TeX中的“元素”



2016年,我遇到了奥利弗·伯恩(Oliver Byrne)的“欧几里得元素的前六本书”。 本书的主要特征是它代替了普通的字母名称(如“三角形ABC”),而是直接在文本中使用了缩微图片,例如三角形的图像。 借助合适的工具,与十九世纪可能一样困难,也很容易,如今应该制作这样一本书。 因此,我决定自己找出是否是这种情况。



最明显的选项-在Illustrator中绘制所有插图并在InDesign中将整个内容组成-很快被拒绝。 几何构造并不是在Illustrator中最简单的事情,而且我还没有想到一种将主图像自动连接到缩影的明显方法。 至于InDesign,尽管它非常擅长处理如此丰富的视觉布局,但它承诺会因“链接”面板过于拥挤而吓到我。 因此,无需三思而后行,我决定使用我熟悉的其他工具-MetaPost(使几何处理相对容易)和LaTeX(我知道可以胜任)。 由于LaTeX的MetaPost库存在一些问题,我将后者替换为ConTeXt,后者与MetaPost有着开箱即用的快乐关系。

一般如何运作


“元素”有13个部分,称为“书”,其中Byrne仅制作了前6个部分。 一本书主要由“命题”(定理和问题)组成。 每个命题都有一个图(通常是一个图)和一些文本,其中引用了该图。

对于构造,我创建了一个ConTeXt宏,该宏创建了一个新的MetaPost实例。 在MetaPost中,有一堆创建这些构造的函数。 它们的用法如下所示:

\defineNewPicture{ % Inside this thing you put the construction pair A, B, C, D; % MetaPost has a special type of variables for coordinates numeric d; d := 2u; A := (0, 0); % B := A shifted (d, 0); % Point coordinates are set here C := A shifted (0, -d); % D := A shifted (d, -d); % byAngleDefine(B, A, C, byblack, 0); % These define angles: byAngleDefine(D, B, A, byblue, 0); % first—angle points, byAngleDefine(C, D, B, byred, 0); % then color, byAngleDefine(A, C, D, byyellow, 0); % then style. draw byNamedAngleResized(); % This thing draws all the angles. byLineDefine(A, B, byred, 0, 0); % These define line segments: byLineDefine(B, D, byyellow, 0, 0); % first—ends, byLineDefine(D, C, byblack, 0, 0); % then color and style, byLineDefine(C, A, byblue, 0, 0); % then thickness. draw byNamedLineSeq(0)(AB,BD,DC,CA); % This thing draws a sequence of lines. } \drawCurrentPicture % And this thing draws the whole picture. 



对于命题文本,我制作了一系列宏,这些宏在同一MetaPost实例中绘制图片。 通常,它们执行任意的MetaPost代码,但大多数情况下,它们将对象名称作为参数。 像这样:

 % Names are automatically assigned to line segments but can be assigned manually. Draw $\drawUnitLine{CA} \perp \mbox{ and } = \drawUnitLine{DC}$.\\ Draw $\drawUnitLine{AB} \parallel \drawUnitLine{DC}$,\\ and meeting \drawUnitLine{BD} drawn $\parallel \drawUnitLine{CA}$. 



这些部分是如何协同工作的:



一些功能


书中的图片并不太复杂,但是某些部分需要特别注意。

如果线段的末端彼此接触,则接触点需要很好的表示。 目前,仅支持两条线路的连接。 其他线条可以简单地放在这种连接之下。 尽管原始书至少使用两种类型的关节,但在我看来,仅一种就足够了。



角度描绘为圆形扇区。 如果角度足够小,则半径相同的扇形可能看起来很小,因此将其放大是有意义的。 当前,对于60度以上的角度,半径保持不变,对于较小的角度,使用以下公式: r/ sqrta/60



为了看起来不错,虚线应以全破折号开头和结尾。 为了实现这一点,对虚线图案进行了一些缩放,以使其很好地适合行的长度(Illustrator具有类似的功能,但其虚线以半虚线而不是全破折号开头和结尾。)



有多种方法可以在文本中描绘线段:可以使它们的长度相同,仅保留其颜色,也可以以某种方式显示其长度。 伯恩两者都做。 我有以下公式: L=Lal1a,在哪里 L是文本中的行长, L是原始行长, l是所需的行长, 是介于0和1之间的某个数字。 a=0,然后 L=l,即任何线段的长度 l。 如果 a=1,然后 L=L。 如果 0<a<1,然后 L<lL>LL>lL<L即,较短的段会变长,而较长的段会变短。 如果要保留相对的线长,同时避免2厘米的线紧挨2厘米的线,则可能需要这样做。 (说实话,一切都比较复杂,但是总体思路是相同的。)



尽管伯恩决定完全不使用字母标记,但爱德华·塔夫特在其中一本书中称赞伯恩的工作,但他建议使用小标签会有所帮助。 而且由于许多事情都是自动化的,因此添加小写字母并不是一件大事。 默认情况下,点名称是持有其坐标的变量的名称。 标签可以放置在多边形的顶点上,线段和c的末端。 当然,可以打开和关闭标签(不幸的是,这会影响布局)。



但是,大多数代码专用于读者看不见的东西,而作者/编辑则更多。 其中包括正确识别线段和角度同义词,在多边形组周围自动放置字母以及类似的东西。

原始版本中还有缩写和小插图。 一方面,它们相当容易重新创建(至少,这样做不需要很多思想),但我决定采用一个更有趣(尽管无望)的选项-使用以下命令自动生成首字母和渐晕随机的装饰品。 这不仅很有趣,而且俄文翻译将需要将原始缩写的样式调整为西里尔字母,这不是我想要做的。 因此,长话短说,当您编写本书时,会将首字母列表写入磁盘,并且单独的MetaPost脚本可以(非常缓慢)对其进行处理以产生首字母和小插图。 他们中没有两个人有完全相同的装饰。



这个想法非常简单:将卷曲放置在字母的各个部分和框架上,并使其尽可能大。 这完成了几次。 所有曲线都包含在后续迭代中。 之后,以相同的方式种植一些“叶子”。 不同芽的形式和特性是可调节的。



我不能说我对结果感到满意,但是慢慢地我正在改进算法并希望达到最佳效果(在任何情况下,都可以用您选择的图片替换生成的首字母缩写)。 另外,脚本还可以生成随机图块。



笔译


为了找到更多的错别字和错误,并且正因为如此,我决定将这本书翻译成俄语。 最初,我使用著名的Murduhai-Boltovskoi的翻译作为参考,但很快发现Byrne在Euclid定理中的变化太大,因此参考翻译非常有用。 老实说,我在翻译方面并没有花太多功夫,尤其是在导言部分,直到最近才找到一些时间来解决它。

抛开真正令人不愉快的第五本书(恰好是在其他五本书之前的几年中分别设计),这并不困难。 翻译过程确实有助于捕获我的和Byrne的bug。 例如,第六本书中的命题9的图与文本不匹配,从而使证明不正确,因此我不得不对其进行更改。

在翻译过程中,我偶然发现了一件有趣的事情:在引言中,作者吹嘘他的方法的好处,他引用了霍勒斯关于视觉优于其他感官的话。 几页后,他决定(我认为,更具有说服力)引用一首具有类似含义的“现代诗人”诗。 原来,这节经文是同一贺拉斯经文的另一种翻译。 幸运的是,为了进行俄语翻译,我的妻子找到了一位英语作家的诗歌 。 自然,在英语版本中,我没有改变。



俄语翻译的另一个功能是默认情况下启用字母指定。 但是,有人要求制作英文字母也要打开的版本,并且我正在考虑将其设为默认选项,因为无论如何都存在“无字母”版本(实际上有多个)。

来自波兰的一个人开始对这本书进行波兰语翻译 ,并在此过程中做出了许多非常有价值的贡献(例如, 他的想法是缩放角度)。 我希望他的翻译会顺利进行。 他还为我提供了英文版的很多帮助。

中期业绩


玩了一段时间之后,我可以告诉以下内容。 内联图片确实易于阅读。 现在,我也在其他情况下使用了此技术。 考虑到我只是在全职工作之后的晚上和周末才从事这个项目,所以并没有花费太多时间:第一个英文版本大约六个月,俄语翻译大约三个月,所有规划和编码。 虽然我发现了错误并修复了今天的错别字。

自从我发布第一个版本的那天起, 就在kickstarter上发起了一场旨在“完成伯恩的工作”(即,如作者所知,以伯恩的风格制作全部13本欧几里德书)的运动,该运动已经开始并结束。 他们似乎使用InDesign进行布局。 他们用什么来画图,我找不到。 希望他们能够成功地使这本书与其他作品一样出色。 最近,一位美国设计师制作了一个非常简洁的在线版本 。 他使用Illustrator绘制图表。

计划


伯恩的书不包含任何实体几何体(在“简介”中保存平行六面体的图像)。 我也没有为此提供任何工具,但是在某个时候,我决定添加一些工具,因此我开始“精简” 11-13本书,以便使用一些新工具。 目前,仅大致完成了第11本书的一半,以及一些用于制作实体结构并将其投影到屏幕平面的功能。 但是,平均而言,实体结构要比平面结构复杂得多,而且我不确定Byrne的方法是否适合它们,以及MetaPost是否是一种相对方便的工具。



文本中的图片有时需要字距调整。 同样,相邻行上较高的图片也比较棘手,因此线条分布得很宽,仅当这些图片发生冲突时才合适。 我还不知道如何以及是否可以为这些问题提供自动化的解决方案,但是我绝对想这样做,因为手工修复它们确实很繁琐。



MetaPost也可以在LaTeX内部使用,也可以作为独立程序使用。 将来,我计划使LaTeX宏类似于ConTeXt宏,以允许在更常见的环境中使用它们。 从理论上讲,MetaPost也可以与InDesign一起使用。 现在可以使用MetaPost生成图片并将其链接到InDesign文件中,但是此过程可通过某些InDesign脚本自动进行。 它看起来确实很不正常,但是我不止一次地思考了这个问题,因此我认为值得考虑。

最后但并非最不重要的一点是,我想将这些工具应用于比“元素”更现代,更实用的工具。

可以在此处找到所有内容,pdf-s在“发行”部分。

Source: https://habr.com/ru/post/zh-CN452520/


All Articles