Alignements de blocs — Les-mathematiques.net The most powerful custom community solution in the world

Alignements de blocs

Bonsoir à tous
J'écris en ce moment des opérations de pivot et je cherche à aligner mes "blocs" entre eux. Je m'explique à l'aide du code ci-dessous.
\documentclass[12pt,a4paper]{article}
\usepackage{nicematrix}
\begin{document}

Exemple 1: 
\begin{flalign*}
& &&\begin{pNiceMatrix}[margin]
 1 & 2 & -3 \\
 2 & 1 & 0 \\
 3 & 0 & 3 \\
 -1 & -2 & 3 \\
 -2 & -3 & 4 \\
 4 & -1 & 6 \\
\end{pNiceMatrix} && \\[2ex]
&\begin{array}{l}
L_2 \gets L_2 - 2 L_1 \\
L_3 \gets L_3 - 3 L_1 \\
L_4 \gets L_4 + L_1 \\
L_5 \gets L_5 + 2 L_1 \\
L_6 \gets L_6 - 4 L_1
\end{array} & && &&\\
& &&\begin{pNiceMatrix}[margin]
 1 & 2 & -3 \\
 0 & -3 & 6 \\
 0 & -6 & 12 \\
 0 & 0 & 0 \\
 0 & 1 & -2 \\
 0 & -9 & 18 \\
\end{pNiceMatrix} && \\[2ex]
&\begin{array}{l}
L_3 \gets L_3 - 2 L_2 \\
L_5 \gets 3 L_5 + L_2 \\
L_6 \gets L_6 - 3 L_2
\end{array} & && &&\\
& &&\begin{pNiceMatrix}[margin]
 1 & 2 & -3 \\
 0 & -3 & 6 \\
 0 & 0 & 0 \\
 0 & 0 & 0 \\
 0 & 0 & 0 \\
 0 & 0 & 0 \\
\end{pNiceMatrix}. &&
\end{flalign*}

Exemple 2: 
\begin{flalign*}
& &&\begin{pNiceMatrix}[margin]
 2 & -1 & -1 & 0 \\
 0 & 3 & 0 & 0 \\
 -3 & 9 & 1 & 0 \\
 -6 & -12 & 3 & 1 \\
\end{pNiceMatrix} \begin{pNiceMatrix}[margin]
 3 & 0 & 0 & 0 \\
 0 & 0 & 0 & 1 \\
 -1 & -1 & 1 & 0 \\
 1 & 1 & 0 & 0 \\
\end{pNiceMatrix} && \\[2ex]
&\begin{array}{l}
C_2 \gets 2C_2 + C_1 \\
C_3 \gets 2C_3 + C_1
\end{array} & && &&\\
& &&\begin{pNiceMatrix}[margin]
 2 & 0 & 0 & 0 \\
 0 & 6 & 0 & 0 \\
 -3 & 15 & -1 & 0 \\
 -6 & -30 & 0 & 1 \\
\end{pNiceMatrix} \begin{pNiceMatrix}[margin]
 3 & 3 & 3 & 0 \\
 0 & 0 & 0 & 1 \\
 -1 & -3 & 1 & 0 \\
 1 & 3 & 1 & 0 \\
\end{pNiceMatrix} &&\\[2ex]
&\begin{array}{l}
C_1 \gets C_1 -3 C_3 + 6 C_4 \\
C_2 \gets C_2+ 15C_3 +30 C_4
\end{array} & && &&\\
& &&\begin{pNiceMatrix}[margin]
 2 & 0 & 0 & 0 \\
 0 & 6 & 0 & 0 \\
 0 & 0 & -1 & 0 \\
 0 & 0 & 0 & 1 \\
\end{pNiceMatrix} \begin{pNiceMatrix}[margin]
 -6 & 48 & 3 & 0 \\
 6 & 30 & 0 & 1 \\
 -4 & 12 & 1 & 0 \\
 -2 & 18 & 1 & 0 \\
\end{pNiceMatrix}. &&
\end{flalign*}

\end{document}
Pour l'exemple 1, j'ai des "blocs" de matrices, et des "blocs" de type "$L_i \gets L_i-L_j$". Si on regarde les matrices, on voit qu'elles sont à peu près centrées par rapport à la page, mais qu'elles sont toutes alignées entre elles sur leur gauche (cf trait rouge mal tracé). Je souhaiterais faire un environnement où les matrices sont centrées à la fois par rapport à la page mais aussi les unes par rapport aux autres.
Pour les "blocs $L_i \gets L_i-L_j$", je souhaiterais que les $L_i$ soient alignés à gauche comme maintenant, mais également ajouter un alignement des flèches pour que les "\gets" restent également les uns en dessous des autres lorsque j'aurai par exemple un $L_i$ avec $i>10$. J'ai essayé avec un "\begin{array}{ll}" (deux "l" au lieu d'un seul) et en ajoutant un "&" avant les "\gets" mais cela me rajoute une espace non désirée entre le $L_i$ et le "\gets"... Y a-t-il un moyen d'arranger cela?

Pour l'exemple 2, j'aurai aimé les mêmes alignements que pour l'exemple 1, mais également un exemple avec un alignement différent des matrices: celles de gauche alignées à droite et celles de droite alignées à gauche (comme s'il y avait un trait invisible entre les groupes de deux matrices et que ces traits étaient alignés les uns par rapport aux autres; cf également traits rouges). Je présume que si je veux juste que les blocs de deux matrices soient centrés les uns par rapport aux autres je n'aurai qu'à reprendre l'exemple 1 et remplacer les matrices seules par les blocs de 2 matrices, donc c'est surtout un exemple où les "traits invisibles" seraient alignés qui m'intéresse pour le 2.

