Tikz pour dessins avec matrices ?

Bonsoir à tous,

Suite de mes problèmes avec les matrices et déterminants en latex. Je cherche à réaliser les "dessins" sur la photo. Je souhaiterais savoir quel est le meilleur moyen pour les réaliser. J'ai cherché un peu et j'ai trouvé plusieurs "outils" qui ont l'air de pouvoir faire ce genre de choses, dont Tikz et l'environnement nicematrix.
Je ne connais cependant pas ces outils et je ne sais pas comment faire. J'ai aussi trouvé de multiples polys les expliquant, mais tous assez longs (et ayant l'air assez complexes). Quelqu'un pourrait-il me montrer comment faire ces figures de façon appropriée, et m'indiquer le(s) outil(s) à utiliser pour ce genre de problèmes? Je précise que je ne cherche pas à réaliser la partie "matrice 2 $\times$ 2 au crayon", mais je l'ai rajoutée juste pour avoir un exemple de "matrice dans une matrice" (au passage, les $z$ et $t$ ne sont pas très bien alignés: ils doivent être sur la même ligne que le 1, 0 et $va_3$; ils ont l'air un peu en dessous sur mon dessin). Si de plus vous pouviez m'indiquer un poly (ou un tutoriel quelconque) assez simple (et court) pour prendre en main les Tikz/nicematrix/le package utilisé je vous en serais reconnaissant (il faudra quand même que j'apprenne à faire les prochains dessins moi-même).

Je vous remercie d'avance pour votre aide !113284

