LaTeX — Bouts de codes amusants en LaTeX

J’aime beaucoup utiliser PGF/TikZ pour tracer mes figures en \(\LaTeX\), car cela me permet :

  • en tant qu’informaticien, de programmer mes figures ;

  • en tant que mathématicien, d’utiliser un programme de construction pour dessiner.

Voici quelques images, construites en utilisant quelques calculs mathématiques (surtout de la géométrie cartésienne et de la trigonométrie).

Étoiles

J’avais besoin d’une étoile à cinq branches pour illustrer un projet. J’ai écrit la fonction \etoile{rayon}{sommets}{décalage} :

  • rayon : rayon du cercle dans lequel est inscrit l’étoile ;

  • sommets : nombre de pointes de l’étoile (en fait, il s’agit du nombre de sommets du polygone régulier utilisé pour construire l’étoile) ;

  • décalage : deux pointes de l’étoile sont reliées par un segment (tronqué) ; cet argument donne le nombre de pointes situées entre deux sommets (dans le sens direct).

Voici quelques exemples, et quelques explications supplémentaires

../_images/etoiles-01.svg

\etoile{1}{5}{2}

../_images/etoiles-02.svg

\etoile{1}{6}{2}

../_images/etoiles-03.svg

\etoile{1}{7}{2}

../_images/etoiles-04.svg

\etoile{1}{7}{3}

../_images/etoiles-05.svg

\etoile{1}{8}{2}

../_images/etoiles-06.svg

\etoile{1}{8}{3}

% Copyright 2023 Louis Paternault
%
% This work may be distributed and/or modified under the following licences.
%
% LaTeX Project Public Licence
% ----------------------------
%
% This work may be distributed and/or modified under the
% conditions of the LaTeX Project Public License, either version 1.3
% of this license or (at your option) any later version.
% The latest version of this license is in
%   http://www.latex-project.org/lppl.txt
% and version 1.3 or later is part of all distributions of LaTeX
% version 2005/12/01 or later.
%
% Creative Commons by-sa 4.0
% --------------------------
%
% This work may be distributed and/or modified under the
% conditions of the Creative Commons Attribution-ShareAlike 4.0 International
% (CC BY-SA 4.0). The full text of this license is in
% https://creativecommons.org/licenses/by-sa/4.0/

% Compile using LuaLaTeX
%$ lualatex $basename

\documentclass[tikz]{standalone}

