“Elementos” extravagantes de Euclides no TeX



Em 2016, me deparei com “Os seis primeiros livros dos Elementos de Euclides” de Oliver Byrne . A principal característica deste livro é que, em vez de designações comuns de letras como "triângulo ABC", ele emprega inclusões de figuras em miniatura diretamente no texto, ou seja, por exemplo, uma imagem de um triângulo. Por mais difícil que provavelmente tenha sido no século XIX, e tão fácil, com as ferramentas certas, deve ser fazer esse livro hoje em dia. E então eu decidi descobrir por mim mesmo se é esse o caso.



A opção mais óbvia - desenhar todas as ilustrações no Illustrator e compor tudo no InDesign - foi prontamente rejeitada. Construções geométricas não são exatamente as coisas mais fáceis de fazer no Illustrator, e não me ocorreu nenhuma maneira óbvia de conectar automaticamente a imagem principal às miniaturas. Quanto ao InDesign, embora seja muito bom em lidar com layouts visualmente ricos, ele prometeu me assustar muito com o painel "Links" superlotado. Então, sem pensar duas vezes, decidi usar outras ferramentas que conhecia - o MetaPost, que tornava relativamente fácil lidar com a geometria, e o LaTeX, que eu sabia que poderia fazer o trabalho. Devido a alguns problemas com as bibliotecas do MetaPost para o LaTeX, substituí o último pelo ConTeXt, que desfruta de um relacionamento alegre pronto para uso com o MetaPost.

Como funciona em geral


Os "Elementos" têm 13 partes, chamadas "livros", das quais Byrne fez apenas os seis primeiros. Um livro consiste principalmente de "proposições" - teoremas e problemas. Toda proposição tem um diagrama (geralmente um) e algum texto, no qual o diagrama é referenciado.

Para construções, criei uma macro ConTeXt que cria uma nova instância do MetaPost. E no MetaPost, várias funções para criar essas construções. Seu uso é mais ou menos assim:

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



Para textos de proposição, criei uma série de macros que desenham figuras na mesma instância do MetaPost. Em geral, eles executam código MetaPost arbitrário, mas na maioria das vezes, recebem nomes de objetos como argumentos. Assim:

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



É assim que essas partes funcionam juntas:



Alguns recursos


As imagens do livro não são muito complicadas, mas algumas partes exigiram atenção especial.

Se os segmentos de linha se tocam com suas extremidades, o ponto de contato precisa de uma boa representação. Por enquanto, a conexão de apenas duas linhas é suportada. Outras linhas podem simplesmente ser colocadas sob essa articulação. Embora o livro original empregue pelo menos dois tipos de juntas, na minha opinião, apenas uma é suficiente.



Os ângulos são representados como setores circulares. Se um ângulo é pequeno o suficiente, o setor com o mesmo raio pode parecer pequeno, por isso faz sentido aumentá-lo. Atualmente, o raio permanece o mesmo para ângulos acima de 60 graus e, para ângulos menores, esta fórmula é usada: r/ sqrta/60.



Para ficar bonita, as linhas tracejadas devem começar e terminar com traços completos. Para conseguir isso, o padrão de traço é dimensionado um pouco para se ajustar perfeitamente ao comprimento de uma linha (o Illustrator possui um recurso semelhante, mas suas linhas tracejadas começam e terminam com meio traços em vez de traços completos.)



Existem várias maneiras de representar segmentos de linha no texto: você pode torná-los com o mesmo comprimento, mantendo apenas as cores ou de alguma forma também mostrar o comprimento. Byrne faz os dois. Eu tenho a seguinte fórmula para isso: L=Lal1aonde Lé um comprimento de linha no texto, Lé o comprimento da linha original, lé um comprimento de linha desejado e aé algum número entre 0 e 1. Se a=0então L=l, ou seja, qualquer segmento de linha terá comprimento l. Se a=1então L=L. Se 0<a<1, então com L<l, L>Le com L>l, L<L, ou seja, segmentos mais curtos se tornam mais longos e os mais longos se tornam mais curtos. Você pode querer isso se desejar reter comprimentos de linha relativos, evitando linhas de 2 mm ao lado de linhas de 2 cm. (Para ser sincero, tudo é um pouco mais complicado, mas a ideia geral é a mesma.)



Embora Byrne tenha decidido não usar as designações de letras, Edward Tufte em um de seus livros , elogiando o trabalho de Byrne, sugeriu que as etiquetas pequenas realmente ajudariam. E, como muitas coisas são automatizadas de qualquer maneira, adicionar letras minúsculas não é grande coisa. Por padrão, os nomes dos pontos são aqueles das variáveis ​​que mantêm suas coordenadas. As etiquetas podem ser colocadas nos vértices dos polígonos, nas extremidades dos segmentos de linha etc. Obviamente, as etiquetas podem ser ativadas e desativadas (infelizmente, afetando o layout).



A maior parte do código, no entanto, é dedicada a coisas menos visíveis para um leitor e muito mais para um autor / editor. Isso inclui o reconhecimento correto de sinônimos de segmento e ângulo de linha, posicionamento automático de letras em torno de grupos de polígonos e outras coisas assim.

Existem também iniciais e vinhetas na edição original. Por um lado, eles eram razoavelmente fáceis de recriar (pelo menos, não seria preciso muito esforço para fazer isso), mas eu decidi optar por uma opção mais interessante (embora sem esperança) - gerar automaticamente as iniciais e vinhetas com um ornamento aleatório. Não é apenas divertido, mas também, a tradução em russo exigiria a adaptação do estilo das iniciais originais ao script cirílico, o que não era algo que eu preferiria fazer. Portanto, resumindo a história, quando você compila o livro, uma lista de letras iniciais é gravada no disco, e um script MetaPost separado pode processá-lo (muito lentamente) para produzir as iniciais e vinhetas. Dois deles não têm exatamente o mesmo ornamento.



