Colonnes en décalage

Bonjour,
J'aimerais présenter un tableau avec des colonnes décalées comme indiqué ci-dessous.
Quelqu'un saurait-il m'indiquer comment il convient de compléter le code $\LaTeX$ pour tracer les traits ?
Merci.

$\begin{matrix} \mathbb{Sinus}&\mathbb{differences}&\mathbb{differences\;secondes}\\&&\mathbb{(valeurs\; absolues)}\\ \sin(\alpha-\delta)\\ &2\sin(\frac \delta 2)\cos(\alpha-\frac \delta 2)\\ \sin \alpha & & 4\sin^2(\frac \delta 2)\sin \alpha \\ &2\sin(\frac \delta 2)\cos(\alpha+\frac \delta 2)\\ \sin(\alpha+\delta)\end{matrix}$

Les lignes en pointillés sont facultatives.112448

Réponses

  • Bonjour,

    Est-il vraiment souhaitable que le trait horizontal en-dessous de « différences secondes (valeurs absolues) » soit plus bas que ceux en-dessous de « Sinus » et de « différences » ? Il y a tellement peu de choses alignées là-dedans que je crois que j'utiliserais des nœuds TikZ de forme rectangulaire.
  • Bonjour brian,

    Non, le trait en dessous de Valeurs absolues peut être dans le prolongement des deux autres , faut juste que j'arrive à écrire "différences secondes" et "(valeurs absolues)" en légende de colonnes l'un au-dessus de l'autre. L'important est de suggérer que les contenus des cellules de la 2e colonne sont les différences de deux termes consécutifs de la 1ère ;-) .
    Merci. jacquot
  • Je crois que je ferais quelque chose comme ça. Il faut compiler plusieurs fois pour que ça « converge » (utilisation du fichier .aux ; bien regarder les messages de LaTeX).
    \documentclass{article}
    \usepackage{eqparbox}
    \usepackage{etoolbox}
    \usepackage{amsmath}
    \usepackage{booktabs}
    \usepackage{tikz}
    \usetikzlibrary{calc, tikzmark}
    \usepackage{nicematrix}
    \NiceMatrixOptions{cell-space-top-limit = 1pt, cell-space-bottom-limit = 1pt}
    
    \makeatletter
    \newcommand*{\ecritDecalage}[1]{% décalage correspondant à 1/2 hauteur de flèche
      % NB : #1 est développé par \write ici (cela pourrait servir).
      \immediate\write\@auxout{%
        \string\csgdef{#1}{\the\dimexpr -\y1/2\relax}}%
    }%
    \makeatother
    
    \ExplSyntaxOn
    \cs_new_eq:NN \clistmapinline \clist_map_inline:nn
    \ExplSyntaxOff
    
    \AtBeginDocument{%
      \clistmapinline{A, B}{%
        \ifcsdef{decalage#1}{}{\csgdef{decalage#1}{0pt}}%
      }%
    }
    
    \begin{document}
    
    % Influence la hauteur et la profondeur de la ligne contenant $\sin \alpha$
    \newcommand*{\monStrut}{\vrule width 0pt height 4ex depth 2.5ex\relax}%
    %
    \begin{NiceTabular}{ @{} c@{\hspace{1.5em}}cc @{} }[create-medium-nodes]
      \toprule
      Sinus & différences & \eqmakebox[col3]{%
                              \tikzmarknode{diffabs}{%
                                \begin{tabular}[t]{@{}c@{}}
                                  différences secondes\\
                                  (valeurs absolues)
                                 \end{tabular}%
                              }%
                            }\\ \midrule
      $\sin(\alpha - \delta)$ &
        \raisebox{\decalageA}[0pt][0pt]{%
          \tikzmarknode{C}{%
            $2 \sin( \frac{\delta}{2} ) \cos( \alpha - \frac{\delta}{2} )$%
          }%
        } \\
      \monStrut $\sin \alpha$ &
        \raisebox{\decalageB}[0pt][0pt]{%
          \tikzmarknode{D}{%
            $2 \sin( \frac{\delta}{2} ) \cos( \alpha + \frac{\delta}{2} )$%
          }%
        } \\
      $\sin(\alpha + \delta)$ \\ \bottomrule
    \CodeAfter
    \begin{tikzpicture}
      \newcommand*{\traceFlecheEtEcritDecalage}[4][1pt]{%
        % #1 : pour éviter que les flèches adjacentes ne soient trop proches
        \coordinate (tmpa) at ([shift={(\decalageHorizontalFleches, -#1)}] #3);
        \coordinate (tmpb) at ([shift={(\decalageHorizontalFleches,  #1)}] #4);
        \path let \p1=($(tmpa) - (tmpb)$) in \pgfextra{\ecritDecalage{decalage#2}};
        \draw[->] (tmpa) to[bend left] (tmpb)% pas de point-virgule, exprès
      }
      \newcommand*{\decalageHorizontalFleches}{0.5em}
      \traceFlecheEtEcritDecalage{A}{2-1-medium.east}{3-1-medium.east};
      \traceFlecheEtEcritDecalage{B}{3-1-medium.east}{4-1-medium.east};
      %
      \renewcommand*{\decalageHorizontalFleches}{1em}
      \draw[<-] ([xshift=\decalageHorizontalFleches] C.east)
                to[bend left]
                coordinate[midway] (milieuFleche)
                ([xshift=\decalageHorizontalFleches] D.east);
      \node at (milieuFleche -| diffabs)
        {\eqmakebox[col3]{$4 \sin^2(\frac{\delta}{2}) \sin \alpha$}};
    \end{tikzpicture}
    \end{NiceTabular}
    
    \end{document}
    
    On peut aussi se débrouiller sans nicematrix, par exemple en ajoutant quelques commandes \tikzmarknode et \eqmakebox dans la première colonne (afin de ne pas s'appuyer sur l'hypothèse selon laquelle telle ou telle formule serait la plus large...).
    \documentclass{article}
    \usepackage{array}
    \usepackage{eqparbox}
    \usepackage{etoolbox}
    \usepackage{amsmath}
    \usepackage{booktabs}
    \usepackage{tikz}
    \usetikzlibrary{calc, tikzmark}
    
    \makeatletter
    \newcommand*{\ecritDecalage}[1]{% décalage correspondant à 1/2 hauteur de flèche
      % NB : #1 est développé par \write ici (cela pourrait servir).
      \immediate\write\@auxout{%
        \string\csgdef{#1}{\the\dimexpr -\y1/2\relax}}%
    }%
    \makeatother
    
    \ExplSyntaxOn
    \cs_new_eq:NN \clistmapinline \clist_map_inline:nn
    \ExplSyntaxOff
    
    \AtBeginDocument{%
      \clistmapinline{A, B}{%
        \ifcsdef{decalage#1}{}{\csgdef{decalage#1}{0pt}}%
      }%
    }
    
    \begin{document}
    
    % Influence la hauteur et la profondeur de la ligne contenant $\sin \alpha$
    \newcommand*{\monStrut}{\vrule width 0pt height 4ex depth 2.5ex\relax}%
    %
    \begin{tabular}{ @{} c@{\hspace{1.5em}}cc @{} }
      \toprule
      Sinus & différences & \eqmakebox[col3]{%
                              \tikzmarknode{diffabs}{%
                                \begin{tabular}[t]{@{}c@{}}
                                  différences secondes\\
                                  (valeurs absolues)
                                 \end{tabular}%
                              }%
                            }\\ \midrule
      \tikzmarknode{formule 1}{%
        \eqmakebox[col1]{$\sin(\alpha - \delta)$}%
      } &
        \raisebox{\decalageA}[0pt][0pt]{%
          \tikzmarknode{C}{%
            $2 \sin( \frac{\delta}{2} ) \cos( \alpha - \frac{\delta}{2} )$%
          }%
        } \\
      \monStrut
      \tikzmarknode{formule 2}{%
        \eqmakebox[col1]{$\sin \alpha$}%
      } &
        \raisebox{\decalageB}[0pt][0pt]{%
          \tikzmarknode{D}{%
            $2 \sin( \frac{\delta}{2} ) \cos( \alpha + \frac{\delta}{2} )$%
          }%
        } \\
      \tikzmarknode{formule 3}{%
        \eqmakebox[col1]{$\sin(\alpha + \delta)$}%
      }\\ \bottomrule
    \end{tabular}%
    \begin{tikzpicture}[remember picture, overlay]
      \newcommand*{\traceFlecheEtEcritDecalage}[4][1pt]{%
        % #1 : pour éviter que les flèches adjacentes ne soient trop proches
        \coordinate (tmpa) at ([shift={(\decalageHorizontalFleches, -#1)}] #3);
        \coordinate (tmpb) at ([shift={(\decalageHorizontalFleches,  #1)}] #4);
        \path let \p1=($(tmpa) - (tmpb)$) in \pgfextra{\ecritDecalage{decalage#2}};
        \draw[->] (tmpa) to[bend left] (tmpb)% pas de point-virgule, exprès
      }
      \newcommand*{\decalageHorizontalFleches}{0.5em}
      \traceFlecheEtEcritDecalage{A}{formule 1.east}{formule 2.east};
      \traceFlecheEtEcritDecalage{B}{formule 2.east}{formule 3.east};
      %
      \renewcommand*{\decalageHorizontalFleches}{1em}
      \draw[<-] ([xshift=\decalageHorizontalFleches] C.east)
                to[bend left]
                coordinate[midway] (milieuFleche)
                ([xshift=\decalageHorizontalFleches] D.east);
      \node at (milieuFleche -| diffabs)
        {\eqmakebox[col3]{$4 \sin^2(\frac{\delta}{2}) \sin \alpha$}};
    \end{tikzpicture}
    
    \end{document}
    
    Le résultat ressemble à s'y méprendre à celui obtenu avec le premier code ; je ne mets donc pas de capture d'écran pour le deuxième.

    Si tu veux un centrage vertical dans la première ligne, il suffit de remplacer le \begin{tabular}[t] par \begin{tabular}[c] ou juste \begin{tabular}. La deuxième capture d'écran donne le résultat avec le reste provenant du deuxième exemple : sans nicematrix.

    Dernières modifications :
    • léger renommage et suppression du \unexpanded qui n'était pas vraiment souhaitable ici ;
    • code un peu plus joli ;
    • cellspace non utilisé dans la version sans nicematrix ;
    • troisième flèche vers le haut, comme demandé dans le message suivant.
    112486
    112488
  • Bonsoir brian,

    Merci pour la peine que tu t'es donnée ! J'en suis confus.
    Ma maîtrise du $\LaTeX$ est basique et tes scripts me sont difficilement intelligibles.

    Je cherchais quelque chose de simple pour tracer les traits dans ce tableau qui va être inclus dans un article Wikipédia sur le Kunstweg de Bürgi.

    Je ne suis pas sûr que l'éditeur d'articles de Wikipédia reconnaîtra tous tes codes !
    De prime abord, je trouvais que tes tableaux n'étaient pas conformes à ma demande de tracé de traits avec des cases décalées , mais en fait, avec les flèches arrondies, c'est très suggestif aussi et ça me conviendrait bien, à un détail près:
    dans la colonne de droite $4\sin^2(\frac\delta 2)\sin \alpha$ résulte de la différence $(2\sin(\frac \delta 2)\cos (\alpha-\frac\delta 2))-(2\sin(\frac \delta 2)\cos (\alpha+\frac\delta 2))$ , le plus grand moins le plus petit, il faudrait donc tourner la flèche vers le haut.
    Encore merci.
    jacquot
  • Pour la flèche vers le haut, il suffit de remplacer -> par <- dans le dernier \draw[->]. Sinon, pour la compréhension, je me suis « amusé » à faire un truc dans l'esprit de ce que tu semblais souhaiter. Honnêtement, je ne trouve pas très beau et c'est un peu ch... à faire, mais ça m'a donné l'occasion de comprendre comment fonctionne \cline (et pourquoi on ne peut pas la décaler verticalement de manière simple...). Pour utiliser sur Wikipedia, j'ai un peu peur. Faut voir s'ils utilisent vraiment LaTeX ou seulement une syntaxe d'entrée qui y ressemble. Sinon, tu peux toujours faire des captures d'écran...
    \documentclass{article}
    \usepackage{array}
    \usepackage{amsmath}
    \usepackage{tikz}
    \usetikzlibrary{tikzmark}
    \usepackage{cellspace}
    \setlength\cellspacetoplimit{2pt}
    \setlength\cellspacebottomlimit{2pt}
    
    \newcommand{\myVrule}{\vrule width \arrayrulewidth\relax}
    
    \begin{document}
    
    \begin{tabular}{ *{3}{|>{$}S{c}<{$}} | }
    \hline
    \text{Sinus} & \text{différences} & \begin{tabular}[c]{@{}c@{}}
                                          différences secondes\\
                                          (valeurs absolues)
                                        \end{tabular}\\ \hline
    \vrule width 0pt height 3ex\relax
    \tikzmarknode{samdelta}{\sin(\alpha - \delta)}&& \\
    \omit \myVrule\pgfmark{toutagauche}\hfill\myVrule
      & \omit \pgfmark{gauche}\hfill\pgfmark{droite}%
      & \omit \hfill \pgfmark{toutadroite}\myVrule \\
                           & \tikzmarknode{C}{%
                        2 \sin( \frac{\delta}{2} ) \cos( \alpha - \frac{\delta}{2} )%
                             } &                                       \\
    \tikzmarknode{sinalpha}{\sin \alpha} & & 4 \sin^2(\frac{\delta}{2}) \sin \alpha\\
                           & \tikzmarknode{D}{%
                        2 \sin( \frac{\delta}{2} ) \cos( \alpha + \frac{\delta}{2} )%
                             }&\\
    \vrule width 0pt depth 3ex\relax
    \tikzmarknode{sapdelta}{\sin(\alpha + \delta)}&&\\ \hline
    \end{tabular}%
    \begin{tikzpicture}[remember picture, overlay, line width=\arrayrulewidth]
      \draw (samdelta -| {pic cs:gauche}) -- (samdelta -| {pic cs:droite});
      \draw (C        -| {pic cs:toutagauche}) -- (C -| {pic cs:gauche});
      \draw (sinalpha -| {pic cs:gauche}) -- (sinalpha -| {pic cs:droite});
      \draw (D        -| {pic cs:toutagauche}) -- (D -| {pic cs:gauche});
      \draw (C -| {pic cs:droite}) -- (C -| {pic cs:toutadroite});
      \draw (D -| {pic cs:droite}) -- (D -| {pic cs:toutadroite});
      \draw (sapdelta -| {pic cs:gauche}) -- (sapdelta -| {pic cs:droite});
    \end{tikzpicture}
    
    \end{document}
    
    112484
  • Bonjour brian,

    Bravo pour ta réalisation et tes explications.
    Tu m'écris que l'exercice t'aura permis de comprendre le fonctionnement de la commande \cline... au moins il n'aura pas été vain ! De mon côté, j'ai compris que l'on pouvait mettre un tableau dans un tableau ou une matrice dans une case du tableau.
    Maintenant, je vais essayer d'arranger mon tableau sur Wikipédia avec ce que j'ai compris et ce que l'éditeur d'articles voudra bien prendre. Et si je n'y arrive pas, je m'adresserai à l'atelier graphique de la communauté wikipédienne. Il se trouvera sans doute quelqu'un de motivé pour se rendre utile ou relever le défi.

    Je te remercie vivement et amicalement. jacquot
  • Bonjour jacquot,

    En effet, les environnements tabular, array, NiceTabular, etc. produisent tous une boîte (contenant a priori d'autres boîtes), donc pour TeX, un tel environnement se comporte comme n'importe quel caractère. On peut donc les utiliser à peu près n'importe où, ce qui est très pratique (notamment pour empiler des choses verticalement de façon à ce que la boîte résultante soit juste assez large).

    Pour le « fun », voici une version qui fait les pointillés comme dans ton premier message :
    \documentclass{article}
    \usepackage{array}
    \usepackage{amsmath}
    \usepackage{tikz}
    \usetikzlibrary{tikzmark}
    \usepackage{cellspace}
    \setlength\cellspacetoplimit{2pt}
    \setlength\cellspacebottomlimit{2pt}
    
    \newcommand{\myVrule}{\vrule width \arrayrulewidth\relax}
    \newsavebox{\boitePointilles}
    \savebox{\boitePointilles}[0.3cm]{%
      \hfill
      \vrule height \arrayrulewidth width 0.15cm depth 0pt
      \hfill
    }
    
    \begin{document}
    
    \begin{tabular}{ *{3}{|>{$}S{c}<{$}} | }
    \hline
    \text{Sinus} & \text{différences} & \begin{tabular}[c]{@{}c@{}}
                                          différences secondes\\
                                          (valeurs absolues)
                                        \end{tabular}\\ \hline
    \omit \pgfmark{haut}\cr
    \vrule width 0pt height 3ex\relax
    \tikzmarknode{samdelta}{\sin(\alpha - \delta)}&& \multicolumn{1}{c}{}\\
    \omit \myVrule\pgfmark{toutagauche}\hfill\myVrule
      & \omit \pgfmark{gauche}\hfill\pgfmark{droite}%
      & \omit \hfill \pgfmark{toutadroite}\myVrule \\
                           & \tikzmarknode{C}{%
                        2 \sin( \frac{\delta}{2} ) \cos( \alpha - \frac{\delta}{2} )%
                             } & \multicolumn{1}{c}{} \\
    \tikzmarknode{sinalpha}{\sin \alpha} & &
       \tikzmarknode{E}{4 \sin^2(\frac{\delta}{2}) \sin \alpha}\\
                           & \tikzmarknode{D}{%
                        2 \sin( \frac{\delta}{2} ) \cos( \alpha + \frac{\delta}{2} )%
                             }& \multicolumn{1}{c}{}\\
    \vrule width 0pt depth 3ex\relax
    \tikzmarknode{sapdelta}{\sin(\alpha + \delta)} \\
    \omit \pgfmark{bas}\myVrule\leaders \hrule height \arrayrulewidth\hfill \myVrule
      & \omit \cleaders \copy\boitePointilles \hfill
      \span \omit % \myVrule petit trait vertical pour le coin en bas à droite
      \cr
    \end{tabular}%
    \begin{tikzpicture}[
      remember picture, overlay, line width=\arrayrulewidth,
      my dashes/.style={dash pattern=on 0.15cm off 0.075cm, dash phase=-0.075cm},
      ]
      \draw (samdelta -| {pic cs:gauche})      -- (samdelta -| {pic cs:droite});
      \draw (C        -| {pic cs:toutagauche}) -- (C        -| {pic cs:gauche});
      \draw (sinalpha -| {pic cs:gauche})      -- (sinalpha -| {pic cs:droite});
      \draw (D        -| {pic cs:toutagauche}) -- (D        -| {pic cs:gauche});
      \draw (C        -| {pic cs:droite})      -- (C        -| {pic cs:toutadroite});
      \draw (D        -| {pic cs:droite})      -- (D        -| {pic cs:toutadroite});
      \draw (sapdelta -| {pic cs:gauche})      -- (sapdelta -| {pic cs:droite});
    
      \begin{scope}[transform canvas={xshift=-0.5\arrayrulewidth}]
        \draw (D.south -| {pic cs:droite}) -- (sapdelta -| {pic cs:droite});
        \draw[my dashes] (sapdelta     -| {pic cs:droite}) --
                         ({pic cs:bas} -| {pic cs:droite});
      \end{scope}
    
      \begin{scope}[transform canvas={xshift=0.5\arrayrulewidth}]
        \coordinate (tmpa) at
          ([yshift=-0.5\arrayrulewidth] D -| {pic cs:toutadroite});
        \coordinate (tmpb) at
          ([yshift=0.5\arrayrulewidth]  C -| {pic cs:toutadroite});
        \draw (E.south -| {pic cs:toutadroite}) -- (tmpa);
        \draw[my dashes] (tmpa) -- ({pic cs:bas} -| {pic cs:toutadroite});
        \draw (E.north -| {pic cs:toutadroite}) -- (tmpb);
        \draw[my dashes] (tmpb) -- ({pic cs:haut} -| {pic cs:toutadroite});
      \end{scope}
    \end{tikzpicture}
    
    \end{document}
    
    112508
  • C'est top ! ;-)
  • Avec plaisir. Merci pour le lien. Je ne connaissais pas du tout cette histoire de Kunstweg et ma foi, elle vaut le détour !
Connectez-vous ou Inscrivez-vous pour répondre.