Les «éléments» d'Euclid fantaisie dans TeX



En 2016, je suis tombé sur Oliver Byrne «Les six premiers livres des Éléments d'Euclide». La principale caractéristique de ce livre est qu'au lieu de désignations de lettres ordinaires telles que «triangle ABC», il utilise des inclusions d'images miniatures directement dans le texte, c'est-à-dire, par exemple, une image d'un triangle. Aussi difficile qu'il l'était probablement au XIXe siècle, aussi facile, avec les bons outils, ce devrait être de faire un tel livre de nos jours. Et j'ai donc décidé de découvrir par moi-même si c'était le cas.



L'option la plus évidente - dessiner toutes les illustrations dans Illustrator et composer le tout dans InDesign - a été rapidement rejetée. Les constructions géométriques ne sont pas exactement la chose la plus facile à faire dans Illustrator, et aucun moyen évident de connecter automatiquement l'image principale aux miniatures ne m'est venu à l'esprit. Quant à InDesign, bien qu'il soit très bon pour gérer des mises en page aussi visuellement riches, il a promis de me faire peur par le panneau "Liens" surpeuplé. Donc, sans y réfléchir à deux fois, j'ai décidé d'utiliser d'autres outils que je connaissais - MetaPost, qui facilitait la gestion de la géométrie, et LaTeX, dont je savais qu'il pouvait faire l'affaire. En raison de certains problèmes avec les bibliothèques MetaPost pour LaTeX, j'ai remplacé ces dernières par ConTeXt qui jouit d'une relation joyeuse prête à l'emploi avec MetaPost.

Comment ça marche en général


Les «éléments» ont 13 parties, appelées «livres», dont Byrne n'a fait que les six premiers. Un livre se compose principalement de «propositions» - des théorèmes et des problèmes. Chaque proposition a un diagramme (généralement un) et du texte, dans lequel le diagramme est référencé.

Pour les constructions, j'ai créé une macro ConTeXt qui crée une nouvelle instance MetaPost. Et dans MetaPost, un tas de fonctions pour créer ces constructions. Leur utilisation ressemble un peu à ceci:

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



Pour les textes de proposition, j'ai créé une série de macros qui dessinent des images dans la même instance MetaPost. En général, ils exécutent du code MetaPost arbitraire, mais la plupart du temps, ils prennent des noms d'objet comme arguments. Comme ça:

 % 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}$. 



Voici comment ces pièces fonctionnent ensemble:



Quelques fonctionnalités


Les images du livre ne sont pas trop compliquées, mais certaines parties ont nécessité une attention particulière.

Si les segments de ligne se touchent avec leurs extrémités, le point de contact a besoin d'une belle représentation. Pour l'instant, la connexion de seulement deux lignes est prise en charge. D'autres lignes peuvent simplement être placées sous un tel joint. Bien que le livre original emploie au moins deux types de joints, à mon avis, un seul suffit.



Les angles sont représentés comme des secteurs circulaires. Si un angle est suffisamment petit, le secteur avec le même rayon peut sembler minuscule, il est donc logique de l'agrandir. Actuellement, le rayon reste le même pour les angles supérieurs à 60 degrés, et pour les angles plus petits, cette formule est utilisée: r/ sqrta/60 .



Pour être joli, les lignes pointillées doivent commencer et se terminer par des tirets pleins. Pour ce faire, le motif de tiret est un peu mis à l'échelle pour s'adapter parfaitement à la longueur d'une ligne (Illustrator a une fonction similaire, mais ses lignes en pointillés commencent et se terminent par des demi-tirets au lieu de tirets pleins.)