Y a-t-il un environnement permettant de réaliser cela ? Si j'ai bien compris, "flalign" ne fait que des alignements left et right, donc peu de chance que mes matrices soient alignées de façon centrées les unes par rapport aux autres...

Au passage, j'en profite pour demander si l'instruction pour échanger deux lignes est bien \leftrightarrow (j'utilise "\gets" au lieu de "\leftarrow" donc y a-t-il une instruction comme "\gets" mais qui remplacerait "\leftrightarrow" pour les algorithmes de type pivot) ?
Je vous remercie par avance pour votre aide!
Adrien

Ps : il est tard donc si mon message n'est pas très clair n'hésitez pas à me le dire et je préciserai ce qui aura éventuellement besoin de l'être quand je serai un peu plus réveillé :-)122360
122362

Réponses

  • Bonjour,

    Pour les « blocs $L_i \gets L_i-L_j$ », un \begin{array}{ll} semble approprié. Tu veux réduire l'espace intercolonnes à 0 ; cela peut se faire de deux façons :
    • globale pour le tableau avec \arraycolsep (modifié localement) ;
    • avec plus de granularité en mettant @{} dans le préambule du tableau, par exemple \begin{array}{@{} l @{} l @{}}.
    La solution \setlength{\arraycolsep}{0pt} me semble moins lourde ici. Pour que ça n'affecte pas la suite du document, il suffit de faire ça dans un groupe qui se termine après l'environnement array en question. Comme dans ton cas, ces environnements sont dans des cellules d'un alignement (le flalign*), il n'y a rien à faire car chaque cellule forme son propre groupe TeX. Donc :
    \begin{flalign*}
    & &&\begin{pNiceMatrix}[margin]
      ...
    \end{pNiceMatrix} && \\[2ex]
    &\setlength{\arraycolsep}{0pt}% <-- on est dans un groupe réduit à la cellule
     \begin{array}{ll}
     L_2      & {}\gets L_2 - 2 L_1 \\
     L_{2353} & {}\gets L_3 - 3 L_1 \\
     L_4      & {}\gets L_4 + L_1 \\
     L_5      & {}\gets L_5 + 2 L_1 \\
     L_6      & {}\gets L_6 - 4 L_1
     \end{array} & && &&\\
    ...
    
    Le {} avant chaque \gets est une sous-formule vide et a pour classe \mathord. Étant donné qu'on a réduit l'espace intercolonnes à 0pt, cela permet d'avoir un espacement correct avant \gets, qui produit un atome de classe \mathrel (astuce classique).

    Pour l'échange de lignes, je regarde comment est définie \gets dans tex/latex/base/fontmath.ltx :
    \DeclareMathSymbol{\leftarrow}{\mathrel}{symbols}{"20}
    ...
    \DeclareMathSymbol{\gets}{\mathrel}{symbols}{"20}
    
    Ceci suggère de regarder juste au-dessus :
    \DeclareMathSymbol{\leftrightarrow}{\mathrel}{symbols}{"24}
    
    On peut donc faire :
    \DeclareMathSymbol{\getsteg}{\mathrel}{symbols}{"24} % ou \pivotExchange ou...
    
    Autre possibilité, si le noyau LaTeX est assez récent :
    \NewCommandCopy{\exchange}{\leftrightarrow}
    
    Exemple complet minimal avec la structure du message initial :
    \documentclass{article}
    \usepackage{amsmath}
    \NewCommandCopy{\exchange}{\leftrightarrow}
    
    \begin{document}
    
    Exemple 1:
    \begin{flalign*}
    & && (\ldots) && \\[2ex]
    &\setlength{\arraycolsep}{0pt}%
     \begin{array}{ll}
     L_2      & {}\gets L_2 - 2 L_1 \\
     L_{2353} & {}\gets L_3 - 3 L_1 \\
     L_4      & {}\gets L_4 + L_1   \\
     L_2      & {}\exchange L_4     \\
     L_6      & {}\gets L_6 - 4 L_1
     \end{array}
    \end{flalign*}
    
    \end{document}
    
    Maintenant, la question de l'alignement horizontal des matrices. Premièrement, il faudrait définir « la page ». Est-ce que ça va du bord gauche au bord droit du papier ou bien de la marge gauche à la marge droite (les marges pouvant être asymétriques) ? Deuxièmement, ce centrage par rapport à « la page » est faisable mais semble compliqué pour un intérêt que j'estime assez négligeable. Ne serait-il pas plus simple de remplacer l'environnement 'flalign*' par un environnement 'array', de choisir un espace intercolonnes convenable et d'utiliser :
    • pour les matrices de l'exemple 1, une colonne de type 'c' ;
    • pour celles de l'exemple 2 avec la « ligne invisible », une colonne 'r' suivie d'une colonne 'l'
    ?122382
  • @brian merci pour votre réponse!

    Comment utilisez-vous l'environnement array au lieu de flalign? J'ai tenté le code suivant:
    \documentclass{article}
    \usepackage{amsmath}
    \usepackage{nicematrix}
    \NewCommandCopy{\exchange}{\leftrightarrow}
    
    \begin{document}
    
    Exemple 1:
    \[\setlength{\arraycolsep}{2cm}%
    \begin{array}{lc}
     &\begin{pNiceMatrix}[margin]
     1 & 2 & -3 \\
     2 & 1 & 0 \\
     3 & 0 & 3 \\
     -1 & -2 & 3 \\
     -2 & -3 & 4 \\
     4 & -1 & 6 \\
    \end{pNiceMatrix} \\[2ex]
    \setlength{\arraycolsep}{0pt}%
     \begin{array}{ll}
     L_2      & {}\gets L_2 - 2 L_1 \\
     L_{2353} & {}\gets L_3 - 3 L_1 \\
     L_4      & {}\gets L_4 + L_1   \\
     L_2      & {}\exchange L_4     \\
     L_6      & {}\gets L_6 - 4 L_1
     \end{array} & \\
      &\begin{pNiceMatrix}[margin]
     1 & 2 & -3 \\
     2 & 1 & 0 \\
     3 & 0 & 3 \\
     -1 & -2 & 3 \\
     -2 & -3 & 4 \\
     4 & -1 & 6 \\
    \end{pNiceMatrix} \\[2ex]
    \setlength{\arraycolsep}{0pt}%
     \begin{array}{ll}
     L_2      & {}\gets L_2 - 2 L_1 \\
     L_{2353} & {}\gets L_3 - 3 L_1 \\
     L_4      & {}\gets L_4 + L_1   \\
     L_2      & {}\exchange L_4     \\
     L_6      & {}\gets L_6 - 4 L_1
     \end{array} &
    \end{array} \]
    
    \end{document}
    

    mais les blocs "$L_i \gets ...$" ne sont plus alignés à gauche (c'était pour ça que j'avais utilisé flalign à la base). De plus je ne sais pas comment modifier localement seulement \arraycolsep comme vous avez fait: j'ai essayé la même instruction que vous, mais elle m'a aussi modifié les matrices... faut-il remettre un troisième $\setlength{\arraycolsep}{...}$ avant le $\begin{pnicematrix}$ pour gérer l'espacement des colonnes des matrices (auquel cas quel est l'espacement par défaut)?

    Merci encore pour votre réponse!
  • Pour que les blocs « opérations élémentaires » soient alignés à gauche, il faut que l'array extérieur soit dans une formule en ligne, pas une formule display. D'autre part, pour régler l'espace intercolonnes de ce tableau extérieur, je suggère d'utiliser @{} dans le préambule du tableau sinon, comme tu l'as constaté, la modification d'\arraycolsep à ce niveau va contaminer tous les environnements 'array' qui se trouvent à l'intérieur — sauf modification explicite plus locale. Ceci donne sur ton dernier exemple :
    \documentclass{article}
    \usepackage{amsmath}
    \usepackage{nicematrix}
    \NewCommandCopy{\exchange}{\leftrightarrow}
    
    \begin{document}
    
    \noindent
    Exemple 1:\\*[1ex]
    $\begin{array}{ @{} l @{\hspace{0.3\linewidth}} c @{} }
     &\begin{pNiceMatrix}[margin]
     1 & 2 & -3 \\
     2 & 1 & 0 \\
     3 & 0 & 3 \\
     -1 & -2 & 3 \\
     -2 & -3 & 4 \\
     4 & -1 & 6 \\
    \end{pNiceMatrix} \\[2ex]
    \setlength{\arraycolsep}{0pt}%
     \begin{array}{ll}
     L_2      & {}\gets L_2 - 2 L_1 \\
     L_{2353} & {}\gets L_3 - 3 L_1 \\
     L_4      & {}\gets L_4 + L_1   \\
     L_2      & {}\exchange L_4     \\
     L_6      & {}\gets L_6 - 4 L_1
     \end{array} & \\
      &\begin{pNiceMatrix}[margin]
     1 & 2 & -3 \\
     2 & 1 & 0 \\
     3 & 0 & 3 \\
     -1 & -2 & 3 \\
     -2 & -3 & 4 \\
     4 & -1 & 6 \\
    \end{pNiceMatrix} \\[2ex]
    \setlength{\arraycolsep}{0pt}%
     \begin{array}{ll}
     L_2      & {}\gets L_2 - 2 L_1 \\
     L_{2353} & {}\gets L_3 - 3 L_1 \\
     L_4      & {}\gets L_4 + L_1   \\
     L_2      & {}\exchange L_4     \\
     L_6      & {}\gets L_6 - 4 L_1
     \end{array} &
    \end{array}$
    
    \end{document}
    
    122396
  • @brian merci encore pour votre réponse!

    J'ai réussi (je pense) à adapter votre dernier exemple dans le cas des blocs à deux matrices (avec des "rl" dans "array"). Par rapport à la question de votre premier message, j'entends le mot "centré" par rapport aux marges de la page. Y a-t-il un moyen pour que les blocs de matrices soient centrés par rapport aux marges automatiquement en fonction de celles-ci?
    Le document sur lequel je travaille va probablement être édité en livre, et je ne connais pas encore les marges qu'il y aura au final, donc j'aimerais savoir s'il est possible que cela soit réglé automatiquement dans le code (sans avoir à re-calculer et à introduire manuellement l'espacement à chaque fois, surtout si le livre risque de faire 800 pages à la fin...).
  • On peut faire comme ça :
    \documentclass{article}
    \usepackage{amsmath}
    \usepackage{nicematrix}
    
    % Seulement pour montrer le centrage
    \usepackage{tikzpagenodes}
    \usepackage{showframe}
    \renewcommand{\ShowFrameLinethickness}{0.15pt}
    \renewcommand*{\ShowFrameColor}{\color{blue!30!white}}
    
    \NewCommandCopy{\exchange}{\leftrightarrow}
    
    \begin{document}
    
    \noindent
    Exemple 1:\\*[1ex]
    $\begin{array}{ @{} l @{} }
    \makebox[0pt][l]{%
     \hspace{0.5\linewidth}%
     \makebox[0pt]{%
       $\begin{pNiceMatrix}[margin]
         1 & 2 & -3 \\
         2 & 1 & 0 \\
         3 & 0 & 3 \\
         -1 & -2 & 3 \\
         -2 & -3 & 4 \\
         4 & -1 & 6 \\
       \end{pNiceMatrix}$%
     }%
    } \\[2ex]
    \setlength{\arraycolsep}{0pt}%
     \begin{array}{ll}
     L_2      & {}\gets L_2 - 2 L_1 \\
     L_{2353} & {}\gets L_3 - 3 L_1 \\
     L_4      & {}\gets L_4 + L_1   \\
     L_2      & {}\exchange L_4     \\
     L_6      & {}\gets L_6 - 4 L_1
     \end{array} \\
    \makebox[0pt][l]{%
     \hspace{0.5\linewidth}%
     \makebox[0pt]{%
       $\begin{pNiceMatrix}[margin]
         1 & 22222222 & -33333333 \\
         2 & 1 & 0 \\
         3 & 0 & 3 \\
         -1 & -2 & 3 \\
         -2 & -3 & 4 \\
         4 & -1 & 66666666666 \\
       \end{pNiceMatrix}$%
     }%
    } \\[2ex]
    \setlength{\arraycolsep}{0pt}%
     \begin{array}{ll}
     L_2      & {}\gets L_2 - 2 L_1 \\
     L_{2353} & {}\gets L_3 - 3 L_1 \\
     L_4      & {}\gets L_4 + L_1   \\
     L_2      & {}\exchange L_4     \\
     L_6      & {}\gets L_6 - 4 L_1
     \end{array}
    \end{array}$%
    \tikz[remember picture, overlay]
      \draw[red, opacity=0.5] (current page text area.north) --
                              (current page text area.south);
    
    \end{document}
    
    122404
  • La même idée avec un peu de factorisation pour l'exemple 2 :
    \documentclass{article}
    \usepackage{amsmath}
    \usepackage{nicematrix}
    
    % Seulement pour montrer le centrage
    \usepackage{tikzpagenodes}
    \usepackage{showframe}
    \renewcommand{\ShowFrameLinethickness}{0.15pt}
    \renewcommand*{\ShowFrameColor}{\color{blue!30!white}}
    
    % On pourrait se contenter de macros
    \newlength{\zooooota}
    \setlength{\zooooota}{2ex}
    \newlength{\zoooootb}
    \setlength{\zoooootb}{2ex}
    
    \NewDocumentCommand{\deuxMatrices}{m m}{%
      \par\noindent \hspace*{0.5\linewidth}%
      \makebox[0pt][r]{$#1$\hspace{1em}}%
      \makebox[0pt][l]{\hspace{1em}$#2$}%
      \par
    }
    
    \NewDocumentEnvironment{operations}{}
      {%
       \par\vspace{\zooooota}%
       \noindent \setlength{\arraycolsep}{0pt}$\begin{array}{ll}%
      }
      {\end{array}$\par}
    
    \begin{document}
    
    \noindent
    \tikz[remember picture, overlay]
      \draw[red, opacity=0.5] (current page text area.north) --
                              (current page text area.south);%
    %
    Exemple 2 :\par\nopagebreak\vspace{1ex}
    \deuxMatrices
      {
        \begin{pNiceMatrix}[margin]
         2 & -1 & -1 & 0 \\
         0 & 3 & 0 & 0 \\
         -3 & 9 & 1 & 0 \\
         -6 & -12 & 3 & 1
        \end{pNiceMatrix}
      }
      {
        \begin{pNiceMatrix}[margin]
         3 & 0 & 0 & 0 \\
         0 & 0 & 0 & 1 \\
         -1 & -1 & 1 & 0 \\
         1 & 1 & 0 & 0
        \end{pNiceMatrix}
      }
    
    \begin{operations}
      C_2 & {}\gets 2C_2 + C_1 \\
      C_3 & {}\gets 2C_3 + C_1
    \end{operations}
    
    \vspace{\zoooootb}
    \deuxMatrices
      {
        \begin{pNiceMatrix}[margin]
         2 & 0 & 0 & 0 \\
         0 & 6 & 0 & 0 \\
         -3 & 15 & -1 & 0 \\
         -6 & -30 & 0 & 1
        \end{pNiceMatrix}
      }
      {
        \begin{pNiceMatrix}[margin]
         3 & 3 & 3 & 0 \\
         0 & 0 & 0 & 1 \\
         -1 & -3 & 1 & 0 \\
         1 & 3 & 1 & 0
        \end{pNiceMatrix}
      }
    
    \begin{operations}
      C_1 & {}\gets C_1 -3 C_3 + 6 C_4 \\
      C_2 & {}\gets C_2+ 15C_3 +30 C_4
    \end{operations}
    
    \vspace{\zoooootb}
    \deuxMatrices
      {
        \begin{pNiceMatrix}[margin]
         2 & 0 & 0 & 0 \\
         0 & 6 & 0 & 0 \\
         0 & 0 & -1 & 0 \\
         0 & 0 & 0 & 1
        \end{pNiceMatrix}
      }
      {
        \begin{pNiceMatrix}[margin]
         -6 & 48 & 3 & 0 \\
         6 & 30 & 0 & 1 \\
         -4 & 12 & 1 & 0 \\
         -2 & 18 & 1 & 0
        \end{pNiceMatrix}
      }
    
    \end{document}
    
    122414
  • @brian merci beaucoup!
    Ça marche "presque partout :-)". Pour les enchaînements de pivots plus longs et qui tiennent sur plusieurs pages, faut-il que je découpe manuellement au saut de page et que je fasse deux fois l'environnement (un pour chaque page), ou les sauts de pages peuvent-ils être inclus dans le code?
  • Je ne comprends pas bien le « deux fois ». À chaque fois qu'il y a un \par, la coupure est possible sauf si ce \par est suivi d'un \nopagebreak (ou \nobreak). On peut mettre ces choses dans la macro et/ou l'environnement, à condition que la politique de coupure de pages soit bien définie (i.e., de savoir précisément où les coupures de pages sont autorisées).
  • Bonsoir,
    Par "deux fois", je veux dire une première fois sur la page de début, puis refermer le "$" et le rouvrir ensuite pour séparer le calcul en deux blocs et éviter que tout le bloc ne soit transféré sur la page d'après (et ne laisse la page actuelle blanche), comme dans la capture d'écran. Où doivent se situer les "\par"?


    Edit: pardon j'ai posté ce message sans avoir vu votre exemple 2. Où les "\par" doivent-ils être sur l'exemple 1 du coup?122416
  • Le code ici ne permet pas les coupures de pages. Il vaut mieux réutiliser la structure de mon dernier exemple (tu aurais pu le faire en exercice...) :
    \documentclass{article}
    \usepackage{amsmath}
    \usepackage{nicematrix}
    
    % Seulement pour montrer le centrage
    \usepackage{tikzpagenodes}
    \usepackage{showframe}
    \renewcommand{\ShowFrameLinethickness}{0.15pt}
    \renewcommand*{\ShowFrameColor}{\color{blue!30!white}}
    
    % On pourrait se contenter de macros
    \newlength{\zooooota}
    \setlength{\zooooota}{2ex}
    \newlength{\zoooootb}
    \setlength{\zoooootb}{2ex}
    
    \NewDocumentCommand{\UneMatrice}{m}{%
      \par\noindent \hspace*{0.5\linewidth}%
      \makebox[0pt]{$#1$}%
      \par
    }
    
    \NewDocumentEnvironment{operations}{}
      {%
       \par\vspace{\zooooota}%
       \noindent \setlength{\arraycolsep}{0pt}$\begin{array}{ll}%
      }
      {\end{array}$\par}
    
    \NewCommandCopy{\exchange}{\leftrightarrow}
    
    \begin{document}
    
    \noindent
    \tikz[remember picture, overlay]
      \draw[red, opacity=0.5] (current page text area.north) --
                              (current page text area.south);%
    %
    Exemple 1 :\par\nopagebreak\vspace{1ex}
    \UneMatrice
      {
        \begin{pNiceMatrix}[margin]
         1 & 2 & -3 \\
         2 & 1 & 0 \\
         3 & 0 & 3 \\
         -1 & -2 & 3 \\
         -2 & -3 & 4 \\
         4 & -1 & 6 \\
        \end{pNiceMatrix}
      }
    
    \begin{operations}
      L_2      & {}\gets L_2 - 2 L_1 \\
      L_{2353} & {}\gets L_3 - 3 L_1 \\
      L_4      & {}\gets L_4 + L_1   \\
      L_2      & {}\exchange L_4     \\
      L_6      & {}\gets L_6 - 4 L_1
    \end{operations}
    
    \vspace{\zoooootb}
    \UneMatrice
      {
        \begin{pNiceMatrix}[margin]
         1 & 22222222 & -33333333 \\
         2 & 1 & 0 \\
         3 & 0 & 3 \\
         -1 & -2 & 3 \\
         -2 & -3 & 4 \\
         4 & -1 & 66666666666 \\
        \end{pNiceMatrix}
      }
    
    \begin{operations}
     L_2      & {}\gets L_2 - 2 L_1 \\
     L_{2353} & {}\gets L_3 - 3 L_1 \\
     L_4      & {}\gets L_4 + L_1   \\
     L_2      & {}\exchange L_4     \\
     L_6      & {}\gets L_6 - 4 L_1
    \end{operations}
    
    \end{document}
    
    La règle que j'ai donnée sur \par et les coupures de page est probablement vraie sur mes exemples de ce fil mais n'est pas vraie en toute généralité (ça dépend de ce qu'il y a avant \par ; lire le chapitre 15 du TeXbook). Si la politique de coupures de pages est bien définie, je peux examiner mon code pour m'assurer qu'elle sera respectée.122420
  • @brian Merci pour vos exemples, ça marche parfaitement maintenant!

    J'en suis arrivé au moment où j'ai une matrice trop grosse qui sort de la page. Pour le moment, je m'en suis sorti avec l'instruction
    {\tiny\[ \begin{pNiceMatrix}[margin] ... \end{pNiceMatrix} \]}.
    
    Y a-t-il une instruction permettant de caler la matrice exactement aux dimensions de la page (pour avoir les coefficients écrits le plus gros possible tout en ayant les parenthèses de la matrice pile au bord des marges; contrairement à "\tiny" où la matrice est bien incluse dans la page mais où elle pourrait être un peu plus grosse) ?
  • \usepackage{graphicx} et \resizebox{\linewidth ou \textwidth}{!}{$\$\ldots\$$}. Attention aux yeux des lecteurs...
  • @brian merci beaucoup!

    Dois-je obligatoirement sortir de l'environnement "operations" pour avoir cette fois un alignement centré des blocs? C'est dans le cas où j'ai un certain nombre d'opérations et où je voudrais ajouter un "\vdots" (cf photo). Le premier essai est dans l'environnement "operations", le deuxième est réalisé avec un environnement "array{c}", et permet d'avoir le "\vdots" centré, mais est légèrement décalé sur la droite. Y a-t-il un moyen de concilier les deux?122488
  • N'as-tu pas simplement oublié \noindent avant ton array ?

    Par ailleurs, tu peux faire ton \vdots centré en restant dans l'environnement 'operations' :
    \begin{operations}
     L_2      & {}\gets L_2 - 2 L_1 \\
     L_{2353} & {}\gets L_3 - 3 L_1 \\
     L_4      & {}\gets L_4 + L_1   \\
     \multicolumn{2}{c}{\vdots}\\
     L_2      & {}\exchange L_4     \\
     L_6      & {}\gets L_6 - 4 L_1
    \end{operations}
    
    Pour avoir un balisage sémantique, le mieux serait de définir une commande \pointpointpoint à l'intérieur de l'environnement 'operations', qui se développe en \multicolumn{2}{c}{\vdots}\\ (avec ou sans le \\ final, selon les goûts). Cela ne présente aucune difficulté.122492
  • Si ce n'était pas \noindent, cela pouvait être 0.5\arraycolsep. À supprimer comme déjà indiqué ici (deux méthodes).
  • @brian désolé pour la réponse tardive. Ça a très bien marché, merci beaucoup!
  • OK, merci pour la confirmation.
  • Bonjour,
    Désolé de rouvrir ce post (j'utilise régulièrement les suggestions de cette page mais je viens d'avoir un problème que je n'ai pas eu avant et auquel je ne trouve aucune solution). Je cherche, dans les blocs "opérations", à mettre une accolade autour de certaines opérations élémentaires pour indiquer par exemple lorsque je permute des lignes. Voici ce que j'ai fait:
    \documentclass{article}
    \usepackage{amsmath}
    \usepackage{nicematrix}
    \newlength{\zooooota}
    \setlength{\zooooota}{2ex}
    
    \NewDocumentEnvironment{operations}{}
      {%
       \par\vspace{\zooooota}%
       \noindent \setlength{\arraycolsep}{0pt}$\begin{array}{ll}%
      }
      {\end{array}$\par}
    
    
    \begin{document}
    
    Bloc normal:
    
    \begin{operations}
    L_1 & {}\gets L_1 +6L_3 \\
    L_2 & {}\gets L_2-3L_3 \\
    L_4 & {}\gets L_5 \\ 
    L_5 & {}\gets L_7 \\
    L_7 & {}\gets L_6/3 \\ 
    L_6 & {}\gets L_4
    \end{operations}
    \vspace{\zooooota}
    
    Bloc modifié:
    
    \begin{operations}
    L_1 & {}\gets L_1 +6L_3 \\
    L_2 & {}\gets L_2-3L_3 \\
    \left.
    \begin{array}{ll}
    L_4 & {}\gets L_5 \\ 
    L_5 & {}\gets L_7 \\
    L_7 & {}\gets L_6/3 \\ 
    L_6 & {}\gets L_4
    \end{array}
    \right \} \text{(permutation de lignes)}
    \end{operations}
    
    
    \end{document}
    

    Le résultat est attaché en capture d'écran. Comment faire pour que l'accolade reste au même niveau mais que les opérations élémentaires qui sont maintenant décalées retrouvent leur place? J'ai fait quelques tentatives mais infructueuses pour le moment (je précise ne pas encore avoir essayé de solution via Tikz, qui peut faire des accolades je crois; je pense qu'on doit pouvoir s'en passer mais je ne vois pas comment).

    Je vous remercie d'avance!

    Adrien124618
  • Bonjour,
    \begin{operations}
    L_1 & {}\gets L_1 +6L_3 \\
    L_2 & {}\gets L_2-3L_3 \\
    [b]\end{operations}
    \begin{operations}[/b]
    \left.
    \begin{array}{ll}
    L_4 & {}\gets L_5 \\ 
    L_5 & {}\gets L_7 \\
    L_7 & {}\gets L_6/3 \\ 
    L_6 & {}\gets L_4
    \end{array}
    \right \} \text{(permutation de lignes)}
    \end{operations}
    
  • @Médiat merci pour votre réponse! Lorsque j'ai essayé de compiler, il restait une espace entre les deux premières lignes et les suivantes; mais votre solution m'a donnée l'idée de faire un second environnement, sans l'espace verticale au début (voir "bloc modifié" dans le code ci-après):
    \documentclass{article}
    \usepackage{amsmath}
    \usepackage{nicematrix}
    \newlength{\zooooota}
    \setlength{\zooooota}{2ex}
    
    \NewDocumentEnvironment{operations}{}
      {%
       \par\vspace{\zooooota}%
       \noindent \setlength{\arraycolsep}{0pt}$\begin{array}{ll}%
      }
      {\end{array}$\par}
      
    \NewDocumentEnvironment{operationsdeux}{}
      {%
       \noindent \setlength{\arraycolsep}{0pt}$\begin{array}{ll}%
      }
      {\end{array}$\par}
    
    
    \begin{document}
    
    Bloc normal:
    
    \begin{operations}
    L_1 & {}\gets L_1 +6L_3 \\
    L_2 & {}\gets L_2-3L_3 \\
    L_4 & {}\gets L_5 \\ 
    L_5 & {}\gets L_7 \\
    L_7 & {}\gets L_6/3 \\ 
    L_6 & {}\gets L_4 \\
    L_7 & {}\gets L_7 - 2 L_6 \\
    L_8 & {}\gets L_8 - L_2
    \end{operations}
    \vspace{\zooooota}
    
    Bloc modifié:
    
    \begin{operations}
    L_1 & {}\gets L_1 +6L_3 \\
    L_2 & {}\gets L_2-3L_3 \\
    \end{operations}
    \begin{operationsdeux}
    \left.
    \begin{array}{ll}
    L_4 & {}\gets L_5 \\ 
    L_5 & {}\gets L_7 \\
    L_7 & {}\gets L_6/3 \\ 
    L_6 & {}\gets L_4
    \end{array}
    \right \} \text{(permutation de lignes)}
    \end{operationsdeux}
    \begin{operationsdeux}
    L_7 & {}\gets L_7 - 2 L_6 \\
    L_8 & {}\gets L_8 - L_2
    \end{operationsdeux}
    \vspace{\zooooota}
    
    Bloc à gauche et à droite :\\
    
    \noindent $\text{À gauche : } \left\{
        \begin{array}{ll}
            L_1 & {}\gets L_1 +6L_3 \\
    L_2 & {}\gets L_2-3L_3 
        \end{array}
    \right.$\\
    $\text{À droite : } \left\{
        \begin{array}{ll}
    L_4 & {}\gets L_5 \\ 
    L_5 & {}\gets L_7 \\
    L_7 & {}\gets L_6/3 \\ 
    L_6 & {}\gets L_4
        \end{array}
    \right.$
    
    
    
    \end{document}
    

    J'ai cependant l'impression que les lignes entre accolades sont très légèrement décalées sur la droite (voir capture d'écran). Est-ce une impression ou est-ce bien réel (auquel cas, comment le résoudre)?

    J'essaye également de faire (pour des pivots simultanés avec deux matrices en même temps), un bloc d'opérations où l'on ferait des opérations en même temps sur la matrice de gauche, et sur la matrice de droite. J'ai mis une tentative ("bloc à gauche et à droite"), mais je souhaiterais que les accolades soient alignées (tout en gardant les textes "à gauche" et "à droite" alignés sur la gauche; donc en changeant juste l'espacement après les deux points), et aussi que les flèches soient à la distance habituelle des $L_1$, $L_2$, etc... (là il y a un gros espace avant les flèches). J'ai essayé d'utiliser l'environnement "operations" et j'ai aussi essayé de le modifier, mais il me renvoie à chaque fois un message d'erreur (ou un résultat qui ne va pas dans les cas où ça compile sans erreur). Quelqu'un a-t-il une solution?124682
  • 1) Le décalage à droite vient de \nulldelimiterspace (largeur de \left.). Comme le montre le code ci-dessous, on peut le mettre à 0pt avant la fin de la formule.

    2) Pour aligner des choses, il faut penser aux alignements TeX, qui ont donné tabular et array en LaTeX. Ici, un tabular fait très bien l'affaire. L'espace excessif autour des flèches est évidemment dû à \arraycolsep ; il faut soit le mettre à zéro comme le fait l'environnement 'operations', soit utiliser @{} dans le préambule des arrays.

    La seule difficulté du 2) vient de ce que les deux accolades extensibles n'ont pas la même largeur, donc si on les fait commencer à la même abscisse, elles ne finissent pas à la même abscisse, ce qui casse l'alignement du contenu hors accolades des deux blocs. Je propose une solution avec des marques PGF pour calculer la différence de largeur des accolades et répartir l'espace correspondant de part et d'autre de l'accolade la plus petite.
    \documentclass{article}
    \usepackage{amsmath}
    \usepackage{array}
    \usepackage{tikz}
    \usetikzlibrary{tikzmark}
    
    \newlength{\zooooota}
    \setlength{\zooooota}{2ex}
    
    \newdimen\decalage
    
    \NewDocumentEnvironment{operations}{}
      {%
       \par\vspace{\zooooota}%
       \noindent \setlength{\arraycolsep}{0pt}$\begin{array}{ll}%
      }
      {\end{array}$\par}
    
    \NewDocumentEnvironment{operationsdeux}{}
      {%
       \par\noindent \setlength{\arraycolsep}{0pt}$\begin{array}{ll}%
      }
      {\end{array}$\par}
    
    
    \begin{document}
    
    Bloc normal:
    
    \begin{operations}
    L_1 & {}\gets L_1 +6L_3 \\
    L_2 & {}\gets L_2-3L_3 \\
    L_4 & {}\gets L_5 \\
    L_5 & {}\gets L_7 \\
    L_7 & {}\gets L_6/3 \\
    L_6 & {}\gets L_4 \\
    L_7 & {}\gets L_7 - 2 L_6 \\
    L_8 & {}\gets L_8 - L_2
    \end{operations}
    \vspace{\zooooota}
    
    Bloc modifié:
    
    \begin{operations}
    L_1 & {}\gets L_1 +6L_3 \\
    L_2 & {}\gets L_2-3L_3 \\
    \end{operations}
    
    \noindent
    $\left.
    \setlength{\arraycolsep}{0pt}
    \begin{array}{ll}
    L_4 & {}\gets L_5 \\
    L_5 & {}\gets L_7 \\
    L_7 & {}\gets L_6/3 \\
    L_6 & {}\gets L_4
    \end{array}
    \right \} \text{(permutation de lignes)} \nulldelimiterspace=0pt$
    
    \begin{operationsdeux}
    L_7 & {}\gets L_7 - 2 L_6 \\
    L_8 & {}\gets L_8 - L_2
    \end{operationsdeux}
    
    \medskip
    Bloc à gauche et à droite :
    
    \nopagebreak\smallskip\noindent
    \begin{tabular}{@{} l @{} >{$} l <{$} @{}}
    À gauche : &
    \iftikzmarkexists{a0}
      % Calcul de la différence de largeur des deux accolades. On la met dans
      % \decalage.
      \begin{tikzpicture}[remember picture, overlay]
        \makeatletter
        \tikz@scan@one@point\pgfutil@firstofone (pic cs:a0)\relax
        \global\decalage=           +\pgf@x
        \tikz@scan@one@point\pgfutil@firstofone (pic cs:b0)\relax
        \global\advance\decalage by -\pgf@x
        \tikz@scan@one@point\pgfutil@firstofone (pic cs:a1)\relax
        \global\advance\decalage by -\pgf@x
        \tikz@scan@one@point\pgfutil@firstofone (pic cs:b1)\relax
        \global\advance\decalage by +\pgf@x
        \makeatother
      \end{tikzpicture}
    \else
      \global\decalage=0pt
    \fi
    %
    \hspace{0.5\decalage}
    \pgfmark{a0}
    \left\{
    \pgfmark{b0}
    \hspace{0.5\decalage}
      \begin{array}{@{} l @{} l @{}}
        L_1 & {}\gets L_1 +6L_3 \\
        L_2 & {}\gets L_2-3L_3
      \end{array}
    \right. \\[2ex]
    À droite : &
    \pgfmark{a1}
    \left\{
    \pgfmark{b1}
      \begin{array}{@{} l @{} l @{}}
        L_4 & {}\gets L_5 \\
        L_5 & {}\gets L_7 \\
        L_7 & {}\gets L_6/3 \\
        L_6 & {}\gets L_4
        \end{array}
    \right.
    \end{tabular}
    
    \end{document}
    
    Edit : ajout de \iftikzmarkexists{a0}... \fi pour que la première compilation se passe bien.124836
    124840
  • @Brian merci (toujours un peu tard :-( ) pour ces solutions, qui ont bien fonctionné.
    Je cherche encore à réaliser deux choses: la première est de rendre tous les blocs "insécables" quand on change de page. C'est bon pour le premier bloc, mais pour les "blocs modifiés" et "blocs à gauche et à droite", il y a plusieurs sous-blocs qui peuvent se retrouver sur des pages différentes. Est-ce que rentrer le tout dans une "boîte" peut-être une bonne solution (ou sinon comment faire)?
    Seconde question: j'ai un bloc de type "à gauche et à droite" où la partie "à droite" ne comprend qu'une seule ligne. Je souhaite donc retirer l'accolade de cette ligne, mais garder l'alignement du "$L$" par rapport à la partie "bloc à gauche", qui elle comprend une accolade. J'ai essayé de modifier le code proposé par Brian, sans succès. Comment le modifier?

    Enfin, pour pouvoir essayer de faire de telles solutions moi-même à l'avenir, quel document décrit les instructions telles que "\pgfmark" utilisées par Brian? J'ai cherché dans le document suivant: https://ctan.mines-albi.fr/graphics/pgf/base/doc/pgfmanual.pdf
    sans succès (pour être honnête, devant le nombre de pages j'ai juste lancé des recherches dans tout le document contenant certains mots clés utilisés dans le code comme "\pgfmark"; peut-être qu'il y a les explications dans le document mais ma recherche n'a rien renvoyée).

    Je vous remercie d'avance pour vos réponses!

    Adrien
  • Bonjour,

    1) Un tabular ou un array n'est pas sécable. Pour en englober plusieurs dans un bloc insécable, il est possible d'utiliser :
    \par\noindent
    \begin{minipage}{\linewidth}
    ...
    \end{minipage}
    
    Autre possibilité : mettre \nopagebreak aux points de coupure adéquats (typiquement, juste après \par). À ce sujet, lire le chapitre 15 du TeXbook.

    2) Comme indiqué en commentaire, mon code calcule la différence de largeur des deux accolades ouvrantes et met le résultat dans \decalage afin d'insérer deux \hspace totalisant cette différence à l'endroit où l'accolade est la plus étroite (un avant l'accolade la plus étroite, l'autre après). Dans le nouveau cas évoqué, si l'on utilise un délimiteur nul \left. en lieu et place de la deuxième accolade, ce \left. sera le délimiteur le plus étroit des deux. La différence calculée, $(x_{b_1} - x_{a_1}) - (x_{b_0} - x_{a_0})$, sera alors négative ($a_0$ et $b_0$ sont des points placés de part et d'autre du premier délimiteur ouvrant ; même chose pour $a_1$ et $b_1$ de part et d'autre du second). Le problème est résolu en mettant un \hspace{-\decalage} (longueur positive, donc) avant ou après le délimiteur \left. :
    \documentclass{article}
    \usepackage{amsmath}
    \usepackage{array}
    \usepackage{tikz}
    \usetikzlibrary{tikzmark}
    
    \newdimen\decalage
    
    \begin{document}
    
    \noindent
    \begin{tabular}{@{} l @{} >{$} l <{$} @{}}
    À gauche : &
    \iftikzmarkexists{a0}
      % Calcul de la différence de largeur des deux délimiteurs ouvrants. On la
      % met dans \decalage.
      \begin{tikzpicture}[remember picture, overlay]
        \makeatletter
        \tikz@scan@one@point\pgfutil@firstofone (pic cs:a0)\relax
        \global\decalage=           +\pgf@x
        \tikz@scan@one@point\pgfutil@firstofone (pic cs:b0)\relax
        \global\advance\decalage by -\pgf@x
        \tikz@scan@one@point\pgfutil@firstofone (pic cs:a1)\relax
        \global\advance\decalage by -\pgf@x
        \tikz@scan@one@point\pgfutil@firstofone (pic cs:b1)\relax
        \global\advance\decalage by +\pgf@x
        \makeatother
      \end{tikzpicture}
    \else
      \global\decalage=0pt
    \fi
    %
    \pgfmark{a0}
    \left\{
    \pgfmark{b0}
      \begin{array}{@{} l @{} l @{}}
        L_1 & {}\gets L_1 +6L_3 \\
        L_2 & {}\gets L_2-3L_3
      \end{array}
    \right. \\[2ex]
    À droite : &
    \hspace{-\decalage}
    \pgfmark{a1}
    \left.
    \pgfmark{b1}
      \begin{array}{@{} l @{} l @{}}
        L_4 & {}\gets L_5
        \end{array}
    \right.
    \end{tabular}
    
    \end{document}
    
    3) L'utilisation de \pgfmark est rendue possible par la ligne \usetikzlibrary{tikzmark}. La commande 'texdoc tikzmark' affiche la documentation de cette bibliothèque TikZ, qui explique bien ce que fait \pgfmark.127002
Connectez-vous ou Inscrivez-vous pour répondre.
Success message!