\newcommand{\etoile}[3]{
  % \etoile{radius}{number of edges}{gap}
  \begin{tikzpicture}
    \draw[
      rounded corners=1pt,
      fill=yellow,
      draw=yellow!50!black,
      line width=4pt,
    ]
    (
      {0}
      :
      {#1}
    ) -- (
      {(180/(#2)}
        :
        {(#1)/(cos(180/(#2))*(1+tan(180/(#2))/tan(90*(#2-2*#3)/(#2))))}
      )
      \foreach \i in {0, ..., {#2}}{
        -- (
          {(360*\i)/(#2)}
          :
          {#1}
        ) -- (
          {((2*\i+1)*180)/(#2)}
          :
          {(#1)/(cos(180/(#2))*(1+tan(180/(#2))/tan(90*(#2-2*#3)/(#2))))}
        )
      }
      -- cycle;
    \end{tikzpicture}
  }

  \begin{document}

  \etoile{1}{5}{2}

  \etoile{1}{6}{2}

  \etoile{1}{7}{2}
  \etoile{1}{7}{3}

  \etoile{1}{8}{2}
  \etoile{1}{8}{3}

  \end{document}

Nœuds 1

J’ai vu une courte vidéo d’un dessin à la main sur un réseau social quelconque, et j’ai eu envie de le reproduire en \(\LaTeX\). Je n’ai pas pu m’empêcher de généraliser.

La commande \noeud{sommets}{rayon}{épaisseur} dessine un nœud avec :

  • sommets : le nombre de sommets du polygone régulier sur lequel est construit le nœud ;

  • rayon : le rayon du cercle circonscrit au polygone régulier susnommé ;

  • épaisseur : l’épaisseur de la « corde ».

Voici quelques exemples, et quelques explications supplémentaires

../_images/noeuds1-01.svg

\noeud{3}{1}{1}

../_images/noeuds1-02.svg

\noeud{4}{1}{.5}

../_images/noeuds1-03.svg

\noeud{5}{1}{.3}

../_images/noeuds1-04.svg

\noeud{6}{1}{.15}

../_images/noeuds1-05.svg

\noeud{7}{1}{.1}

../_images/noeuds1-06.svg

\noeud{9}{1}{.05}

Mes calculs supposaient que la corde serait assez fine pour ne pas déborder de la boucle voisine. Je m’attendais à une catastrophe, mais vu la manière dont sont construites ces figures, à ma grande surprise, cela produit des tresses.

../_images/noeuds1-07.svg

\noeud{5}{1}{.7}

../_images/noeuds1-08.svg

\noeud{6}{1}{.5}

../_images/noeuds1-09.svg

\noeud{7}{1}{.4}

../_images/noeuds1-10.svg

\noeud{8}{1}{.3}

% Copyright 2023 Louis Paternault
%
% This work may be distributed and/or modified under the following licences.
%
% LaTeX Project Public Licence
% ----------------------------
%
% This work may be distributed and/or modified under the
% conditions of the LaTeX Project Public License, either version 1.3
% of this license or (at your option) any later version.
% The latest version of this license is in
%   http://www.latex-project.org/lppl.txt
% and version 1.3 or later is part of all distributions of LaTeX
% version 2005/12/01 or later.
%
% Creative Commons by-sa 4.0
% --------------------------
%
% This work may be distributed and/or modified under the
% conditions of the Creative Commons Attribution-ShareAlike 4.0 International
% (CC BY-SA 4.0). The full text of this license is in
% https://creativecommons.org/licenses/by-sa/4.0/

% Compile using LuaLaTeX
%$ lualatex $basename

\documentclass[tikz]{standalone}

\usetikzlibrary{calc}

\newcommand{\noeud}[3]{\begin{tikzpicture}[thick]
    % \noeud{sommets}{rayon}{épaisseur}
    \foreach \k in {1, ..., #1}{
      \fill[white] ({(\k+.5)*360/#1}:{#2*cos(180/#1)})
      -- ({(\k+1)*360/#1}:#2)
      arc[start angle={(\k+.5)*360/#1}, delta angle={360/#1}, radius={#2/(2*cos(180/#1))}]
      -- ++({(\k+1.5)*360/#1}:#3)
      arc[start angle={(\k+1.5)*360/#1}, delta angle={-360/#1}, radius={#2/(2*cos(180/#1))+#3}]
      -- ({(\k+.5)*360/#1}:{#2*cos(180/#1)+#3})
      ;
      \draw[black] ({(\k+.5)*360/#1}:{#2*cos(180/#1)})
      -- ({(\k+1)*360/#1}:#2)
      arc[start angle={(\k+.5)*360/#1}, delta angle={360/#1}, radius={#2/(2*cos(180/#1))}]
      ++({(\k+1.5)*360/#1}:#3)
      arc[start angle={(\k+1.5)*360/#1}, delta angle={-360/#1}, radius={#2/(2*cos(180/#1))+#3}]
      -- ({(\k+.5)*360/#1}:{#2*cos(180/#1)+#3})
      ;
    }

    \foreach \k in {1, ..., #1}{
      \fill[white] ($({\k*360/#1}:#2) + ({\k*360/#1+180/#1}:#3)$) arc[start angle={(\k+.5)*360/#1}, delta angle={-360/#1}, radius={#2/(2*cos(180/#1))+#3}]
      -- ++({(\k-.5)*360/#1}:-#3)
      arc[end angle={(\k+.5)*360/#1}, delta angle={360/#1}, radius={#2/(2*cos(180/#1))}]
    -- ({\k+.5)*360/#1}:{#2*cos(180/#1)})
  -- ({\k+.5)*360/#1}:{#2*cos(180/#1)+#3})
  -- cycle
  ;
  \draw[black]
({\k+.5)*360/#1}:{#2*cos(180/#1)+#3})
-- ($({\k*360/#1}:#2) + ({\k*360/#1+180/#1}:#3)$) arc[start angle={(\k+.5)*360/#1}, delta angle={-360/#1}, radius={#2/(2*cos(180/#1))+#3}]
++({(\k-.5)*360/#1}:-#3)
arc[end angle={(\k+.5)*360/#1}, delta angle={360/#1}, radius={#2/(2*cos(180/#1))}]
  -- ({\k+.5)*360/#1}:{#2*cos(180/#1)})
  ;
}
\end{tikzpicture}}

\begin{document}

\noeud{3}{1}{1}
\noeud{4}{1}{.5}
\noeud{5}{1}{.3}
\noeud{6}{1}{.15}
\noeud{7}{1}{.1}
\noeud{9}{1}{.05}

\noeud{5}{1}{.7}
\noeud{6}{1}{.5}
\noeud{7}{1}{.4}
\noeud{8}{1}{.3}

\end{document}

Nœuds 2

Après avoir réalisé les nœuds précédents, je suis tombé sur le paquet fiziko (de Sergey Slyusarev), qui réalise mieux en moins de lignes de code. J’ai donc cherché à améliorer ces nœuds, en remplaçant les cercles par des courbes de Bézier. Le résultat est ici.

La commande \noeud{sommets}{saut}{rayon1}{rayon2}{épaisseur}{dureté} dessine un nœud avec :

  • sommets : le nombre de sommets du polygone régulier sur lequel est construit le nœud ;

  • saut : indique le nombre d’arêtes que « saute » une courbe issue d’un sommet du polygone avant de rejoindre le sommet suivant ;

  • rayon1 : le rayon du cercle inscrit dans le polygone régulier central ;

  • rayon2 : le rayon des extrémités des courbes (sans compter l’épaisseur) ;

  • épaisseur : l’épaisseur de la « corde » ;

  • dureté : indique à quel point les courbes doivent êtres « pointues » ou « arrondies ».

Voici quelques exemples, et quelques explications supplémentaires

Tresses

../_images/noeuds2-01.svg

\noeud{20}{15}{2}{2.2}{.08}{1}

../_images/noeuds2-02.svg

\noeud{40}{5}{2}{2.4}{.07}{.4}

Rosaces

../_images/noeuds2-03.svg

\noeud{20}{20}{2}{2.2}{.08}{1}

../_images/noeuds2-04.svg

\noeud{20}{25}{2}{2.2}{.08}{1}

Inclassables

../_images/noeuds2-05.svg

\noeud{20}{30}{2}{2.2}{.08}{1}

../_images/noeuds2-06.svg

\noeud{5}{1}{1}{.8}{.2}{.4}

../_images/noeuds2-07.svg

\noeud{7}{3}{1}{2}{.2}{3}

Nœuds serrés

../_images/noeuds2-08.svg

\noeud{3}{1}{1}{2}{1}{1}

../_images/noeuds2-09.svg

\noeud{4}{1}{1}{1.5}{.5}{.6}

../_images/noeuds2-10.svg

\noeud{5}{1}{1}{1.5}{.5}{.4}

../_images/noeuds2-11.svg

\noeud{6}{1}{1}{1.5}{.5}{.4}

../_images/noeuds2-12.svg

\noeud{8}{1}{1}{1.25}{.25}{.2}

Nœuds avec du jeu

../_images/noeuds2-13.svg

\noeud{5}{1}{1}{1.5}{.2}{.4}

../_images/noeuds2-14.svg

\noeud{6}{1}{1}{1.5}{.2}{.4}

Nœuds avec beaucoup de jeu ; Cercles

../_images/noeuds2-15.svg

\noeud{4}{3}{1}{3}{.2}{3}

../_images/noeuds2-16.svg

\noeud{5}{2}{1}{2}{.5}{1}

../_images/noeuds2-17.svg

\noeud{5}{3}{1}{3}{.2}{3}

../_images/noeuds2-18.svg

\noeud{5}{3}{1}{2}{.2}{1}

../_images/noeuds2-19.svg

\noeud{5}{2}{1}{2}{.2}{1}

../_images/noeuds2-20.svg

\noeud{7}{2}{1}{2}{.2}{1}

Fleurs

../_images/noeuds2-21.svg

\noeud{5}{4}{1}{2}{.5}{1}

../_images/noeuds2-22.svg

\noeud{5}{5}{1}{2}{.5}{1}

../_images/noeuds2-23.svg

\noeud{5}{6}{1}{2}{.5}{1}

../_images/noeuds2-24.svg

\noeud{5}{7}{1}{2}{.5}{1}

../_images/noeuds2-25.svg

\noeud{7}{5}{1}{2}{.2}{.5}

% Copyright 2023 Louis Paternault
%
% This work may be distributed and/or modified under the following licences.
%
% LaTeX Project Public Licence
% ----------------------------
%
% This work may be distributed and/or modified under the
% conditions of the LaTeX Project Public License, either version 1.3
% of this license or (at your option) any later version.
% The latest version of this license is in
%   http://www.latex-project.org/lppl.txt
% and version 1.3 or later is part of all distributions of LaTeX
% version 2005/12/01 or later.
%
% Creative Commons by-sa 4.0
% --------------------------
%
% This work may be distributed and/or modified under the
% conditions of the Creative Commons Attribution-ShareAlike 4.0 International
% (CC BY-SA 4.0). The full text of this license is in
% https://creativecommons.org/licenses/by-sa/4.0/

% Compile using LuaLaTeX
%$ lualatex $basename

\documentclass[tikz]{standalone}

\usetikzlibrary{calc}

\newcommand{\noeud}[6]{%
  % \noeud{sommets}{saut}{rayon1}{rayon2}{épaisseur}{dureté}
  \begin{tikzpicture}%
    \foreach \i in {1, ..., #1} {
      \fill[white]
      ({(\i-.5)*360/#1}:#3)
      --
      ({\i*360/#1}:{#3/cos(180/#1)})
      ..
      controls
      +({90+360*(\i-.5)/#1}:#6)
      and
      +({90+360*(\i+#2/2)/#1}:{-#6})
      ..
      ({(\i+#2/2)*360/#1}:#4)
      --
      ({(\i+#2/2)*360/#1}:{#4+#5})
      ..
      controls
      +({90+360*(\i+#2/2)/#1}:{-#6*(#4+#5)/#4})
      and
      +({90+360*(\i-.5)/#1}:{#6*(#3+#5)/#3})
      ..
      ($({\i*360/#1}:{#3/cos(180/#1)}) + ({(\i-.5)*360/#1}:#5)$)
      --
      ({(\i-.5)*360/#1}:{#3+#5})
      ;
      \draw[black]
      ({(\i-.5)*360/#1}:#3)
      --
      ({\i*360/#1}:{#3/cos(180/#1)})
      ..
      controls
      +({90+360*(\i-.5)/#1}:#6)
      and
      +({90+360*(\i+#2/2)/#1}:{-#6})
      ..
      ({(\i+#2/2)*360/#1}:#4)
      ;
      \draw[black]
      ({(\i+#2/2)*360/#1}:{#4+#5})
      ..
      controls
      +({90+360*(\i+#2/2)/#1}:{-#6*(#4+#5)/#4})
      and
      +({90+360*(\i-.5)/#1}:{#6*(#3+#5)/#3})
      ..
      ($({\i*360/#1}:{#3/cos(180/#1)}) + ({(\i-.5)*360/#1}:#5)$)
      --
      ({(\i-.5)*360/#1}:{#3+#5})
      ;
    }
    \foreach \i in {1, ..., #1} {
      \fill[white]
      ({(\i-.5)*360/#1}:#3)
      --
      ({(\i-1)*360/#1}:{#3/cos(180/#1)})
      ..
      controls
      +({-90+360*(\i-.5)/#1}:#6)
      and
      +({-90+360*(\i-1-#2/2)/#1}:{-#6})
      ..
      ({(\i-1-#2/2)*360/#1}:#4)
      --
      ({(\i-1-#2/2)*360/#1}:{#4+#5})
      ..
      controls
      +({-90+360*(\i-1-#2/2)/#1}:{-#6*(#4+#5)/#4})
      and
      +({-90+360*(\i-.5)/#1}:{#6*(#3+#5)/#3})
      ..
      ($({(\i-1)*360/#1}:{#3/cos(180/#1)}) + ({(\i-.5)*360/#1}:#5)$)
      --
      ({(\i-.5)*360/#1}:{#3+#5})
      ;
      \draw[black]
      ({(\i-.5)*360/#1}:{#3})
      --
      ({(\i-1)*360/#1}:{#3/cos(180/#1)})
      ..
      controls
      +({-90+360*(\i-.5)/#1}:{#6})
      and
      +({-90+360*(\i-1-#2/2)/#1}:{-#6})
      ..
      ({(\i-1-#2/2)*360/#1}:#4)
      ;
      \draw[black]
      ({(\i-.5)*360/#1}:{#3+#5})
      --
      ($({(\i-1)*360/#1}:{#3/cos(180/#1)}) + ({(\i-.5)*360/#1}:#5)$)
      ..
      controls
      +({-90+360*(\i-.5)/#1}:{#6*(#3+#5)/#3})
      and
      +({-90+360*(\i-1-#2/2)/#1}:{-#6*(#4+#5)/#4})
      ..
      ({(\i-1-#2/2)*360/#1}:{#4+#5})
      ;
    }
  \end{tikzpicture}%
}

\begin{document}

% Tresses
\noeud{20}{15}{2}{2.2}{.08}{1}
\noeud{30}{5}{2}{2.4}{.06}{.4}

% Rosaces
\noeud{20}{20}{2}{2.2}{.08}{1}
\noeud{20}{25}{2}{2.2}{.08}{1}

% Misc
\noeud{20}{30}{2}{2.2}{.08}{1}
\noeud{5}{1}{1}{.8}{.2}{.4}
\noeud{7}{3}{1}{2}{.2}{3}

% Nœuds serrés
\noeud{3}{1}{1}{2}{1}{1}
\noeud{4}{1}{1}{1.5}{.5}{.6}
\noeud{5}{1}{1}{1.5}{.5}{.4}
\noeud{6}{1}{1}{1.5}{.5}{.4}
\noeud{8}{1}{1}{1.25}{.25}{.2}

% Nœuds avec du jeu
\noeud{5}{1}{1}{1.5}{.2}{.4}
\noeud{6}{1}{1}{1.5}{.2}{.4}

% Nœuds larges ; Cercles
\noeud{4}{3}{1}{3}{.2}{3}
\noeud{5}{2}{1}{2}{.5}{1}
\noeud{5}{3}{1}{3}{.2}{3}
\noeud{5}{3}{1}{2}{.2}{1}
\noeud{5}{2}{1}{2}{.2}{1}
\noeud{7}{2}{1}{2}{.2}{1}

% Fleurs
\noeud{5}{4}{1}{2}{.5}{1}
\noeud{5}{5}{1}{2}{.5}{1}
\noeud{5}{6}{1}{2}{.5}{1}
\noeud{5}{7}{1}{2}{.5}{1}
\noeud{7}{5}{1}{2}{.2}{.5}

\end{document}

Explications