Réponses

  • Bonjour,

    Ces choses-là doivent être faisables avec nicematrix ou les matrices TikZ (documentation dans le manuel de TikZ & PGF, chapitres Matrices and Alignment et Matrix Library). La documentation de nicematrix est disponible en français et en anglais. Il y a aussi quelques exemples sur ce forum.

    Pour le premier dessin, j'utiliserais sans doute nicematrix. Le deuxième... à voir, après un essai pour les blocs rectangulaires. Le troisième, plutôt une matrice TikZ afin que les + et - à droite soient bien pris en compte dans la bounding box (avec nicematrix, les ajouts TikZ via 'code-after' ne contribuent pas à cette dernière car ils utilisent l'option TikZ 'overlay').
  • @brian merci pour votre réponse!

    J'essaye pour le moment de faire le premier dessin, et ce qui me pose d'abord problème c'est de faire des lignes pleines (c'est-à-dire pas des pointillés) et au même niveau que les 0. J'ai trouvé comment faire des lignes pleines comme dans le deuxième dessin (où elles séparent les colonnes et les lignes), mais remplacer les pointillés par des lignes pleine au sein même d'une colonne/ligne je ne vois pas... savez-vous comment faire?
  • Le plus simple semble être d'utiliser les commandes de nicematrix pour lignes pointillées, telles que \Cdots ou \Ddots, avec l'option 'line-style=solid'. L'exemple suivant est celui du manuel à la section Customization of the dotted lines, dans lequel j'ai simplement retiré le 'xdots/line-style=loosely dotted' (pour rendre les pointillés plus visibles) et transformé deux lignes pointillées en lignes pleines.
    \documentclass{article}
    \usepackage{tikz}
    \usepackage{nicematrix}
    
    \newcommand{\sDdots}{\Ddots[line-style=solid]}
    
    \begin{document}
    $\begin{pNiceMatrix}[nullify-dots]
    a      & b      & 0        &                  & \Cdots & 0          \\
    b      & a      & b        & \Ddots           &        & \Vdots     \\
    0      & b      & a        & \sDdots          &        &            \\
           & \Ddots & \sDdots  & \Ddots           &        & 0          \\
    \Vdots &        &          &                  &        & b          \\
    0      & \Cdots &          & 0                & b      & a
    \end{pNiceMatrix}$
    \end{document}
    
    Si toutes les lignes devaient être pleines, il suffirait de passer 'xdots/line-style=solid' (au lieu de 'xdots/line-style=loosely dotted' dans l'exemple du manuel) en argument optionnel de \begin{pNiceMatrix} :
    \documentclass{article}
    \usepackage{tikz}
    \usepackage{nicematrix}
    
    \begin{document}
    % xdots/line-style=solid donne des lignes pleines (non pointillées)
    $\begin{pNiceMatrix}[nullify-dots, xdots/line-style=solid]
    a      & b      & 0      &        & \Cdots & 0      \\
    b      & a      & b      & \Ddots &        & \Vdots \\
    0      & b      & a      & \Ddots &        &        \\
           & \Ddots & \Ddots & \Ddots &        & 0      \\
    \Vdots &        &        &        &        & b      \\
    0      & \Cdots &        & 0      & b      & a
    \end{pNiceMatrix}$
    \end{document}
    
    
    On pourrait aussi utiliser code-after ou \CodeAfter et des instructions \draw de TikZ grâce aux nœuds spéciaux créés par nicematrix pour chaque cellule considérée comme non vide (voir The nodes corresponding to the contents of the cells dans le manuel, ou la section correspondante « Les nœuds correspondant aux contenus des cases » dans sa version française).113302
    113304
  • @brian merci beaucoup pour votre message! Ça m'a permis d'écrire le code suivant (il me manquait le "[line-style={}]"):
    A_{i,j} = \begin{pNiceMatrix}
    m_{1,1} &\Cdots &m_{1,j-1} &0 &m_{1,j+1} &\Cdots &m_{1,n} \\
    \Vdots & &\Vdots &\Vdots[line-style={}] &\Vdots & &\Vdots \\
    m_{i-1,1} &\Cdots &m_{i-1,j-1} &0 &m_{i-1,j+1} &\Cdots &m_{i-1,n} \\
    0 &\Cdots[line-style={}] &0 &1 &0 &\Cdots[line-style={}] &0 \\
    m_{i+1,1} &\Cdots &m_{i+1,j-1} &0 &m_{i+1,j+1} &\Cdots &m_{i+1,n} \\
    \Vdots & &\Vdots &\Vdots[line-style={}] &\Vdots & &\Vdots \\
    m_{n,1} &\Cdots &m_{n,j-1} &0 &m_{n,j+1} &\Cdots &m_{n,n}
    \end{pNiceMatrix}
    
    En revanche le résultat est moins élégant que sur mon dessin à la main... je ne suis pas sûr de savoir à quoi c'est dû (j'ai l'impression que les indices des $m$ prennent trop de place). Quel est votre avis?
  • Utilise le bouton code formaté du forum pour poster du code LaTeX. Pour améliorer ta matrice :
    • j'ajoute des espaces verticaux (on manquait d'air !) ;
    • je mets l'option xdots/shorten=4pt pour que les lignes produites par \Cdots, \Ddots et Cie ne soient pas trop collées aux éléments de la matrice.
    Le code n'est pas indenté donc difficile à lire ; je te laisse arranger ça (comme les exemples adaptés du manuel de nicematrix que j'ai postés ci-dessus).
    \documentclass{article}
    \usepackage{tikz}
    \usepackage{nicematrix}
    
    \begin{document}
    $\begin{pNiceMatrix}[xdots/shorten=4pt]
    m_{1,1} &\Cdots &m_{1,j-1} &0 &m_{1,j+1} &\Cdots &m_{1,n} \\[7ex]
    \Vdots & &\Vdots &\Vdots[line-style=solid] &\Vdots & &\Vdots \\
    m_{i-1,1} &\Cdots &m_{i-1,j-1} &0 &m_{i-1,j+1} &\Cdots &m_{i-1,n} \\[1.5ex]
    0 &\Cdots[line-style=solid] &0 &1 &0 &\Cdots[line-style=solid] &0 \\[1.5ex]
    m_{i+1,1} &\Cdots &m_{i+1,j-1} &0 &m_{i+1,j+1} &\Cdots &m_{i+1,n} \\[7ex]
    \Vdots & &\Vdots &\Vdots[line-style=solid] &\Vdots & &\Vdots \\
    m_{n,1} &\Cdots &m_{n,j-1} &0 &m_{n,j+1} &\Cdots &m_{n,n}
    \end{pNiceMatrix}$
    \end{document}
    
    Edit : remplacement de 'line-style={}' par 'line-style=solid'.113306
  • @brian merci! C'est beaucoup mieux!
    Je suis dans le deuxième dessin. J'ai modifié un exemple de la notice de nicematrix pour le réaliser. J'en suis au moment où je dois remplacer $A$ par tous les blocs encadrés (et éventuellement la matrice). Est-ce que je dois remplacer $A$ dans le code par un environnement nicematrix dans lequel je construirai encore des matrices entourées par des \fbox ou \boxed ?
    Si je dois passer par Tkiz, y a-t-il un/des exemples simples que je puisse repiquer sans trop les comprendre (ou en les comprenant vaguement) pour écrire des matrices par blocs ? Je dois avoir fini ça ce soir et je n'ai pas le temps d'apprendre Tkiz d'ici là ; j'ai ces trois dessins à faire (le premier étant réglé) et d'autres matrices mais qui sont juste diagonales par blocs (avec les blocs entourés par des rectangles ayant leurs sommets "adjacents"), donc un même code suffirait pour les matrices restantes.
    Et je commencerai Tikz dans une semaine (mais d'ici là je n'aurai plus rien à taper; ouf !).

    Voici mon code.
    \documentclass{article}
    \usepackage{tikz}
    \usepackage{nicematrix}
    
    $$M = \begin{pNiceArray}{CCCCCCC|C}[margin]
    a_1 &0 &\Cdots & & & &0 &u\\
    \hline
    \Block{7-7}{A} & & & & & & &v a_2 \\
    & & & & & & &v a_3 \\
    & & & & & & &\Vdots \\
    & & & & & & & \\
    & & & & & & & \\
    & & & & & & & \\
    & & & & & & &v a_n
    \end{pNiceArray}$$
    
  • Il faut utiliser une police à chasse fixe dans l'éditeur de texte et aligner les &, sinon c'est illisible... Également, utiliser
    \[ formule display \]
    
    plutôt que
    $$ formule display $$
    
    avec LaTeX (LaTeX n'est pas plain TeX). Voici tes blocs carrés :
    \documentclass{article}
    \usepackage{tikz}
    \usepackage{nicematrix}
    
    \begin{document}
    
    % Si la version de nicematrix est < 5.0, utiliser le type de colonne C.
    \[ M = \begin{pNiceArray}{ccccc !{\hspace{0.05em}} | c}[
        margin, create-large-nodes, create-medium-nodes,
        code-after={%
          \begin{tikzpicture}[nodes={draw, inner sep=0}]
            \coordinate (A0) at
              ([shift={(-\arraycolsep, \arraycolsep)}] 2-1.north west);
            \coordinate (A1) at (3-2-large.south east);
            \draw (A0) rectangle (A1);
            %
            \coordinate (A2) at
              ([xshift=\arraycolsep] 4-3-large.south -| 4-3.east);
            \draw (A1) rectangle (A2);
            %
            \coordinate (A3) at
              ([shift={(-0.5\arraycolsep, 0.5\arraycolsep)}]
               7-5-large.north -| 7-5-medium.west);
            \coordinate (A4) at
              ([shift={(0.5\arraycolsep, -0.5\arraycolsep)}]
               7-5-medium.south east);
            \draw (A3) rectangle (A4);
            \draw (A2) -- (A3);
          \end{tikzpicture}%
        }]
    a_1 & 0 & \Cdots & \Hspace*{4em} & 0        & u       \\[1ex]
    \hline \noalign{\kern 1.7ex}
    0   & 1 &        &               &          & v a_2   \\
    1   & 0 &        &               &          & v a_3   \\
        &   & N_1    &               &          & \Vdots  \\
                                                          \\[7ex]
                                                          \\
        &   &        &               & N_{p+1}  & v a_n
    \end{pNiceArray} \]
    
    \end{document}
    
    Si la ligne oblique ne doit pas partir exactement des coins, tu peux utiliser des 'shift' , 'xshift' ou 'yshift' comme dans mon code, entre crochets après la parenthèse ouvrante qui démarre les coordonnées d'un point.

    Plutôt que d'ajouter des colonnes vides, utilise des choses comme \Hspace*{4em} (voir mon code). Idem pour les lignes avec \\[1ex] par exemple (mais ça joue sur les limites des cellules, donc j'ai quand même laissé certaines lignes vides).113320
  • Voici la deuxième matrice avec le $\begin{pmatrix}
    x & y\\
    z & t
    \end{pmatrix}$ bizarre, le gros zéro en bas à gauche et quelques petites améliorations d'ordre esthétique :
    \documentclass{article}
    \usepackage{tikz}
    \usetikzlibrary{decorations.pathreplacing, calligraphy, tikzmark}
    \usepackage{nicematrix}
    
    % Fait comprendre à nicematrix qu'une cellule est non vide (on peut supprimer
    % cette ligne si nicematrix 5.6 ou supérieur est chargé).
    \providecommand*{\NotEmpty}{\kern 1sp }% Espace intentionnel
    
    \newcommand*{\marqueCoeff}[2][2pt]{\tikzmarknode[inner sep=#1]{noeud #2}{#2}}
    
    \begin{document}
    
    % Si la version de nicematrix est < 5.0, utiliser le type de colonne C.
    \[ M = \begin{pNiceArray}{cccrc !{\hspace{0.05em}} | c}[
        name=mat, margin, create-large-nodes, create-medium-nodes, xdots/shorten=7pt,
        code-after={%
          \begin{tikzpicture}
            \coordinate (A0) at
              ([shift={(-\arraycolsep, \arraycolsep)}] 2-1.north west);
            \coordinate (A1) at (3-2-large.south east);
            \draw (A0) rectangle (A1);
            %
            \coordinate (A2) at
              ([xshift=\arraycolsep] 4-3-large.south -| 4-3.east);
            \draw (A1) rectangle (A2);
            %
            \coordinate (A3) at
              ([shift={(-0.5\arraycolsep, 0.5\arraycolsep)}]
               7-5-large.north -| 7-5-medium.west);
            \coordinate (A4) at ([xshift=0.5\arraycolsep] 7-5-medium.south east);
            \draw (A3) rectangle (A4);
            \draw (A2) -- (A3);
            %
            \begin{scope}[
              every path/.append style={
                draw, decorate,
                decoration={calligraphic curved parenthesis, amplitude=0.2em}}
              ]
              \path[decoration=mirror] (noeud x.north west) -- (noeud z.south west);
              \path                    (noeud y.north east) -- (noeud t.south east);
            \end{scope}
            \node at (barycentric cs:mat-4-1=1.8,mat-7-1=1.5,mat-7-6=1) {\Huge $0$};
          \end{tikzpicture}%
        }]
    a_1       & 0 & \Cdots & \Hspace*{4em}   & 0                 & u       \\[1ex]
    \hline \noalign{\kern 1.7ex}
    0         & 1 &        & \marqueCoeff{x} & \marqueCoeff{y}   & v a_2   \\
    1         & 0 &        & \marqueCoeff{z} & \marqueCoeff{t}   & v a_3   \\
    \NotEmpty     &        & \vrule width 0pt height 2ex depth 1ex \relax
                    N_1    &                 &                   & \Vdots  \\
                                                                           \\[7ex]
                                                                           \\
    \NotEmpty &   &        &                 & \vrule width 0pt
                                                      height 2.2ex
                                                      depth  2ex \relax
                                               N_{p+1}           & v a_n
    \end{pNiceArray} \]
    
    \end{document}
    
    113328
  • J'ai légèrement modifié mon message ci-dessus concernant la première matrice : pour obtenir des lignes non pointillées, 'line-style=solid' semble un peu plus propre que 'line-style={}'. La technique est documentée dans le manuel de nicematrix à la section Des lignes pointillées qui ne sont plus pointillées.
  • @brian d'accord. Je suppose qu'il faut faire la même modification en 'line-style=solid' pour la troisième matrice que vous avez postée (c'est-à-dire la première matrice de mon dessin)?

    Je crois que je commence à comprendre (un peu) votre code pour la deuxième matrice. Je vais essayer de l'adapter pour une matrice diagonale par blocs "simple" (juste avec des blocs diagonaux encadrés) et après il faudra que je vois pour Sarrus (mais là je n'ai aucune idée :-( ).

    De plus, devrais-je selon vous changer tous les environnements de type "matrix" de mon document en environnements de type "nicematrix"?

    Merci pour toutes les réponses que vous m'avez déjà apportées! Elles m'aident beaucoup!
  • Pour le 'line-style=solid' : oui.
    De plus, devrais-je selon vous changer tous les environnements de type "matrix" de mon document en environnements de type "nicematrix"?
    A priori non, je ne vois pas pourquoi. Sauf si tu as des paramètres globaux nicematrix que tu veux utiliser partout, bien sûr. En fait, nicematrix a une option renew-matrix qui redéfinit les environnements matrix et Cie d'amsmath pour se comporter comme NiceMatrix et Cie (voir deuxième point de Comment créer les lignes en pointillés de manière transparente dans le manuel).

    Pour le Sarrus, ça n'a pas l'air très compliqué. Fais la matrice sans flèches ni les plus et moins entourés et je te montrerai comment ajouter ces petites choses. On peut rester avec nicematrix, il faudra juste s'assurer de laisser un peu d'espace à droite pour tenir compte des décorations. Petit bricolage donc dans ce cas, mais sans doute acceptable (sinon, comme je l'ai dit, on pourrait utiliser une matrice TikZ mais le désavantage, c'est que ça se met dans une tikzpicture qui se comporte comme une image, donc la matrice est utilisée dans une équation, il faut baisser la tikzpicture de la moitié de sa hauteur ou jouer sur son paramètre 'baseline' afin d'obtenir un bon placement vertical).
  • @brian c'est d'accord merci. Du coup je finirai par les matrices par blocs et voici mon début pour Sarrus (par contre je ne sais pas si le code que j'ai fait est "le plus esthétique" qui soit).
    \documentclass{article}
    \usepackage{nicematrix}
    
    \begin{document}
    
    \[ \begin{NiceMatrix}
      &  &  &\hspace*{0.1cm} \color{green}{-} \\
    a &b &c &\hspace*{0.1cm} \color{green}{-} \\
    d &e &f &\hspace*{0.1cm} \color{green}{-} \\
    g &h &i & \\
    a &b &c &\hspace*{0.1cm} \color{green}{+} \\
    d &e &f &\hspace*{0.1cm} \color{green}{+} \\
      &  &  &\hspace*{0.1cm} \color{green}{+}
    \end{NiceMatrix} \]
    
    \end{document}
    
  • Bon, il faut que j'aille manger mais je t'ai préparé Sarrus avec une matrice TikZ :
    \documentclass{article}
    \usepackage{tikz}
    \usetikzlibrary{matrix}
    
    \begin{document}
    
    \begin{tikzpicture}
    \matrix (M) [matrix of math nodes]
      { a & b & c\\
        d & e & f\\
        g & h & i\\
        a & b & c\\
        d & e & f\\
      };
    
    \colorlet{sarruslines}{green!80!black}
    \begin{scope}[
      draw=sarruslines,
      fleche/.style n args={4}{
        ->, insert path={
          (#1) -- (#2)
          node[circle, draw, very thin, inner sep=0pt, outer sep=1.5pt,
               color=sarruslines, font=\tiny, #4] {$#3$}},
      }]
      \foreach \depart/\arrivee/\signe/\decalage in {%
          M-3-1.south west/M-1-3.north east/-/above right,
          M-4-1.south west/M-2-3.north east/-/above right,
          M-1-1.north west/M-3-3.south east/+/below right%
        }
      {
        \draw[fleche={\depart}{\arrivee}{\signe}{\decalage}];
      }
    \end{scope}
    \end{tikzpicture}
    
    \end{document}
    
    Il n'y a plus qu'à rajouter des lignes comme celles-ci dans le \foreach :
    M-3-1.south west/M-1-3.north east/-/above right,
    M-4-1.south west/M-2-3.north east/-/above right,
    
    113334
  • @brian voilà ce que donne le code.
    \documentclass{article}
    \usepackage{tikz}
    \usetikzlibrary{matrix}
    
    \begin{document}
    
    \begin{tikzpicture}
    \matrix (M) [matrix of math nodes]
      { a & b & c\\
        d & e & f\\
        g & h & i\\
        a & b & c\\
        d & e & f\\
      };
    
    \colorlet{sarruslines}{green!80!black}
    \begin{scope}[
      draw=sarruslines,
      fleche/.style n args={4}{
        ->, insert path={
          (#1) -- (#2)
          node[circle, draw, very thin, inner sep=0pt, outer sep=1.5pt,
               color=sarruslines, font=\tiny, #4] {$#3$}},
      }]
      \foreach \depart/\arrivee/\signe/\decalage in {%
          M-3-1.south west/M-1-3.north east/-/above right,
          M-4-1.south west/M-2-3.north east/-/above right,
          M-5-1.south west/M-3-3.north east/-/above right,
          M-1-1.north west/M-3-3.south east/+/below right,
          M-2-1.north west/M-4-3.south east/+/below right,
          M-3-1.north west/M-5-3.south east/+/below right%
        }
      {
        \draw[fleche={\depart}{\arrivee}{\signe}{\decalage}];
      }
    \end{scope}
    \end{tikzpicture}
    
    \end{document}
    

    Merci beaucoup, j'ai compris comment était le placement dans cet exemple!
    Je n'arrive pas bien à voir, mais j'ai l'impression que les - et les + ne sont pas alignés sur une même verticale. Est-ce gênant? Et est-ce que si on modifie le code pour qu'ils soient alignés, ce sont les flèches qui ne seront plus alignées (elles ont l'air d'être alignées)?

    En attendant je vais commencer la matrice diagonale par blocs avec blocs encadrés (et peut-être qu'à un moment moi aussi j'irai manger :-) ).

    Bon appétit et merci!
  • @brian à mon tour de manger :-)

    Je me mettrai à la matrice diagonale par blocs en revenant. En attendant j'ai essayé de modifier le code de Sarrus pour avoir un alignement vertical des symboles + et - (ainsi que des débuts et des pointes des flèches).
    \documentclass{article}
    \usepackage{tikz}
    \usetikzlibrary{matrix}
    
    \begin{document}
    
    \[ \begin{tikzpicture}
    \matrix (M) [matrix of math nodes]
      { &  &  &\hspace*{0.02cm} \color{green}{-} \\
    a &b &c &\hspace*{0.02cm} \color{green}{-} \\
    d &e &f &\hspace*{0.02cm} \color{green}{-} \\
    g &h &i & \\
    a &b &c &\hspace*{0.01cm} \color{green}{+} \\
    d &e &f &\hspace*{0.01cm} \color{green}{+} \\
      &  &  &\hspace*{0.01cm} \color{green}{+} \\
      };
    
    \colorlet{sarruslines}{green!80!black}
    \begin{scope}[
      draw=sarruslines,
      fleche/.style n args={3}{
        ->, insert path={
          (#1) -- (#2)
          node[circle, draw, very thin, inner sep=0pt, outer sep=1.5pt,
               color=sarruslines, font=\tiny,] {$#3$}},
      }]
      \foreach \depart/\arrivee/\signe in {%
          M-4-1.south west/M-1-4/\hspace*{1.5em},
          M-5-1.south west/M-2-4/\hspace*{1.5em},
          M-6-1.south west/M-3-4/\hspace*{1.5em},
          M-2-1.north west/M-5-4/\hspace*{1.5em},
          M-3-1.north west/M-6-4/\hspace*{1.5em},
          M-4-1.north west/M-7-4/\hspace*{1.5em}%
        }
      {
        \draw[fleche={\depart}{\arrivee}{\signe}];
      }
    \end{scope}
    \end{tikzpicture} \]
    
    \end{document}
    

    Est-ce que ça marche?
  • Voilà comment régler le problème d'alignement : on impose une abscisse commune pour la pointe de chaque flèche, celle de M.east (M étant le nœud correspondant à la matrice toute entière). Idem pour la colonne de gauche, même si le problème est moins visible du fait de ses coefficients. Je mets 'inner sep=0' pour la matrice, sinon elle a une bordure invisible qui prend de la place. Afin d'assurer un parallélisme pour les lignes qui vont bien, je mets :
    text height=1ex, text depth=0.3ex
    
    pour tous les noeuds de la matrice (ceux qui contiennent chacun un coefficient).
    \documentclass{article}
    \usepackage{tikz}
    \usetikzlibrary{matrix}
    
    \begin{document}
    
    \begin{tikzpicture}
    \matrix (M) [
      inner sep=0, matrix of math nodes,
      nodes={inner sep=1ex, text height=1ex, text depth=0.3ex}]
      { a & b & c\\
        d & e & f\\
        g & h & i\\
        a & b & c\\
        d & e & f\\
      };
    
    \colorlet{sarruslines}{green!80!black}
    \begin{scope}[
      draw=sarruslines,
      fleche/.style n args={4}{
        ->,
        insert path={
          (M.west |- #1) -- (M.east |- #2)
          node[circle, draw, very thin, inner sep=0pt, outer sep=1.5pt,
               color=sarruslines, font=\tiny, #4] {$#3$}
        },
      }]
      \foreach \depart/\arrivee/\signe/\decalage in {%
          M-3-1.south west/M-1-3.north east/-/above right,
          M-4-1.south west/M-2-3.north east/-/above right,
          M-5-1.south west/M-3-3.north east/-/above right,
          M-1-1.north west/M-3-3.south east/+/below right,
          M-2-1.north west/M-4-3.south east/+/below right,
          M-3-1.north west/M-5-3.south east/+/below right%
        }
      {
        \draw[fleche={\depart}{\arrivee}{\signe}{\decalage}];
      }
    \end{scope}
    \end{tikzpicture}
    
    \end{document}
    
    Si tu ajoutes l'option 'draw' dans :
    nodes={inner sep=1ex, text height=1ex, text depth=0.3ex}
    
    tu vas voir le contour de chaque nœud-créé-pour-une-cellule(*), ce qui est bien utile pour analyser ce genre de problème (cf. deuxième capture d'écran).

    (*) Ces nœuds sont automatiquement créés du fait de l'utilisation de 'matrix of math nodes'.113340
    113342
  • @brian c'est noté. Je vais voir si j'arrive à modifier votre code pour faire une matrice diagonale par blocs et après normalement tout est bon ^^!

    Que signifient les "\arraycolsep" dans votre code (et quel est leur effet sur le "shift")?
  • @brian Voici ce que j'ai réussi à faire. Le premier code est inspiré du votre, mais comme je n'ai sans doute pas compris certaines parties du code je les ai éliminées et les cadres sont trop serrés autour des $A$ (et les pointillés sont trop petits). Le second est fait sans Tikz mais les cadres débordent sur les parenthèses.

    Premier code.
    \documentclass{article}
    \usepackage{tikz}
    \usepackage{nicematrix}
    
    \begin{document}
    \[ M = \begin{pNiceMatrix}[
        margin, create-large-nodes, create-medium-nodes,
        code-after={%
          \begin{tikzpicture}[nodes={draw, inner sep=0}]
            \coordinate (A0) at
              (1-1.north west);
            \coordinate (A1) at (1-1.south east);
            \draw (A0) rectangle (A1);
            %
            \coordinate (A2) at
              (4-4.north west);
            \coordinate (A3) at
              (4-4.south east);
            \draw (A2) rectangle (A3);
            \draw[dotted] (A1) -- (A2);
          \end{tikzpicture}%
        }]
    A_1                     &   &\Block{2-2}<\LARGE>{(*)} & \\
                            &   &                       & \\
    \Block{2-2}<\LARGE>{(0)}  &   &                       & \\
                            &   &                       &A_k
    \end{pNiceMatrix} \]
    \end{document}
    

    Second code.
    \documentclass{article}
    \usepackage{tikz}
    \usepackage{nicematrix}
    
    \begin{document}
    \[ M = \begin{pNiceMatrix} \boxed{A_1}                     &   &\Block{2-2}<\LARGE>{(*)} & \\
                            &\Ddots   &                       & \\
    \Block{2-2}<\LARGE>{(0)}  &   &                       & \\
                            &   &                       &\boxed{A_k}
    \end{pNiceMatrix} \]
    \end{document}
    
    Quelle est la bonne solution ?
  • C'est pas mal ! Dans le second, c'est surtout l'option 'margin' de nicematrix qui te manquait. Pour le premier, il y a pas mal de façons de faire ; j'utilise cette petite commande :
    \newcommand*{\monBloc}[1]{%
      \makebox[2em]{$\m@th\vrule width 0pt height 2.5ex depth 1ex \relax #1$}%
    }
    
    pour m'assurer que les deux blocs ont les mêmes dimensions et qu'elles sont suffisantes. Ne t'occupe pas du \m@th : c'est pour des situations un peu tordues où TeX est réglé pour mettre automatiquement une espace horizontale au début et à la fin de chaque formule mathématique en ligne pour être sûr qu'on les distingue du texte (vieille typographie...). En dehors de cette situation, ça ne change rien (i.e., \mathsurround vaut 0pt par défaut). Premier code :
    \documentclass{article}
    \usepackage{tikz}
    \usepackage{nicematrix}
    
    \makeatletter
    \newcommand*{\monBloc}[1]{%
      \makebox[2em]{$\m@th\vrule width 0pt height 2.5ex depth 1ex \relax #1$}%
    }
    \makeatother
    
    \begin{document}
    \[ M = \begin{pNiceMatrix}[
        margin,
        code-after={%
          \begin{tikzpicture}
            \coordinate (A0) at (1-1.north west);
            \coordinate (A1) at (1-1.south east);
            \draw (A0) rectangle (A1);
            %
            \coordinate (A2) at (4-4.north west);
            \coordinate (A3) at (4-4.south east);
            \draw (A2) rectangle (A3);
            \draw[dotted] (A1) -- (A2);
          \end{tikzpicture}%
        }]
    \monBloc{A_1}            & & \Block{2-2}<\Large>{(*)} &              \\
                                                                         \\
    \Block{2-2}<\Large>{(0)}                                             \\
                             & &                          & \monBloc{A_k}
    \end{pNiceMatrix} \]
    \end{document}
    
    Edit : suppression de nodes={draw, inner sep=0} ainsi que de 'create-large-nodes' et 'create-medium-nodes', qui ne sont pas utilisés ici.

    Deuxième code :
    \documentclass{article}
    \usepackage{tikz}
    \usepackage{nicematrix}
    
    \begin{document}
    \[ M =
       \begin{pNiceMatrix}[margin]
         \boxed{A_1} &             & \Block{2-2}<\Large>{(*)}               \\
                                   & \Ddots                                 \\
         \Block{2-2}<\Large>{(0)}                                           \\
                                   &   &                      & \boxed{A_k}
       \end{pNiceMatrix}
    \]
    \end{document}
    
    Note : techiquement, les deux méthodes utilisent TikZ car nicematrix s'appuie fortement dessus.113346
    113348
    1.png 42.6K
    2.png 44.4K
  • Pour arranger les pointillés dans le premier cas, tu peux utiliser ceci :
    thick, circle dotted=0.5pt
    
    avec le style 'circle dotted' défini ci-dessous (le 'dotted' de base fait des petits rectangles, ce n'est pas très joli).
    \documentclass{article}
    \usepackage{tikz}
    \usepackage{nicematrix}
    
    \makeatletter
    \newcommand*{\monBloc}[1]{%
      \makebox[2em]{$\m@th\vrule width 0pt height 2.5ex depth 1ex \relax #1$}%
    }
    \makeatother
    
    \begin{document}
    \[ M = \begin{pNiceMatrix}[
        margin,
        code-after={%
          \begin{tikzpicture}[
              circle dotted/.style={
                dash pattern=on 0mm off 1.5mm, dash phase=#1, line cap=round,
              },
              circle dotted/.default=0pt,
            ]
            \coordinate (A0) at (1-1.north west);
            \coordinate (A1) at (1-1.south east);
            \draw (A0) rectangle (A1);
            %
            \coordinate (A2) at (4-4.north west);
            \coordinate (A3) at (4-4.south east);
            \draw (A2) rectangle (A3);
            \draw[thick, circle dotted=0.5pt] (A1) -- (A2);
          \end{tikzpicture}%
        }]
    \monBloc{A_1}            & & \Block{2-2}<\Large>{(*)} &              \\
                                                                         \\
    \Block{2-2}<\Large>{(0)}                                             \\
                             & &                          & \monBloc{A_k}
    \end{pNiceMatrix} \]
    \end{document}
    
    Edit : 'create-large-nodes' et 'create-medium-nodes' également supprimés ici, car non utilisés.113352
  • Bonsoir,

    Je me suis mis à Tikz, et j'ai finalement réussi à faire quelques "jolis" dessins matrices. Je n'ai cependant pas trouvé de solution pour une matrice par bloc, que voici:
    \documentclass{article}
    \usepackage{amsmath}
    \usepackage{amsfonts}
    \usepackage{amssymb}
    \usepackage{stmaryrd}
    \usepackage{graphicx}
    \usepackage{mathtools}
    \usepackage[define-L-C-R]{nicematrix}
    \usepackage{amsthm}
    \usepackage{float}
    \usepackage[francais]{babel}
    \usepackage{array}
    \usepackage{graphicx}
    \usepackage{xcolor}
    \usepackage{tikz}
    \usetikzlibrary{decorations.pathreplacing, calligraphy, tikzmark, matrix}
    
    \makeatletter
    \newcommand*{\monBloc}[1]{%
      \makebox[2em]{$\m@th\vrule width 0pt height 2.5ex depth 1ex \relax #1$}%
    }
    \makeatother
    
    \setcounter{MaxMatrixCols}{20}
    
    \begin{document}
    
    \[ \begin{vNiceMatrix}[
        margin,
        code-after={%
          \begin{tikzpicture}[
              circle dotted/.style={
                dash pattern=on 0mm off 1.5mm, dash phase=#1, line cap=round,
              },
              circle dotted/.default=0pt,
            ]
            \coordinate (A0) at (1-1-block.north west);
            \coordinate (A1) at (3-11.south east);
            \draw (A0) rectangle (A1);
          \end{tikzpicture}%
        }]
    \Block{3-11}{\left( \frac{\beta_n - \beta_j}{(\alpha_i + \beta_j)(\alpha_i + \beta_n)} \right)_{1 \leqslant i,j \leqslant n-1}} & & & & & & & & & & &\monBloc{(*)}  \\ 
    & & & & & & & & & & & \\ 
    & & & & & & & & & &\NotEmpty & \\ 
    0 & \Cdots[line-style=solid] & & & & & & & & & 0 &1
    \end{vNiceMatrix} \]
    
    \end{document}
    

    Je cherche à faire un "beau" cadre autour de mon bloc, tel que les bords gauche et droite soient alignés avec les zéros qui sont dessous, et tel que le cadre ne sorte pas du déterminant. Quelqu'un voit-il comment faire?

    @brian cette fois j'ai vérifié, normalement mon code compile bien ;-)113836
  • Oui, ça compile mais ce n'est pas minimal ! X:-( Tu pouvais supprimer plein de lignes \usepackage ainsi que la définition du style 'circle dotted', non utilisé par ton code. Voici une solution construite à partir de ce dernier :
    \documentclass{article}
    \usepackage{amssymb}
    \usepackage{nicematrix}
    \usepackage{tikz}
    \usetikzlibrary{fit}
    
    \begin{document}
    
    \[ \left|
       \begin{NiceArray}{c W{c}{3cm} cc}[
        margin, create-medium-nodes,
        code-after={%
          \begin{tikzpicture}
            \node[draw, inner sep=0, fit=(1-1-block-medium)] {};
          \end{tikzpicture}%
        }]
    \NotEmpty \vrule width 0pt height 0ex depth 4ex\relax
    \Block{2-3}{%
      \Bigl( \frac{\beta_n - \beta_j}{(\alpha_i + \beta_j)(\alpha_i + \beta_n)}
      \Bigr)_{1 \leqslant i, j \leqslant n-1}} & & & (*) \\
    \\
    0 & \Cdots[line-style=solid] & 0 & 1
    \end{NiceArray} \right| \]
    
    \end{document}
    
    En voici une assez différente sans nicematrix, qui n'utilise que deux colonnes. Le '\leaders\hrule ... \hfill' se comporte comme un \hfill au niveau de la largeur : il remplit l'espace horizontal restant dans la cellule.
    \documentclass{article}
    \usepackage{amsmath}
    \usepackage{amssymb}
    \usepackage{array}
    
    \begin{document}
    
    \[ \delimitershortfall=0pt \delimiterfactor=1000
       \left| \begin{array}{cc}
    \boxed{
      \biggl(
        \frac{\beta_n - \beta_j}{(\alpha_i + \beta_j)(\alpha_i + \beta_n)}
      \biggr)_{1 \leqslant i, j \leqslant n-1}
     }                                                 & (*) \\[3.5ex]
    % \fontdimen22\textfont2 = axis height
    0 \; \leaders\hrule height \dimexpr  \fontdimen22\textfont2 + 0.2pt \relax
                        depth  \dimexpr -\fontdimen22\textfont2 + 0.2pt \relax
                  \hfill \; 0                          & 1 \\ \noalign{\kern-0.7ex}
    \end{array} \right| \]
    
    \end{document}
    
    Pour comprendre pourquoi les délimiteurs « barre verticale » n'ont pas toujours exactement la hauteur attendue, il faut lire le TeXbook p. 152 (cf. dernière image ci-dessous) et savoir que les hauteurs des délimiteurs extensibles forment une partie discrète de $\R$, car ce sont des glyphes d'une police mathématique qui sont empilés jusqu'à avoir la plus petite hauteur satisfaisant le critère défini par \delimitershortfall et \delimiterfactor (j'en ai un peu parlé à la fin de ce message ; les valeurs par défaut de ces deux paramètres sont plutôt adaptées aux parenthèses, dont on ne veut pas qu'elles soient tout à fait aussi hautes que le contenu, en général). Pour obtenir automatiquement des lignes verticales « bien ajustées », on peut remplacer les délimiteurs par des \vrule, un avant et l'autre après la matrice, comme dans l'exemple suivant. C'est plus simple, mais les espacements horizontaux avant et après ne sont pas tout à fait les mêmes qu'avec des délimiteurs.
    \documentclass{article}
    \usepackage{amsmath}
    \usepackage{amssymb}
    \usepackage{array}
    
    \begin{document}
    
    \[ \vrule \begin{array}{cc}
    \boxed{
      \biggl(
        \frac{\beta_n - \beta_j}{(\alpha_i + \beta_j)(\alpha_i + \beta_n)}
      \biggr)_{1 \leqslant i, j \leqslant n-1}
     }                                                 & (*) \\[3.5ex]
    % \fontdimen22\textfont2 = axis height
    0 \; \leaders\hrule height \dimexpr  \fontdimen22\textfont2 + 0.2pt \relax
                        depth  \dimexpr -\fontdimen22\textfont2 + 0.2pt \relax
                  \hfill \; 0                          & 1 \\ \noalign{\kern-0.7ex}
    \end{array} \vrule \]
    
    \end{document}
    
    113842
    113854
    113856
    113858
  • Bonjour,

    Parmi les figures que j'essaye de faire avec Tikz, il y a une "amélioration" de la règle de Sarrus (le dessin avec les flèches et les signes "+" et "-"). L'idée est d'afficher à côté des symboles $+$ et $-$ le produit des trois nombres concernés. J'ai réussi à obtenir un code qui compile (c'est déjà ça ^^) en modifiant le code proposé par Brian. Voici le code modifié:
    \documentclass{article}
    \usepackage{tikz}
    \usetikzlibrary{matrix}
    
    \begin{document}
    
    \[ \begin{tikzpicture}
    \matrix (M) [
      inner sep=0, matrix of math nodes,
      nodes={inner sep=1ex, text height=1ex, text depth=0.3ex}]
      { a & b & c\\
        c & a & b\\
        b & c & a\\
        a & b & c\\
        c & a & b\\
      };
    
    \colorlet{sarruslines}{red!80!black}
    \begin{scope}[
      draw=sarruslines,
      fleche/.style n args={5}{
        ->,
        insert path={
          (M.west |- #1) -- (M.east |- #2)
          node[circle, draw, very thin, inner sep=0pt, outer sep=1.5pt,
               color=sarruslines, font=\tiny, #4] {$#3$}
        },
      }]
      \foreach \depart/\arrivee/\signe/\decalage/\texte in {%
          M-3-1.south west/M-1-3.north east/-/above right/$abc$,
          M-4-1.south west/M-2-3.north east/-/above right/$abc$,
          M-5-1.south west/M-3-3.north east/-/above right/$abc$,
          M-1-1.north west/M-3-3.south east/+/below right/$a^3$,
          M-2-1.north west/M-4-3.south east/+/below right/$c^3$,
          M-3-1.north west/M-5-3.south east/+/below right/$b^3$%
        }
      {
        \draw[fleche={\depart}{\arrivee}{\signe}{\decalage}]; \node[text width=0.7cm,font=\small, align=right,\decalage] at (\arrivee) {\texte};
      }
    \end{scope}
    \end{tikzpicture} \]
    
    \end{document}
    

    Dans cet exemple, les $abc$, $a^3$, $b^3$ et $c^3$ ne sont pas sur la même ligne horizontale que les signes $+$ et $-$ (les $abc$ sont légèrement au-dessus et les cubes sont très en dessous).
    Comment modifier le code pour obtenir le résultat voulu? J'ai essayé des trucs comme "M-5-3.south east.below right.right" pour qu'il place le texte à droite du signes "+" (qui lui est situé en "M-5-3.south east.below right")... sauf qu'évidemment ça ne marche pas. Quelle est la bonne solution?114058
  • Excellent exemple complet minimal ! (tu)

    Ton code donne lieu à une erreur assez méchante :
    (\end occurred when \ifx on line 39 was incomplete)
    
    (6 fois). C'est parce que tu as modifié le style 'fleche' pour prendre 5 arguments :
    fleche/.style n args={5}{...}
    
    mais tu n'en passes que 4 :
    \draw[fleche={\depart}{\arrivee}{\signe}{\decalage}];
    
    Ton style 'fleche' mange donc le lexème (token) qui suit dans le flux d'entrée de TeX. Vu le message d'erreur, il doit s'agit d'un \fi à chaque fois (dans ce document particulier). Tu as eu de la chance, si j'ose dire, que ça ne perturbe pas davantage la compilation.

    Une fois ceci corrigé, on peut simplifier un peu en enlevant les 'west' et 'east' inutilisés depuis que j'ai fixé l'abscisse pour le début et la fin de chaque flèche :
      \foreach \depart/\arrivee/\signe/\decalage/\texte in {%
          M-3-1.south/M-1-3.north/-/above right/$abc$,
          M-4-1.south/M-2-3.north/-/above right/$abc$,
          M-5-1.south/M-3-3.north/-/above right/$abc$,
          M-1-1.north/M-3-3.south/+/below right/$a^3$,
          M-2-1.north/M-4-3.south/+/below right/$c^3$,
          M-3-1.north/M-5-3.south/+/below right/$b^3$%
        }
      { ... }
    
    Enfin, on peut s'attaquer au problème qui te préoccupe en passant l'option 'draw' au nœud que tu as ajouté pour bien voir ses contours et comment il est positionné. Je te laisse faire le test. La conjonction du \decalage en option et du 'at (\arrivee)' est responsable du placement que tu as constaté. Je te propose 4 solutions (les 1 et 2 sont essentiellement les mêmes).

    1) La plus proche de la tienne : on donne un nom (toujours 'signe' ici, mais il pourrait provenir d'un argument du style 'fleche') au nœud contenant le $+$ ou le $-$, puis on utilise ce nœud, via (signe.east), pour placer celui que tu as ajouté et qui contient les produits :
    \documentclass{article}
    \usepackage{tikz}
    \usetikzlibrary{matrix}
    
    \begin{document}
    
    \[ \begin{tikzpicture}
    \matrix (M) [
      inner sep=0, matrix of math nodes,
      nodes={inner sep=1ex, text height=1ex, text depth=0.3ex}]
      { a & b & c\\
        c & a & b\\
        b & c & a\\
        a & b & c\\
        c & a & b\\
      };
    
    \colorlet{sarruslines}{red!80!black}
    \begin{scope}[
      draw=sarruslines,
      fleche/.style n args={4}{
        ->,
        insert path={
          (M.west |- #1) -- (M.east |- #2)
          node [name=signe,
                circle, draw, very thin, inner sep=0pt, outer sep=1.5pt,
                color=sarruslines, font=\tiny, #4] {$#3$}
        },
      }]
      \foreach \depart/\arrivee/\signe/\decalage/\texte in {%
          M-3-1.south/M-1-3.north/-/above right/$abc$,
          M-4-1.south/M-2-3.north/-/above right/$abc$,
          M-5-1.south/M-3-3.north/-/above right/$abc$,
          M-1-1.north/M-3-3.south/+/below right/$a^3$,
          M-2-1.north/M-4-3.south/+/below right/$c^3$,
          M-3-1.north/M-5-3.south/+/below right/$b^3$%
        }
      {
        \draw[fleche={\depart}{\arrivee}{\signe}{\decalage}];
        \node[draw, text width=0.7cm, font=\small, align=right, anchor=west]
          at (signe.east) {\texte};
      }
    \end{scope}
    \end{tikzpicture} \]
    
    \end{document}
    

    2) Même chose mais avec la bibliothèque TikZ 'positioning' pour placer les nœuds contenant les produits (voir le « right=0em of signe.east » que l'on pourrait aussi écrire « right=0em of signe ») :
    \documentclass{article}
    \usepackage{tikz}
    \usetikzlibrary{matrix, positioning}
    
    \begin{document}
    
    \[ \begin{tikzpicture}
    \matrix (M) [
      inner sep=0, matrix of math nodes,
      nodes={inner sep=1ex, text height=1ex, text depth=0.3ex}]
      { a & b & c\\
        c & a & b\\
        b & c & a\\
        a & b & c\\
        c & a & b\\
      };
    
    \colorlet{sarruslines}{red!80!black}
    \begin{scope}[
      draw=sarruslines,
      fleche/.style n args={4}{
        ->,
        insert path={
          (M.west |- #1) -- (M.east |- #2)
          node [name=signe,
                circle, draw, very thin, inner sep=0pt, outer sep=1.5pt,
                color=sarruslines, font=\tiny, #4] {$#3$}
        },
      }]
      \foreach \depart/\arrivee/\signe/\decalage/\texte in {%
          M-3-1.south/M-1-3.north/-/above right/$abc$,
          M-4-1.south/M-2-3.north/-/above right/$abc$,
          M-5-1.south/M-3-3.north/-/above right/$abc$,
          M-1-1.north/M-3-3.south/+/below right/$a^3$,
          M-2-1.north/M-4-3.south/+/below right/$c^3$,
          M-3-1.north/M-5-3.south/+/below right/$b^3$%
        }
      {
        \draw[fleche={\depart}{\arrivee}{\signe}{\decalage}];
        \node[draw, text width=0.7cm, font=\small, align=right,
              right=0em of signe.east] {\texte};
      }
    \end{scope}
    \end{tikzpicture} \]
    
    \end{document}
    

    3) On peut créer le nœud additionnel grâce à la clé /tikz/label utilisée comme option du nœud contenant le signe $+$ ou $-$ (voir The Label Option dans le manuel de TikZ & PGF) :
    \documentclass{article}
    \usepackage{tikz}
    % 'babel' : pour le cas où le ':' serait actif (souvent en français)
    \usetikzlibrary{babel, matrix}
    
    \begin{document}
    
    \[ \begin{tikzpicture}
    \matrix (M) [
      inner sep=0, matrix of math nodes,
      nodes={inner sep=1ex, text height=1ex, text depth=0.3ex}]
      { a & b & c\\
        c & a & b\\
        b & c & a\\
        a & b & c\\
        c & a & b\\
      };
    
    \colorlet{sarruslines}{red!80!black}
    \begin{scope}[
      draw=sarruslines,
      fleche/.style n args={5}{
        ->,
        insert path={
          (M.west |- #1) -- (M.east |- #2)
          node [name=signe,
                circle, draw, very thin, inner sep=0pt, outer sep=1.5pt,
                color=sarruslines, font=\tiny,
                label={[blue, draw, text width=1.5em, align=right]right:#5}, #4]
            {\hfill $#3$}
        },
      }]
      \foreach \depart/\arrivee/\signe/\decalage/\texte in {%
          M-3-1.south/M-1-3.north/-/above right/$abc$,
          M-4-1.south/M-2-3.north/-/above right/$abc$,
          M-5-1.south/M-3-3.north/-/above right/$abc$,
          M-1-1.north/M-3-3.south/+/below right/$a^3$,
          M-2-1.north/M-4-3.south/+/below right/$c^3$,
          M-3-1.north/M-5-3.south/+/below right/$b^3$%
        }
      {
        \draw[fleche={\depart}{\arrivee}{\signe}{\decalage}{\texte}];
      }
    \end{scope}
    \end{tikzpicture} \]
    
    \end{document}
    

    4) Enfin, on peut utiliser la macro \textcircled du noyau LaTeX pour tracer le cercle autour de chaque signe $+$ ou $-$ (*). Il est alors très simple de mettre l'annotation dans le même nœud TikZ (j'utilise \makebox avec l'option 'r' pour réaliser l'alignement à droite que tu sembles souhaiter ici) :
    \documentclass{article}
    \usepackage{tikz}
    \usetikzlibrary{matrix}
    
    \begin{document}
    
    \[ \begin{tikzpicture}
    \matrix (M) [
      inner sep=0, matrix of math nodes,
      nodes={inner sep=1ex, text height=1ex, text depth=0.3ex}]
      { a & b & c\\
        c & a & b\\
        b & c & a\\
        a & b & c\\
        c & a & b\\
      };
    
    \colorlet{sarruslines}{red!80!black}
    \begin{scope}[
      draw=sarruslines,
      fleche/.style n args={5}{
        ->,
        insert path={
          (M.west |- #1) -- (M.east |- #2)
          node[scale=0.8, inner sep=0pt, outer sep=1.5pt,
               color=sarruslines, font=\footnotesize, #4]
            {\textcircled{$#3$} \makebox[1.5em][r]{\color{black}$#5$}}
        },
      }]
      \foreach \depart/\arrivee/\signe/\decalage/\texte in {%
          M-3-1.south/M-1-3.north/-/above right/abc,
          M-4-1.south/M-2-3.north/-/above right/abc,
          M-5-1.south/M-3-3.north/-/above right/abc,
          M-1-1.north/M-3-3.south/+/below right/a^3,
          M-2-1.north/M-4-3.south/+/below right/c^3,
          M-3-1.north/M-5-3.south/+/below right/b^3%
        }
      {
        \draw[fleche={\depart}{\arrivee}{\signe}{\decalage}{\texte}];
      }
    \end{scope}
    \end{tikzpicture} \]
    
    \end{document}
    
    Petite variante assez proche :
    fleche/.style n args={5}{
      ->,
      insert path={
        (M.west |- #1) -- (M.east |- #2)
        node[scale=0.8, inner sep=0pt, outer sep=1.5pt, text width=2.5em,
             color=sarruslines, font=\footnotesize, #4]
          {\textcircled{$#3$}\hfill \textcolor{black}{$#5$}}
      },
    }
    
    Je te laisse le soin d'enlever les options 'draw' que j'ai laissées par endroits pour montrer le contour des nœuds contenant les produits.

    (*) Il s'agit alors du caractère 13 d'une police mathématique au codage OMS ; je change la taille en \footnotesize car en \tiny avec les polices mathématiques standard de TeX, le dessin du glyphe est ovoïde.114076
    114078
    114080
    114082
  • Une petite idée pour améliorer la lisibilité : en mettant 'opacity=0.4' au(x) bon(s) endroit(s), tu peux très facilement obtenir des choses comme ci-dessous.

    Note : il existe aussi les clés 'draw opacity', 'fill opacity' et 'text opacity'.114098
    114100
  • @brian merci pour votre réponse!

    Désolé pour mes retours tardifs mais je suis très lent pour taper et je mets du temps à écrire mes réponses donc il faut que je trouve des créneaux pour le faire (et avec les cours à distances, les devoirs, ce que je tape déjà en tex et le reste ça n'est pas évident).

    Bref j'ai utilisé votre réponse pour faire les codes suivants:
    \documentclass{article}
    \usepackage{amsmath}
    \usepackage{amsthm}
    \usepackage{amssymb}
    \usepackage{tikz}
    \usetikzlibrary{babel, matrix}
    
    \usepackage[left=2.8cm,right=2.9cm,margin=2cm]{geometry}
    
    \begin{document}
    
    \noindent Sarrus 1:
    
    \[ \begin{tikzpicture}
    \matrix (M) [
      inner sep=0, matrix of math nodes,
      nodes={inner sep=1ex, text height=1ex, text depth=0.3ex}]
      { 0 & a & b\\
        a & 0 & c\\
        b & c & 0\\
        0 & a & b\\
        a & 0 & c\\
      };
    
    \colorlet{sarruslines}{red!80!black}
    \begin{scope}[
      draw=sarruslines,
      fleche/.style n args={5}{
        ->,
        insert path={
          (M.west |- #1) -- (M.east |- #2)
          node[inner sep=0pt, outer sep=1.5pt,
               color=sarruslines, font=\normalsize, #4]
            {\textcircled{$#3$} \makebox[1.5em][l]{\color{black}$#5$}}
        },
      }]
      \foreach \depart/\arrivee/\signe/\decalage/\texte in {%
          M-3-1.south/M-1-3.north/-/above right/0,
          M-4-1.south/M-2-3.north/-/above right/0,
          M-5-1.south/M-3-3.north/-/above right/0,
          M-1-1.north/M-3-3.south/+/below right/0,
          M-2-1.north/M-4-3.south/+/below right/abc,
          M-3-1.north/M-5-3.south/+/below right/abc%
        }
      {
        \draw[fleche={\depart}{\arrivee}{\signe}{\decalage}{\texte}];
      }
    \end{scope}
    \end{tikzpicture} \]
    
    
    \noindent Sarrus 2:
    
    \[ \begin{tikzpicture}
    \matrix (M) [
      inner sep=0, matrix of math nodes,
      nodes={inner sep=1ex, text height=1ex, text depth=0.3ex}]
      { 1 & 4 & 8 \\ 
        2 & 5 & 7 \\ 
        1 & 3 & 0\\
        1 & 4 & 8\\
        2 & 5 & 7\\
      };
    
    \colorlet{sarruslines}{red!80!black}
    \begin{scope}[
      draw=sarruslines,
      fleche/.style n args={5}{
        ->,
        insert path={
          (M.west |- #1) -- (M.east |- #2)
          node[inner sep=0pt, outer sep=1.5pt,
               color=sarruslines, font=\normalsize, #4]
            {\textcircled{$#3$} \makebox[1.5em][l]{\color{black}$#5$}}
        },
      }]
      \foreach \depart/\arrivee/\signe/\decalage/\texte in {%
          M-3-1.south/M-1-3.north/-/above right/40,
          M-4-1.south/M-2-3.north/-/above right/21,
          M-5-1.south/M-3-3.north/-/above right/0,
          M-1-1.north/M-3-3.south/+/below right/0,
          M-2-1.north/M-4-3.south/+/below right/48,
          M-3-1.north/M-5-3.south/+/below right/28%
        }
      {
        \draw[fleche={\depart}{\arrivee}{\signe}{\decalage}{\texte}];
      }
    \end{scope}
    \end{tikzpicture} \]
    
    
    \noindent Sarrus 3:
    
    \[ \begin{tikzpicture}
    \matrix (M) [
      inner sep=0, matrix of math nodes,
      nodes={inner sep=1ex, text height=1ex, text depth=0.3ex}]
      { -1 & 4 & 8 \\ 
        2 & 5 & 7 \\ 
        8 & 3 & 0\\
        -1 & 4 & 8\\
        2 & 5 & 7\\
      };
    
    \colorlet{sarruslines}{red!80!black}
    \begin{scope}[
      draw=sarruslines,
      fleche/.style n args={5}{
        ->,
        insert path={
          (M.west |- #1) -- (M.east |- #2)
          node[inner sep=0pt, outer sep=1.5pt,
               color=sarruslines, font=\normalsize, #4]
            {\textcircled{$#3$} \makebox[1.5em][l]{\color{black}$#5$}}
        },
      }]
      \foreach \depart/\arrivee/\signe/\decalage/\texte in {%
          M-3-1.south/M-1-3.north/-/above right/40,
          M-4-1.south/M-2-3.north/-/above right/-21,
          M-5-1.south/M-3-3.north/-/above right/0,
          M-1-1.north/M-3-3.south/+/below right/0,
          M-2-1.north/M-4-3.south/+/below right/48,
          M-3-1.north/M-5-3.south/+/below right/28%
        }
      {
        \draw[fleche={\depart}{\arrivee}{\signe}{\decalage}{\texte}];
      }
    \end{scope}
    \end{tikzpicture} \]
    
    
    \noindent Sarrus 4:
    
    \[ \begin{tikzpicture}
    \matrix (M) [
      inner sep=0, matrix of math nodes,
      nodes={inner sep=1ex, text height=1ex, text depth=0.3ex}]
      { 1 & 4 & 8 \\ 
        2 & 5 & 7 \\ 
        1 & 3 & -24\\
        1 & 4 & 8\\
        2 & 5 & 7\\
      };
    
    \colorlet{sarruslines}{red!80!black}
    \begin{scope}[
      draw=sarruslines,
      fleche/.style n args={5}{
        ->,
        insert path={
          (M.west |- #1) -- (M.east |- #2)
          node[inner sep=0pt, outer sep=1.5pt,
               color=sarruslines, font=\normalsize, #4]
            {\textcircled{$#3$} \makebox[1.5em][l]{\color{black}$#5$}}
        },
      }]
      \foreach \depart/\arrivee/\signe/\decalage/\texte in {%
          M-3-1.south/M-1-3.north/-/above right/40,
          M-4-1.south/M-2-3.north/-/above right/21,
          M-5-1.south/M-3-3.north/-/above right/-192,
          M-1-1.north/M-3-3.south/+/below right/-120,
          M-2-1.north/M-4-3.south/+/below right/48,
          M-3-1.north/M-5-3.south/+/below right/28%
        }
      {
        \draw[fleche={\depart}{\arrivee}{\signe}{\decalage}{\texte}];
      }
    \end{scope}
    \end{tikzpicture} \]
    
    \end{document}
    


    Le problème est que dès que je remplace les lettres par des nombres, les flèches ne les traversent plus "exactement en leur milieu".
    Dans le premier exemple, la flèche qui traverse la diagonale de zéros est un poil trop basse et il faudrait la translater un tout petit peu vers le haut pour qu'elle traversent les zéros en leur milieu.
    Pareil pour le deuxième il faudrait translater quelques flèches vers le haut.
    Ça empire dans le 3 et le 4 (et de de façon générale dès que je rajoute des signes "-" ou que je prends des nombres à plusieurs chiffres). Par exemple dans le 3 et le 4 certains chiffres ne sont pas coupé par une des flèches.

    Est-il donc possible de gérer plus précisément les extrémités des flèches? Par exemple faire un truc du genre transformer "M-3-1.south" en "M-3-1.south +0.5pt north -0.2pt west" pour que le point de départ de la première flèche de mon code soit, par rapport à maintenant, 0.5 points de plus vers le nord et 0.2 points de plus vers l'est (=-0.2 points vers l'ouest)? J'ai essayé de modifier le code avec des idées telles que celles que j'ai donnée, mais bien sûr ça ne fonctionne pas. Est-ce possible (ou alors d'autres idées pour mieux "couper" les chiffres)?

    Et merci pour votre idée sur l'opacité! Je cherchais à modifier la couleur des flèches pour que ça passe mieux sur une imprimante en noir et blanc, mais je n'avais pas pensé à ça!114172
    114174
    114176
    114178
  • Si tu as un point (A) (en notation TikZ), tu peux utiliser ([xshift=1cm] A) ou ([xshift=1cm, yshift=-0.2pt] A) ou encore ([shift={(1cm, -0.2pt)}] A) pour obtenir un point translaté à partir de (A). Mais il faut considérer l'ensemble de l'algorithme géométrique : vu ce que j'ai mis plus haut pour fixer l'abscisse de début et de fin de chaque flèche (pour régler les premiers problèmes d'alignement), un tel décalage utilisé aux endroits auxquels tu as fait référence n'aurait d'effet que dans la direction de l'axe des ordonnées.

    Je propose plutôt de reconsidérer la géométrie du problème. Si l'on veut que les centres des coefficients soient naturellement alignés, on peut imposer un espace constant entre les centres des colonnes ('column sep={2em,between origins}'). Il faudra alors aussi s'assurer que les lignes sont régulièrement espacées. Pour cela, il suffit qu'elles aient la même hauteur et la même profondeur. Jusque-là, cette propriété était assurée par 'nodes={..., text height=1ex, text depth=0.3ex}', mais ceci va à l'encontre de notre objectif consistant à avoir les centres des nœuds-cellules de la matrice correspondant aux centres des coefficients (je veux dire, de leur dessin). Je vais donc retirer ça.

    Comme les chiffres usuels ont une hauteur constante et une profondeur nulle, on aura toujours une même hauteur et une même profondeur pour chaque ligne dans les matrices ne contenant que des chiffres. C'est le cas dans tous tes exemples, sauf le premier ; mais étant donné que le $b$ a l'air d'être à peu près aussi haut qu'un chiffre et que les lignes sans $b$ contiennent un $0$, ça marche bien aussi pour cette matrice. Sinon, à supposer que le truc le plus haut soit un $b$, il suffirait de mettre un \vphantom{b} dans chaque ligne pour arranger le coup. Idem s'il y avait des caractères qui descendent sous la ligne de base (i.e., des caractères de profondeur strictement positive).

    Ça fonctionne pas trop mal :
    \documentclass{article}
    \usepackage{tikz}
    \usetikzlibrary{babel, matrix}
    \usepackage{multicol}
    
    \tikzset{
      sarrus matrix/.style={
        inner sep=0, matrix of math nodes, column sep={2em,between origins},
      nodes={inner sep=1ex},
      },
      sarrus/.style={draw=sarruscolor, opacity=0.5},
      fleche/.style n args={5}{
        ->,
        insert path={
          (intersection cs:first line={(#1)--(#2)},
                           second line={(M.west)--([yshift=1pt]M.west)}) --
          (intersection cs:first line={(#1)--(#2)},
                           second line={(M.east)--([yshift=1pt]M.east)})
          node[inner sep=0pt, outer sep=1.5pt,
               color=sarruscolor, font=\normalsize,
               label={[opacity=1]right:$#5$}, #4]
            {\textcircled{$#3$}}
        },
      },
    }
    
    \colorlet{sarruspluslines}{green!80!black}
    \colorlet{sarrusminuslines}{red!80!black}
    
    \newcommand*{\sarrusDetermineColor}[1]{%
      \if#1+%
        \colorlet{sarruscolor}{sarruspluslines}%
      \else
        \colorlet{sarruscolor}{sarrusminuslines}%
      \fi
    }
    
    \begin{document}
    
    \begin{multicols}{2}
    \noindent Sarrus 1:
    \[ \begin{tikzpicture}
    \matrix (M) [sarrus matrix]
      { 0 & a & b\\
        a & 0 & c\\
        b & c & 0\\
        0 & a & b\\
        a & 0 & c\\
      };
    
    \foreach \depart/\arrivee/\signe/\decalage/\texte in {%
        M-3-1/M-1-3/-/above right/0,
        M-4-1/M-2-3/-/above right/0,
        M-5-1/M-3-3/-/above right/0,
        M-1-1/M-3-3/+/below right/0,
        M-2-1/M-4-3/+/below right/abc,
        M-3-1/M-5-3/+/below right/abc%
      }
    {
      \sarrusDetermineColor{\signe}
      \draw[sarrus, fleche={\depart}{\arrivee}{\signe}{\decalage}{\texte}];
    }
    \end{tikzpicture} \]
    \columnbreak
    
    \noindent Sarrus 2:
    \[ \begin{tikzpicture}
    \matrix (M) [sarrus matrix]
      { 1 & 4 & 8 \\
        2 & 5 & 7 \\
        1 & 3 & 0\\
        1 & 4 & 8\\
        2 & 5 & 7\\
      };
    
    \foreach \depart/\arrivee/\signe/\decalage/\texte in {%
        M-3-1/M-1-3/-/above right/40,
        M-4-1/M-2-3/-/above right/21,
        M-5-1/M-3-3/-/above right/0,
        M-1-1/M-3-3/+/below right/0,
        M-2-1/M-4-3/+/below right/48,
        M-3-1/M-5-3/+/below right/28%
      }
    {
      \sarrusDetermineColor{\signe}
      \draw[sarrus, fleche={\depart}{\arrivee}{\signe}{\decalage}{\texte}];
    }
    \end{tikzpicture} \]
    \end{multicols}
    
    \begin{multicols}{2}
    \noindent Sarrus 3:
    \[ \begin{tikzpicture}
    \matrix (M) [sarrus matrix]
      { -1 & 4 & 8 \\
        2 & 5 & 7 \\
        8 & 3 & 0\\
        -1 & 4 & 8\\
        2 & 5 & 7\\
      };
    
    \foreach \depart/\arrivee/\signe/\decalage/\texte in {%
        M-3-1/M-1-3/-/above right/40,
        M-4-1/M-2-3/-/above right/-21,
        M-5-1/M-3-3/-/above right/0,
        M-1-1/M-3-3/+/below right/0,
        M-2-1/M-4-3/+/below right/48,
        M-3-1/M-5-3/+/below right/28%
      }
    {
      \sarrusDetermineColor{\signe}
      \draw[sarrus, fleche={\depart}{\arrivee}{\signe}{\decalage}{\texte}];
    }
    \end{tikzpicture} \]
    \columnbreak
    
    \noindent Sarrus 4:
    \[ \begin{tikzpicture}
    \matrix (M) [sarrus matrix]
      { 1 & 4 & 8 \\
        2 & 5 & 7 \\
        1 & 3 & -24\\
        1 & 4 & 8\\
        2 & 5 & 7\\
      };
    
    \foreach \depart/\arrivee/\signe/\decalage/\texte in {%
        M-3-1/M-1-3/-/above right/40,
        M-4-1/M-2-3/-/above right/21,
        M-5-1/M-3-3/-/above right/-192,
        M-1-1/M-3-3/+/below right/-120,
        M-2-1/M-4-3/+/below right/48,
        M-3-1/M-5-3/+/below right/28%
      }
    {
      \sarrusDetermineColor{\signe}
      \draw[sarrus, fleche={\depart}{\arrivee}{\signe}{\decalage}{\texte}];
    }
    \end{tikzpicture} \]
    \end{multicols}
    
    \end{document}
    
    114214
  • Bonsoir
    De façon générale, y a-t-il une façon générale d'imposer que tous les nœuds dans Tikz aient la même taille, à savoir la plu grande longueur (respectivement hauteur) prise sur tous les nœuds d'une même colonne (respectivement ligne). Par exemple (mais ce n'est pas la seule chose que j'ai en tête), dans les dessins que je pensais avoir réussi, il y avait ceux-là:
    \documentclass[a4paper,8pt]{article}
    \usepackage[utf8]{inputenc}
    \usepackage[T1]{fontenc}
    \usepackage{amsmath}
    \usepackage{amsfonts}
    \usepackage{amssymb}
    \usepackage{graphicx}
    \usepackage{mathtools}
    \usepackage[define-L-C-R]{nicematrix}
    \usepackage{amsthm}
    \usepackage{float}
    \usepackage[francais]{babel}
    \usepackage[left=2.8cm,right=2.9cm,margin=2cm]{geometry}
    \usepackage{tikz}
    \usetikzlibrary{tikzmark,fit}
    
    \setcounter{MaxMatrixCols}{20}
    
    \tikzset{highlight/.style={rectangle,fill=red!15,blend mode = multiply,rounded corners = 0.5 mm,inner sep=1pt,fit=#1}}
    
    \begin{document}
    
    Début du texte.........................................................................
    
    \begin{NiceMatrixBlock}
    
    \[\begin{array}{ccc}
    A= \begin{pNiceArray}{ccccc}[margin, name=A]
    a_{1,1} & a_{1,2} & a_{1,3} & \cdots & a_{1,n}\\
    \vdots & \vdots & \vdots &   & \vdots \\
    a_{n,1} & a_{n,2} & a_{n,3} & \cdots & a_{n,n}
    \end{pNiceArray};
    &
    \hspace{2cm}
    &
    B= \begin{pNiceArray}{ccccccc}[margin, name=B]
    b_{1,1} & \cdots & b_{1,j-1} & b_{1,j} & b_{1,j+1} & \cdots & b_{1,n}\\
    \vdots &  & \vdots & \vdots & \vdots &  & \vdots \\
    b_{n,1} & \cdots & b_{n,j-1} & b_{n,j} & b_{n,j+1} & \cdots & b_{n,n}
    \end{pNiceArray} \\
    \vspace{0.1cm} & & \vspace{0.1cm} \\
    \Bigg\downarrow& &\Bigg\downarrow \\
    \vspace{0.1cm} & & \vspace{0.1cm} \\
    A_j = \begin{pNiceArray}{ccccc}[margin, name=C]
    b_{1,j} & a_{1,2} & a_{1,3} & \cdots & a_{1,n}\\
    \vdots & \vdots & \vdots &   & \vdots \\
    b_{n,j} & a_{n,2} & a_{n,3} & \cdots & a_{n,n}
    \end{pNiceArray};
    &
    \hspace{2cm}
    &
    B_j = \begin{pNiceArray}{ccccccc}[margin, name=D]
    b_{1,1} & \cdots & b_{1,j-1} & a_{1,1} & b_{1,j+1} & \cdots & b_{1,n}\\
    \vdots &  & \vdots & \vdots & \vdots &  & \vdots \\
    b_{n,1} & \cdots & b_{n,j-1} & a_{n,1} & b_{n,j+1} & \cdots & b_{n,n}
    \end{pNiceArray}
    \end{array}\]
    
    \end{NiceMatrixBlock}
    
    \begin{tikzpicture}[remember picture, overlay]
    \node [highlight = (A-1-1) (A-3-1) ] {} ;
    \node [highlight = (B-1-4) (B-3-4) ] {} ;
    \draw [<->, color = black] (A-1-1.north) to [out=20,in=160] (B-1-4.north) ;
    \draw[dashed,color=green] (C-1-1.north west) rectangle (C-3-1.south east);
    \draw[dashed, color=green] (D-1-4.north west) rectangle (D-3-4.south east);
    \end{tikzpicture}
    
    Fin du texte
    
    \noindent\hrulefill
    
    \[   \begin{pNiceMatrix}[
        margin,create-extra-nodes,
        code-after={%
          \begin{tikzpicture}
            \draw (1-1.north west) rectangle (3-4.south west);
          \end{tikzpicture}%
        }]
    \NotEmpty \vrule width 0pt height 0ex depth 4ex\relax
    \Block{3-4}<\LARGE>{
      A} & & & \\
    & & & \\
    & & & \phantom{\;} \\
    \alpha_1 & \alpha_2 & \cdots & \alpha_n
    \end{pNiceMatrix} \]
    
    \end{document}
    
    Dans le premier dessin (mis à part les deux flèches vers le bas pas bien alignées et celle du haut qui déborde sur le texte), les rectangles verts sont très resserrés autour des coefficients. Il faudrait que les nœuds soient un peu plus "espacés" autour des coefficients.
    De même, dans le deuxième dessin, le rectangle encadrant la $A$ n'a pas la largeur de la ligne des $\alpha$, ce qui se règlerai si j'avais tous les nœuds d'une même largeur sur une même colonne et de même hauteur sur une même ligne.

    J'ai trouvé des solutions où on fixe la largeur de tous les nœuds, mais ça ne sera pas forcément la largeur du nœud maximal (sauf si je le mesure), et je voudrais que ça soit fait automatiquement (car si j'ai beaucoup de matrices, je ne veux pas fixer une m'amuser à mesurer des nœuds à chaque fois).

    Edit : en fait je me demande si "agrandir la hauteur/largeur des nœuds" dans le premier dessin est vraiment le même problème que "mettre tous les nœuds à la même hauteur/largeur" dans le second dessin...?114586
  • Bonsoir,

    Tu parles des nœuds TikZ mais tes exemples utilisent nicematrix (ce package rend le résultat facile à décorer avec TikZ, mais il ne le charge pas par défaut et ne s'appuie pas sur les matrices TikZ). La réponse pour nicematrix se trouve à la section Les « nœuds moyens » et les « nœuds larges » du manuel.

    Ton exemple n'est pas tout à fait minimal, hélas... Pourquoi laisser des packages tels que graphicx, amsthm ou float qui ne jouent absolument aucun rôle ici ? Et quid du \setcounter{MaxMatrixCols}{20} que tu mets dans chacun de tes exemples ?

    Je laisse les \vspace{0.1cm} dans les cellules de matrices mais il vaudrait sans doute mieux les remplacer par des \vrule de largeur nulle comme dans le dernier exemple (adapter la hauteur et la profondeur selon l'effet souhaité) :
    \vrule width 0pt height 0ex depth 4ex\relax
    
    Code modifié :
    \documentclass{article}
    \usepackage[hmargin=2cm]{geometry}
    \usepackage{amsmath}
    \usepackage{nicematrix}
    \usepackage{tikz}
    \usetikzlibrary{tikzmark,fit}
    
    \tikzset{
      highlight/.style={
        rectangle, fill=red!15, blend mode = multiply,
        rounded corners = 0.5 mm, inner sep=1pt, fit={#1}},
    }
    
    \begin{document}
    
    \begin{NiceMatrixBlock}
    
    \[\begin{array}{ccc}
    A= \begin{pNiceArray}{ccccc}[margin, name=A, create-large-nodes,
                                 extra-margin=2pt]
    a_{1,1} & a_{1,2} & a_{1,3} & \cdots & a_{1,n}\\
    \vdots & \vdots & \vdots &   & \vdots \\
    a_{n,1} & a_{n,2} & a_{n,3} & \cdots & a_{n,n}
    \end{pNiceArray};
    &
    \hspace{2cm}
    &
    B= \begin{pNiceArray}{ccccccc}[margin, name=B, create-large-nodes]
    b_{1,1} & \cdots & b_{1,j-1} & b_{1,j} & b_{1,j+1} & \cdots & b_{1,n}\\
    \vdots &  & \vdots & \vdots & \vdots &  & \vdots \\
    b_{n,1} & \cdots & b_{n,j-1} & b_{n,j} & b_{n,j+1} & \cdots & b_{n,n}
    \end{pNiceArray} \\
    \vspace{0.1cm} & & \vspace{0.1cm} \\
    \Bigg\downarrow& &\Bigg\downarrow \\
    \vspace{0.1cm} & & \vspace{0.1cm} \\
    A_j = \begin{pNiceArray}{ccccc}[margin, name=C, create-large-nodes,
                                    extra-margin=2pt]
    b_{1,j} & a_{1,2} & a_{1,3} & \cdots & a_{1,n}\\
    \vdots & \vdots & \vdots &   & \vdots \\
    b_{n,j} & a_{n,2} & a_{n,3} & \cdots & a_{n,n}
    \end{pNiceArray};
    &
    \hspace{2cm}
    &
    B_j = \begin{pNiceArray}{ccccccc}[margin, name=D, create-large-nodes]
    b_{1,1} & \cdots & b_{1,j-1} & a_{1,1} & b_{1,j+1} & \cdots & b_{1,n}\\
    \vdots &  & \vdots & \vdots & \vdots &  & \vdots \\
    b_{n,1} & \cdots & b_{n,j-1} & a_{n,1} & b_{n,j+1} & \cdots & b_{n,n}
    \end{pNiceArray}
    \end{array}\]
    
    \end{NiceMatrixBlock}
    
    \begin{tikzpicture}[remember picture, overlay]
    \node [highlight = (A-1-1-large) (A-3-1-large) ] {} ;
    \node [highlight = (B-1-4-large) (B-3-4-large) ] {} ;
    \draw [<->, color = black, shorten <=9pt, shorten >=9pt]
      (A-1-1.70) to[bend left=20] (B-1-4.110) ;
    \draw[dashed,color=green] (C-1-1-large.north west) rectangle (C-3-1-large.south east);
    \draw[dashed, color=green] (D-1-4-large.north west) rectangle (D-3-4-large.south east);
    \end{tikzpicture}
    
    \[   \begin{pNiceMatrix}[
        margin, create-medium-nodes,
        code-after={%
          \begin{tikzpicture}
            \draw (1-1-medium.north west) rectangle (3-4-medium.south east);
          \end{tikzpicture}%
        }]
    \NotEmpty \vrule width 0pt height 0ex depth 4ex\relax
    \Block{3-4}<\LARGE>{
      A} & & & \\
    & & & \\
    & & & \phantom{\;} \\
    \alpha_1 & \alpha_2 & \cdots & \alpha_n
    \end{pNiceMatrix} \]
    
    \end{document}
    
    (dans la dernière matrice, il y avait aussi une confusion entre est et ouest...).

    Edit : précision au sujet de nicematrix, à savoir qu'il ne charge même pas TikZ par défaut (dixit le manuel).114590
Connectez-vous ou Inscrivez-vous pour répondre.