Tikz pour dessins avec matrices ?
dans LaTeX
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 !
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 !
Connectez-vous ou Inscrivez-vous pour répondre.
Réponses
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').
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?
- 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). Edit : remplacement de 'line-style={}' par 'line-style=solid'.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.
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).
x & y\\
z & t
\end{pmatrix}$ bizarre, le gros zéro en bas à gauche et quelques petites améliorations d'ordre esthétique :
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 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).
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!
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).
Est-ce que ça marche?
(*) Ces nœuds sont automatiquement créés du fait de l'utilisation de 'matrix of math nodes'.
Que signifient les "\arraycolsep" dans votre code (et quel est leur effet sur le "shift")?
Premier code.
Second code. Quelle est la bonne solution ?
Deuxième code : Note : techiquement, les deux méthodes utilisent TikZ car nicematrix s'appuie fortement dessus.
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:
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 ;-)
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é:
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?
Ton code donne lieu à une erreur assez méchante : (6 fois). C'est parce que tu as modifié le style 'fleche' pour prendre 5 arguments : mais tu n'en passes que 4 : 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 : 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 :
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 ») :
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) :
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) : Petite variante assez proche : 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.
Note : il existe aussi les clés 'draw opacity', 'fill opacity' et 'text opacity'.
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:
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!
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 :
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à: 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...?
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é) : Code modifié : (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).