前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >我如何用TeX“复活”两千多年前的《几何原本》?

我如何用TeX“复活”两千多年前的《几何原本》?

作者头像
统计学家
发布2019-06-18 14:41:32
8310
发布2019-06-18 14:41:32
举报

大数据文摘出品 作者:栾红叶、李可、钱天培

2300多年前,被称为“几何之父”的古希腊数学家欧几里得,结合了前人思想,加上自己在几何方面的研究,最终创造出不朽之作《几何原本》。

这本佳作前后总共包含了400多年的数学发展历史,它不仅保存了许多古希腊早期的几何学理论,而且通过欧几里得开创性的系统整理和完整阐述,使这些远古的数学思想发扬光大。

而随着现代工具的发展,一位来自俄国的数学爱好者通过TeX重新编排了《几何原本》,在这份被”复活“的作品中,你不仅能看到彩色图片,甚至可以看到有趣的动画,让这本古老的教科书瞬间灵动了起来。

一起来看看这位俄国小哥创作的心路历程。

选择合适的工具

2016年,我偶然看到了Oliver Byrne的“《几何原本》的前六卷”。这本书的主要特点是,它不是普通的字母名称,如“三角形ABC”,它直接在文本中使用了微缩图片来表述。即三角形的图像。 尽管这在十九世纪可能很困难,但现在,制作这样一本书,只要使用合适的工具也很容易实现。 所以,我决定自己来验证我的结论。

《几何原本》前六卷:

https://archive.org/details/firstsixbooksofe00byrn/page/n23

在Illustrator中绘制所有插图并在InDesign中编写整个内容 ,这种最简单的操作被我迅速抛弃。在Illustrator中,几何结构并不容易做到,并且更没有简便的方法将主图像自动连接到微缩模型。

至于InDesign,虽然它非常擅长处理这种视觉上的复杂布局,但它过度拥挤的“链接”面板就把我吓跑了。因此,我不假思索地选择了我熟悉的工具MetaPost,这个工具使几何处理变得相对容易,还有LaTeX,一个可以完成这项工作系统。由于在LaTeX中使用MetaPost libs会有一些问题,所以我用ConTeXt取代LaTeX,ConTeXt可与MetaPost享有和谐的兼容关系

它是怎样运作的

《几何原本》有13个部分,其中Byrne只有前六本。 每本书都主要是由“命题” 组成,包含定理和问题。 每个命题都会有一个图表(通常是一个)和一些引用图表的文本。

对于几何构造,我创建了一个ConTeXt宏来创建一个新的MetaPost实体。 在MetaPost中,有许多函数可以创建这些几何体。 它们的使用看起来有点像这样:

代码语言:javascript
复制
\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代码即可,但在大多数情况下,他们会将对象名称作为参数。 像这样:

代码语言:javascript
复制
% 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 / a / 60。

为了看起来更舒服,虚线的开头和结尾部分都会用完整的破折号表示。 为了达到这个目的,虚线图案需要缩放一点以适应线条长度,lllustrator具有类似的功能,但其虚线以半破折号开始结束而不是完整破折号。

描绘文本中线段有很多种方法:您可以使它们具有相同的长度,仅保留其颜色,或者你也可以用某种方式显示它们的长度。 Byrne这两种方式都用了,而我使用了以下这个公式:L'= Lal1-a,其中L'是文本中的线段的长度,L是原始的线段长度,l是所需的线段长度,a是介于0和1之间的某个数字。如果a = 0,则L'= 1,即任何线段的长度都是l;如果a = 1,则L'= L;如果0 <a <1,则L <l,L'> L且L> l,L'<L,即,较短的线段变长了,较长的线段变短了。 如果要保留线段的相对长度,同时还要避免2 cm的线段和2 mm线段挨在一起,则可能需要此项。 说实话,一切都有点复杂,但总体思路是一样的。

Byrne的书中不使用字母,但Edward Tufte在他的一本书中肯定了Byrne的作品,并提出使用小标签会有所帮助。 而且由于许多事情都是自动化的,因此添加小写字母并不算一个大工程。 默认情况下,几何顶点的名称是包含其坐标的变量名称。 标签可以放置在多边形的顶点上,在线段的末端和顶点c上。 当然,标签可以选择隐藏和显示,不幸的是,这将会影响布局。

然而,大多数代码通常会用于读者看不到的一些东西上,而作者/编辑则更多关注这些内容。 这些包括正确识别线段和角度的同义词,多边形组周围的自动字母放置以及其他类似的东西。

