[Exposés mensuels] Jeudi 2 juillet, à 20h, « Géométrie hyperbolique dans (lua)latex avec le package luahyperbolic »

L’association GUTenberg organise jeudi prochain 2 juillet 2026 à 20h son 29e exposé mensuel !

Lors de cette séance, nous aurons le plaisir d’assister à un exposé de Damien Mégy intitulé « Géométrie hyperbolique dans (lua)latex avec le package luahyperbolic ».

Le package luahyperbolic permet d’effectuer des calculs et de produire des illustrations de géométrie hyperbolique dans le modèle du disque de Poincaré.

Dans cet exposé, nous présenterons dans un premier temps le disque de Poincaré et ses propriétés métriques les plus importantes, en particulier la notion de géodésique: le plus court chemin entre deux points n’est plus, en général, le segment, et le cinquième postulat d’Euclide n’est plus vérifié. Les concepts géométriques habituels, rotations, symétries, translations, subsistent souvent mais leurs propriétés peuvent évoluer. Par exemple, la somme des angles d’un triangle est inférieure à π et ses médiatrices ne sont pas toujours concourantes!

Dans la seconde partie de l’exposé, nous verrons comment produire, à l’aide du package luahyperbolic, les illustrations montrées dans la première partie. Le package est écrit en lua et permet de définir des points, segments, droites, cercles, horocycles etc, d’effectuer des calculs sur ces objets (intersections, distances, images par différentes isométries hyperboliques), et finalement de produire des figures, dont des figures de pavages hyperboliques.

L’exposé aura lieu en visio-conférence, ici et, en cas d’indisponibilité, ici.

Nous espérons vous y voir nombreux !

Cet exposé est donné dans le cadre des exposés mensuels GUTenberg. Si vous appréciez ces exposés, et plus généralement les actions qu’elle mène (le présent forum, la Lettre, Journées, FAQ, TeXnique.fr, etc.), n’hésitez pas à adhérer à l’association GUTenberg.