Il existe différentes façons de représenter des segments de ligne dans du texte: vous pouvez les faire tous de la même longueur, en ne conservant que leurs couleurs, ou vous pouvez également afficher leur longueur. Byrne fait les deux. J'ai la formule suivante pour cela: L=Lal1a , où L est une longueur de ligne dans le texte, L est la longueur de ligne d'origine, l est une longueur de ligne souhaitée et a est un nombre compris entre 0 et 1. Si a=0 , alors L=l c'est-à-dire que tout segment de ligne aura une longueur l . Si a=1 , alors L=L . Si 0<a<1 , puis avec L<l , L>L et avec L>l , L<L c'est-à-dire que les segments plus courts deviennent plus longs et les segments plus longs deviennent plus courts. Vous pouvez le vouloir si vous souhaitez conserver des longueurs de ligne relatives tout en évitant les lignes de 2 mm à côté de celles de 2 cm. (Pour être honnête, tout est un peu plus compliqué, mais l'idée générale est la même.)



Bien que Byrne ait décidé de ne pas utiliser du tout de lettres, Edward Tufte dans l' un de ses livres , tout en louant le travail de Byrne, a suggéré que les petites étiquettes aideraient réellement. Et comme de nombreuses choses sont automatisées de toute façon, l'ajout de petites lettres n'était pas trop grave. Par défaut, les noms de points sont ceux des variables contenant leurs coordonnées. Les étiquettes peuvent être placées sur les sommets des polygones, aux extrémités des segments de ligne & c. Bien sûr, les étiquettes peuvent être activées et désactivées (malheureusement, affectant la mise en page).



Cependant, la majeure partie du code est consacrée à des choses moins visibles pour un lecteur et beaucoup plus à un auteur / éditeur. Ceux-ci incluent la reconnaissance correcte des synonymes de segment de ligne et d'angle, le placement automatique des lettres autour des groupes de polygones et d'autres choses comme ça.

Il y a aussi des initiales et des vignettes dans l'édition originale. D'une part, ils étaient assez faciles à recréer (au moins, cela ne prendrait pas beaucoup de temps pour le faire), mais j'ai décidé d'aller avec une option plus intéressante (quoique sans espoir) - générer automatiquement les initiales et les vignettes avec un ornement aléatoire. Non seulement c'est amusant, mais aussi, la traduction russe nécessiterait d'adapter le style des initiales originales au script cyrillique, ce que je ne préfère pas faire. Donc, pour faire court, lorsque vous compilez le livre, une liste de lettres initiales est écrite sur le disque et un script MetaPost distinct peut le traiter (très lentement) pour produire les initiales et les vignettes. Aucun d'entre eux n'a exactement le même ornement.



L'idée est assez simple: placez des boucles sur des parties d'une lettre et sur le cadre, aussi grandes qu'elles peuvent grandir. Cela se fait plusieurs fois. Toutes les courbes sont incluses dans les itérations suivantes. Après cela, certaines «feuilles» sont cultivées de la même manière. La forme et les propriétés des différents germes sont réglables.



Je ne peux pas dire que je suis satisfait des résultats, mais lentement j'améliore l'algorithme et j'espère le meilleur (dans tous les cas, vous pouvez remplacer les initiales générées par des images de votre choix). En prime, le script peut également produire des tuiles aléatoires.



La traduction


Pour trouver plus de fautes de frappe et d'erreurs, et juste pour le plaisir, j'ai décidé de traduire le livre en russe. Au début, j'ai utilisé la traduction bien connue de Murduhai-Boltovskoi comme référence, mais j'ai rapidement constaté que Byrne avait trop changé dans les théorèmes d'Euclide pour qu'une traduction de référence soit très utile. Pour être honnête, je n'ai pas trop travaillé sur la traduction, en particulier celle de l'Introduction, et ce n'est que récemment que j'ai trouvé le temps de la lisser.

Mis à part le cinquième livre vraiment désagréable (qui se trouve être conçu séparément plusieurs années avant les cinq autres), cela n'a pas été très difficile. Le processus de traduction a aidé à attraper les bogues, les miens et ceux de Byrne. Par exemple, le diagramme de la proposition 9 du sixième livre ne correspond pas au texte, ce qui rend la preuve incorrecte, j'ai donc dû la changer.

Une chose amusante sur laquelle je suis tombé lors de la traduction: dans l'introduction, où l'auteur se vante des avantages de sa méthode, il a cité les mots d'Horace concernant la supériorité de la vision sur les autres sens. Quelques pages plus tard, il décida (je suppose, pour être encore plus convaincant) de citer un vers du «poète moderne» ayant une signification similaire. Ce verset s'est avéré être une autre traduction du même verset d'Horace. Heureusement, pour la traduction russe, ma femme a trouvé un vers approprié d'un auteur anglais. Naturellement, dans la version anglaise, je n'ai pas changé la chose.



Une autre caractéristique de la traduction russe est que les désignations de lettres sont activées par défaut. Cependant, quelqu'un a demandé de créer une version anglaise avec des lettres activées également, et j'envisage d'en faire l'option par défaut car une version «sans lettre» (et plus d'une, en fait) existe de toute façon.

Un gars de Pologne a commencé à faire une traduction polonaise du livre et a fait de nombreuses contributions extrêmement précieuses en cours de route (les échelles d'échelle, par exemple, était son idée ). J'espère que sa traduction se déroulera sans problème. Il m'a également beaucoup aidé avec la version anglaise de cet article.

Résultats intermédiaires


Ayant joué avec ce livre pendant un certain temps, je peux dire ce qui suit. Les images en ligne sont en effet faciles à lire. Maintenant, j'utilise également cette technique dans d'autres situations. Étant donné que je n'ai travaillé sur ce projet que le soir après un travail à temps plein et le week-end, cela n'a pas pris trop de temps: environ six mois pour la première version anglaise et environ trois pour la traduction russe, avec tous les planification et codage. Bien que j'attrape des bugs et corrige des fautes de frappe à ce jour.

Depuis le jour où j'ai publié la première version, une campagne sur kickstarter destinée à «compléter le travail de Byrne» (c'est-à-dire, comme les auteurs le comprennent, à faire tous les treize livres d'Euclid dans le style de Byrne) a commencé et s'est terminée. Ils semblent utiliser InDesign pour la mise en page. Ce qu'ils utilisent pour dessiner des diagrammes, je n'ai pas pu le découvrir. J'espère qu'ils réussiront à rendre ce livre aussi bon que leurs autres œuvres. Et beaucoup plus récemment, un designer américain a créé une version en ligne très soignée. Il a utilisé Illustrator pour dessiner des diagrammes.

Plans


Le livre de Byrne ne contient aucune géométrie solide (enregistrez une image d'un parallélépipède dans l'introduction). Je n'ai pas non plus créé d'outils pour cela, mais à un moment donné, j'ai décidé d'en ajouter, alors j'ai commencé à «byrnifier» les livres 11-13 pour avoir quelque chose sur lequel utiliser les nouveaux outils. Pour l'instant, seulement un peu plus de la moitié du 11ème livre est grossièrement réalisé, avec quelques fonctions pour faire des constructions solides et les projeter sur le plan de l'écran. Les constructions solides, cependant, sont en moyenne beaucoup plus complexes que les constructions planes, et je ne suis pas encore sûr si l'approche de Byrne leur conviendrait bien et si MetaPost est un outil raisonnablement pratique pour le travail.



Les images dans le texte nécessitent souvent un crénage. De même, des images plus hautes et plus délicates sur les lignes adjacentes étalent les lignes très largement, ce qui n'est approprié que si ces images entrent en collision. Je ne sais pas encore comment et si je peux faire une solution automatisée pour ces problèmes, mais je le veux vraiment car les réparer à la main est vraiment fastidieux.



MetaPost peut également être utilisé à partir de LaTeX et en tant que programme autonome. À l'avenir, je prévois de rendre les macros LaTeX similaires à celles de ConTeXt, pour permettre de les utiliser dans un environnement plus courant. En théorie, MetaPost peut également être utilisé avec InDesign. Il est possible de produire des images avec MetaPost et de les lier dans un fichier InDesign maintenant, mais ce processus demande à être automatisé avec certains scripts InDesign. Cela semble assez pervers, mais je me suis surpris à y penser plus d'une fois, donc je trouve que cela vaut la peine d'être considéré.

Enfin et surtout, je veux appliquer les outils à quelque chose de plus moderne et pratique que «les éléments».

Tous les trucs peuvent être trouvés ici , les pdf-s sont dans la section "releases".

Source: https://habr.com/ru/post/fr452520/


All Articles