A idéia é bem direta: coloque cachos em partes de uma carta e na moldura, o maior tamanho possível. Isso é feito várias vezes. Todas as curvas são incluídas nas iterações subsequentes. Depois disso, algumas "folhas" são cultivadas da mesma maneira. A forma e as propriedades de diferentes brotos são ajustáveis.



Não posso dizer que estou feliz com os resultados, mas lentamente estou melhorando o algoritmo e esperando o melhor (em qualquer caso, você pode substituir as iniciais geradas por imagens de sua escolha). Como bônus, o script também pode produzir peças aleatórias.



Tradução


Para encontrar mais erros e erros de digitação, decidi traduzir o livro para o russo. Inicialmente, usei a conhecida tradução de Murduhai-Boltovskoi como referência, mas logo descobri que Byrne mudou muito nos teoremas de Euclides para que uma tradução de referência fosse muito útil. Para ser sincero, não trabalhei muito na tradução, especialmente na Introdução, e apenas recentemente encontrei algum tempo para suavizá-la.

Deixando de lado o quinto livro realmente desagradável (que foi projetado separadamente vários anos antes dos outros cinco), não foi terrivelmente difícil. O processo de tradução ajudou na captura de insetos, tanto meus quanto de Byrne. Por exemplo, o diagrama da proposição 9 no sexto livro não corresponde ao texto, tornando a prova incorreta, então tive que alterá-lo.

Uma coisa divertida que me deparei durante a tradução: na Introdução, onde o autor se gabava dos benefícios de seu método, ele citou as palavras de Horace a respeito da superioridade da visão sobre outros sentidos. Algumas páginas depois, ele decidiu (presumo, para ser ainda mais convincente) citar o verso de um "poeta moderno" com significado semelhante. Esse versículo acabou sendo outra tradução do mesmo versículo de Horácio. Felizmente, para a tradução em russo, minha esposa encontrou um verso adequado de um autor em inglês. Naturalmente, na versão em inglês, eu não mudei a coisa.



Outra característica da tradução para o russo é que as designações de letras estão ativadas por padrão. Alguém, no entanto, pediu para criar uma versão em inglês com as letras ativadas também, e estou pensando em torná-la a opção padrão, já que existe uma versão “sem letra” (e mais de uma, na verdade).

Um cara da Polônia começou a fazer uma tradução para o polonês do livro e fez muitas contribuições extremamente valiosas pelo caminho (ângulos de escala, por exemplo, foram ideia dele ). Espero que a tradução dele corra bem. Ele também me ajudou bastante com a versão em inglês deste artigo.

Resultados intermediários


Tendo brincado com este livro por um tempo, posso dizer o seguinte. As imagens embutidas são realmente fáceis de ler. Agora eu uso essa técnica em outras situações também. Considerando que eu só trabalhava nesse projeto à noite depois de um emprego em período integral e nos fins de semana, não demorou muito tempo: cerca de seis meses para a primeira versão em inglês e cerca de três para a tradução em russo, com todas as planejamento e codificação. Embora eu pegue erros e corrija erros de digitação até hoje.

Desde o dia em que publiquei a primeira versão, uma campanha no kickstarter destinada a "concluir o trabalho de Byrne" (ou seja, como os autores entendem, fazer todos os treze livros de Euclides no estilo de Byrne) começou e terminou. Eles parecem usar o InDesign para o layout. O que eles usam para desenhar diagramas, eu não consegui descobrir. Felizmente, eles conseguirão tornar este livro tão bom quanto seus outros trabalhos. E muito mais recentemente, um designer norte-americano criou uma versão online muito elegante. Ele usou o Illustrator para desenhar diagramas.

Planos


O livro de Byrne não contém geometria sólida (salve a imagem de um paralelepípedo na Introdução). Também não criei nenhuma ferramenta para isso, mas, em algum momento, decidi adicionar algumas, então comecei a “byrnify” os livros 11–13 para ter algo para usar as novas ferramentas. Por enquanto, apenas um pouco mais da metade do 11º livro é fabricado, juntamente com algumas funções para criar construções sólidas e projetá-las no plano da tela. Construções sólidas, no entanto, na média são substancialmente mais complexas do que as planas, e ainda não tenho certeza se a abordagem de Byrne se ajustaria bem a elas e se o MetaPost é uma ferramenta razoavelmente conveniente para o trabalho.



Imagens em texto muitas vezes precisam de kerning. Da mesma forma, as imagens mais complicadas e altas das linhas adjacentes espalham as linhas muito amplas, o que é apropriado somente se essas imagens colidirem. Ainda não sei como e se posso criar uma solução automatizada para esses problemas, mas definitivamente quero, porque corrigi-los manualmente é realmente entediante.



O MetaPost também pode ser usado no LaTeX e como um programa independente. No futuro, pretendo tornar as macros do LaTeX semelhantes às do ConTeXt, para permitir usá-las em um ambiente mais comum. Em teoria, o MetaPost também pode ser usado com o InDesign. É possível produzir imagens com o MetaPost e vinculá-las em um arquivo do InDesign agora, mas esse processo precisa ser automatizado com alguns scripts do InDesign. Parece bastante perverso, mas me peguei pensando nisso mais de uma vez, então acho que vale a pena considerar.

Por último, mas não menos importante, quero aplicar as ferramentas a algo mais moderno e prático do que "os Elementos".

Todas as coisas encontradas aqui , os pdf-s estão na seção "releases".

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


All Articles