Bonjour, je ne parviens pas à compiler le fichier de la documentation (https://github.com/dmegy/luahyperbolic/blob/main/documentation-luahyperbolic.tex) présent sur le dépôt GitHub du package. La compilation se finalise avec :

! ==> Fatal error occurred, no output PDF file produced!

Pourtant le dépôt GitHub contient un fichier PDF sensé être le résultat de la compilation.

J’ai une TeX Live 2026 à jour (l’application graphique TeX Live Utility, fournie avec MacTeX, version graphique de tlmgr, a été lancée afin que je sois bien à jour).

La première erreur est totalement incompréhensible, elle concerne les lignes 70 à 78 :

\newtcbinputlisting{codefromfile}[2][]{%
  myluacolors,           % shared coloring options
  colback=white,
  colframe=black,
  fonttitle=\bfseries,
  listing file=#2,       % path to external file
  title=#1,
  breakable
}

La syntaxe de la commande est en effet, selon le manuel de tcolorbox, en page 344 actuellement :

\newtcbinputlisting[⟨init options⟩]{\⟨name⟩}[⟨number⟩][⟨default⟩]{⟨options⟩}

Il fallait donc {\codefromfile} au lieu de {codefromfile} (contre-oblique manquante).

Par ailleurs, codefromfile (avec ou sans contre-oblique) n’est pas réemployé dans le reste du document.

C’est bizarre que cette erreur, forcément signalée par le compilateur, a été ignorée lors de la publication du ficher .tex.

L’erreur suivante dépasse mes compétences (je n’y connais rien en LuaLaTeX).

En effet, si je corrige l’erreur précédente, l’erreur qui apparaît ensuite est :

…/documentation-luahyperbolic.listing[\directlua]:11: attempt to call a nil value (field “fillCircle”) stack traceback: [\directlua]:11: in main chunk. \luacode@dbg@exec …code@maybe@printdbg {#1} #1 }

l.15 \end{luacode*}

Il reste la possibilité que le problème soit lié au logiciel (Texifier) qui enchaîne automatiquement les compilations selon un certain ordre, après lecture du préambule :

(je note qu’il reste trace dans le texte de l’ancien nom du logiciel, Texpad, je vais le signaler à l’éditeur du logiciel)

Le nombre d’erreurs et d’alertes semble peu crédible pour un package publié sur le CTAN, donc il est tout à fait possible que l’erreur se situe de mon côté :

La compilation fonctionne-t-elle chez vous ?

Moyennant ta première correction, la compilation aboutit chez moi, en dépit de nombreux warnings (Missing character: There is no (U+000A) in font nullfont!) qui concernent le caractère de changement de ligne/passage à la ligne.

Je pense qu’il serait utile de signaler à Damien cette erreur avant son exposé.

Avec une TeX Live à jour, la commande lualatex documentation-luahyperbolic.tex renvoie une erreur :

! Package tcolorbox Error: Invalid box name ``codefromfile''. A single command
(tcolorbox)                is expected after space trimming. I'll drop this
(tcolorbox)                box definition.

Type <return> to continue.
 ...                                              
                                                  
l.70 \newtcbinputlisting{codefromfile}
                                      [2][]{%

Ça mérite d’y regarder plus avant, en effet. Un rapport de bogue s’imposerait-il ? J’arrête mes tests là, faute de temps, hélas.

Oui, j’avais ouvert un rapport de bug il y a quelques heures. J’ai effectivement ces nombreux messages concernant le carractère U+000A.

Peux-tu détailler la chaîne de compilation que tu emploies ? Je vais tester de façon identique chez moi, dans le terminal. Merci.

1 « J'aime »

La commande

lualatex documentation-luahyperbolic.tex 

se bloque sur :

] (./documentation-luahyperbolic.listing)
(./documentation-luahyperbolic.listing) (./documentation-luahyperbolic.listing)
 (./documentation-luahyperbolic.listing) (./documentation-luahyperbolic.listing
) (./documentation-luahyperbolic.listing[\directlua]:11: attempt to call a nil 
value (field 'fillCircle')
stack traceback:
	[\directlua]:11: in main chunk.
\luacode@dbg@exec ...code@maybe@printdbg {#1} #1 }
                                                  
l.15 \end{luacode*}

                    
? 

Je viens de trouver la raison du problème de compilation (et les messages d’erreurs sont moins clairs qu’avec LaTeX pur…). Cette raison est une idiotie de ma part, comme on va le voir.

J’ai déterminé deux endroits du code problématiques, car en les commentant, la compilation fonctionne.

1° : lignes 472 à 486

\begin{luacode*}
local A = complex(0,0)
local B = complex(-0.5,-0.4)
local C = complex(0.8,0.1)
local D = .8*complex.I
local E = complex.polar(.6,math.rad(130))

hyper.tikzBegin()
hyper.drawCircle(A,1) -- default : black
hyper.drawCircle(B,1,"dashed, blue")
hyper.drawCircle(C,1,"thick, red, fill=red!20")
hyper.fillCircle(D, 1) -- default : gray
hyper.fillCircle(E, 1,"ForestGreen!20")
hyper.tikzEnd()
\end{luacode*}

2° : lignes 863 à 876

\begin{luacode*}
local P = complex(-.2,-0.3)
local vect = complex.exp_i(math.pi/4)
hyper.tikzBegin()
hyper.drawRayFromVector(P, vect, "gray")
for k=1,5 do
	local A = hyper.expMap(P)(k*vect)
	hyper.drawPoint(A, "white, draw=red")
end
hyper.drawPoint(P)
hyper.labelPoint(P,"$P$")
hyper.drawVector(P,vect, "red")
hyper.tikzEnd()
\end{luacode*}

En fait, sur le CTAN, on a une vieille version du package, et sur le GitHub, la version plus récente (du mois d’avril) introduit 2 nouvelles fonctions (qui ne sont donc pas encore sur ma TeX Live).

\begin{itemize}
\item 2026-04-12 : added function \verb+fillCircle(center, radius, options)+
\item 2026-03-23 : expMap now takes only one argument, a point, and returns a function. New syntax is \verb+newPoint = hyper.expMap(Point)(vector)+
\item 2026-03-16 : first version uploaded to CTAN
\end{itemize}

Tout ça pour ça…

C’est bien que la nouvelle version ne soit pas encore uploadée sur le CTAN, cela permettra à l’auteur de tenir compte des suggestions de corrections (typographie) que je vais lui soumettre.

2 « J'aime »

Juste lualatex ⟨fichier⟩.

C’est ce que j’avais finalement fait (puisque le problème se manifestait dès le départ, pas au niveau de la création de l’index — c’est avant de le remarquer que je voulais connaître la chaîne de commandes à lancer au terminal, au cas où une combinaison de lualatex et de commandes liées à la création de l’index ne soit la source du problème) :

Quoi qu’il en soit la raison a été trouvée, comme indiqué plus haut (espérons qu’avant que la nouvelle version ne soit publiée sur le CTAN, la correction soit faite sur l’erreur concernant codefromfile où il manquait \).

Bref, par paresse, au lieu de récupérer tous les fichiers du dépôt GitHub, je n’en ai récupéré que le fichier documentation-luahyperbolic.tex, et forcément avec un luahyperbolic.sty plus ancien (version actuelle du CTAN), cela ne marchait pas puisque la documentation s’appuyait sur de nouvelles fonctions. Problème réglé (en espérant que cette erreur me serve de leçon).

L’exposé va démarrer dans quelques minutes !