原版中还有缩写和小插曲。 一方面,创建它们非常容易。至少,它不需要花费很多心思去做,但我想做一个更有趣的尝试 – 自动生成首字母和带有不规则排列的文本。 不仅是因为这个工作有趣,还有就是俄语翻译需要将原始首字母的风格调整为西里尔字母,而我却喜欢这样做。 因此,简而言之,就是当你编译这本书时,首字母列表会被写入,而单独的MetaPost脚本可以非常缓慢地处理它来生成首字母和文本。

这个想法非常简单:将卷曲纹饰放在字母的一部分和框架上,尽可能大。这分为几步完成。所有曲线都包含在后续迭代中。之后,一些“叶子”以相同的方式生长。曲线的形状和特点是可调节的。

结果不能说很满意,但我正在慢慢改进算法,希望达到最好的效果。无论如何,你可以用你选择的图片替换生成的首字母。另外,该脚本还可以生成随机图块。

翻译成俄语来找茬

为了找到更多的错别字和其他错误,我决定将这本书翻译成俄语。起初,我使用著名的Murduhai-Boltovskoi的翻译作为参考,但很快我发现Byrne在翻译中为了实用,大幅修改了欧几里德的定理。老实说,翻译方面我并没有花太多功夫,尤其是简介部分,直到最近我才有时间来润色它。

撇开令人很不愉快的第五本书(碰巧在其他五本书的前几年单独设计),其他的不是非常困难。翻译过程确实有助于发现我和Byrne的错误。例如,第六本书中命题9的图表与文本不匹配,使得证明不正确,所以我只好修改它。

我在翻译过程中偶然发现了一件有趣的事情:在引言中,作者吹嘘他的方法的好处,他引用了Horace关于视觉优于其他感官的话。 几页之后,他引用了一句含义相近的“现代诗人”的诗句,我认为是为了更具说服力。这句诗原来是Horace同一首诗的另一个译本。 幸运的是,在俄语翻译中,我的妻子找到了一位英国作家的合适诗句。当然,在英文版中,这一处我并没有修改。

俄语翻译的另一个特点是,缩写指称在默认情况下是打开的。然而,有人要求制作带有缩写指称的英文版本,我正在考虑将它作为默认选项,因为毕竟“无指称”版本已经存在了(实际上不止一个)。

来自波兰的一个人开始对该书进行波兰语翻译,并在做出了许多非常有价值的贡献(例如,角度缩放是他的想法)。我希望他的翻译能顺利进行。这篇文章的英文版本他也有很大帮助。

图片更易于阅读

我已经研究这本书一段时间了,我有一些收获。内联图片确实易于阅读。现在我也在其他情况下使用这种技术。考虑到我只在下班后的晚上和周末做这个项目,其实并没有花费太多时间:第一个英文版约六个月,俄文翻译约三个月,包括所有规划和代码编写的全过程。虽然后来我发现了错误并修复了错别字。

从我发布第一个版本的那天起,kickstarter 上一个旨在“完善Byrne的工作”的运动即以Byrne的风格制作所有13本Euclid的书籍已经开始并完成了。他们似乎使用了InDesign进行排版。我不知道他们用什么画的图。希望这本书能和他们的其他作品一样好。最近,一位美国设计师制作了一个非常简洁的在线版本。他用了Illustrator绘制图表。

Byrne的书中没有任何三维几何体,只在简介中有平行六面体的图像。我也没有为它制作任何工具,但在某些地方,我想添加一些,所以我开始“Byrne化”11-13号书,用它实践一下新工具。目前,第11本书只有一半多一点粗略制作了,一些函数可以制作三维几何体并将它们投影到平面上。然而,三维机构比平面结构复杂得多,而且我还不确定Byrne的方法是否适合它们,不确定MetaPost是否是一个合适的工具。

文本中的图片需要调整一些字距。类似地,长图片出现在相邻两行会使行间距很宽,所以拉高图片只有在图片碰撞时才适用。我还不知道如何能否自动化地解决这些问题,但我绝对想试一试,因为手工修复真的很无聊。

MetaPost可以在LaTeX中使用,也可以作为独立程序使用。将来,我计划让LaTeX宏靠近ConTeXt宏,以便在更常见的环境中使用它们。 理论上,MetaPost也可以与InDesign一起使用。现在可以用MetaPost生成图片并将它们链接到InDesign文件中,但是这个过程需要一点InDesign脚本才能自动完成。这确实很奇怪,但我不止一次地想到这一点,所以我觉得值得考虑一下。

最后,我想将这些工具应用于比“原本”更现代和实用的东西。感兴趣的读者可以在Github上找到这些资料。

Github 链接:

https://github.com/jemmybutton/byrne-euclid/

相关报道:

https://habr.com/ru/post/451682

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2019-06-10,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 机器学习与统计学 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 选择合适的工具
  • 它是怎样运作的
  • 一些有意思的特征
  • 翻译成俄语来找茬
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档