Matrices par blocs avec blkarray

L’auteur de ce sujet a trouvé une solution à son problème.
Auteur du sujet

Bonjour à tous,

Je me tourne vers vous var je ne vois pas comment gérer mon problème. Je voudrais tracer une matrice de quatre blocs A,B,C et 0, en explicitant les blocs (i.e. en traçant des lignes horizontales et verticales entres les blocs). Jusqu’ici, pas trop de problèmes, mais cela se corse lorsque j’essaye d’ajouter au-dessus du trait vertical un vecteur (e_p), tout comme à côté du trait horizontal. Le problème étant que si je ne précise rien à \BAhline, il me trace le trait jusqu’à côté de la matrice, et en utilisant \BAhhline, cela agrandit la ligne d’en dessous (et accessoirement, cela dépasse un peu des parenthèses). J’ai bien vu que ce dernier problème est signalé dans la documentation, mais elle ne donne pas de commandes explicites pour régler le problème, juste quelle variable (si j’ai bien compris) est en cause. Les deux matrices que je souhaiterai tracer ressemblent à ça (dans l’idée) :

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
\documentclass[a4paper, 11pt, twocolumn, landscape]{report}
\usepackage{amsmath}
\usepackage{blkarray}
\usepackage{yhmath}

\makeatletter
\newlength\BA@height
\def\BA@leftdel#1#2#3{%
  \setlength\BA@height{\dimen\z@}%
  \addtolength\BA@height{2pt}%
  \llap{%
    {#1}$\left#2\vrule height \BA@height width\z@ \right.$\kern-#3}}

\def\BA@rightdel#1#2#3{%
  \setlength\BA@height{\dimen\z@}%
  \addtolength\BA@height{2pt}%
  \rlap{%
    \kern-#3$\left.\vrule height \BA@height width\z@ \right#1${#2}}}%
\makeatother

\begin{document}

\[
    \begin{blockarray}{cccccc}
        \overset{N_1}{\leftrightarrow} & \overset{N_2}{\leftrightarrow} & & & \overset{N_n}{\leftrightarrow} &\\
        \begin{block}{(c|c|c|c|c)c}
            A_1 & 0 & 0 & 0 & 0 & \updownarrow N_1 \\
            \BAhhline{-----}
            0 & A_2 & 0 & 0 & 0 & \updownarrow N_2 \\
            \BAhhline{-----}
            0 & 0  & \ddots & 0 & 0 & \\
            \BAhhline{-----}
            0 & 0  & 0 & \ddots & 0 & \\
            \BAhhline{-----}
            0 & 0 & 0 & 0 & A_n & \updownarrow N_n \\
        \end{block}
    \end{blockarray}
\]

\[
    \begin{blockarray}{ccc}
        & e_p & \\
        \begin{block}{(c|c)c}
            A & C & e_p\\
            \BAhhline{--|}
            0 & D &\\
        \end{block}
    \end{blockarray}
\]

\end{document}

Les commandes du préambule ont été trouvées sur cette page. L’objectif étant pour la première matrice de ne pas avoir les traits qui dépassent de la matrice, et pour l’autre d’avoir les annotations en face des traits.

De plus, dans la première matrice, je ne sais pas si ma manière de placer les flèches est bonne ou s’il y a quelque chose de prévu dans blkarray pour ça (en regardant rapidement, je n’ai pas trouvé en tout cas).

Au passage, j’ai inclus le package yhmath, clairement pas utile ici, mais néanmoins présent dans mon code total, comme il apparaît que le dépassement est plus marqué dans la première matrice en sa présence.

Merci d’avance,

BunshinKage

Édité par BunshinKage

Without geometry, life is pointless.

+0 -0

Cette réponse a aidé l’auteur du sujet

Dans des cas comme ça, mieux vaut bidouiller avec des primitives de TeX (et savoir exactement ce que l’on fait) plutôt que d’essayer de comprendre ce que fait une extension aussi complexe que blkarray.

Le code que je propose se passe donc totalement de blkarray :

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
\documentclass[a4paper, 11pt, twocolumn, landscape]{report}
\usepackage{amsmath,array,yhmath}
\newcommand\agauche[2][2em]{\hbox to0pt{\hskip#1$#2$\hss}}
\newcommand\audessus[3][2ex]{%
    \setbox0\hbox{$#2$}\vbox to\ht0{
        \offinterlineskip\vss
        \hbox to \wd0{\hss$#3$\hss}%
        \kern\dimexpr#1\relax\hbox{$#2$}%
    }%
}
\def\annotation#1{\audessus[2.5ex]{}{\kern.4pt #1}\gdef\annotation##1{}}
\begin{document}

\[
\left(
\begin{array}{>{\vphantom\ddots}c|c|c|c|c}
    \audessus{A_1}{\overset{N_1}\leftrightarrow} & \audessus0{\overset{N_2}{\leftrightarrow}} & 0 & 0 & \audessus0{\overset{N_n}{\leftrightarrow}}\agauche{\updownarrow N_1}\\\hline
    0 & A_2 & 0 & 0 & 0\agauche{\updownarrow N_2}\\\hline
    0 & 0  & \ddots & 0 & 0\\\hline
    0 & 0  & 0 & \ddots & 0\\\hline
    0 & 0 & 0 & 0 & A_n\agauche{\updownarrow N_n}\\
\end{array}
\right)
\]text
\bigbreak
\[
\left(
\begin{array}{c@{\kern0.5em\vrule\relax\annotation{e_p}\kern.5em}c}
    A & C\agauche[1.5em]{\setbox0\hbox{\lower 1.5ex\hbox{$e_p$}}\ht0=0pt \dp0=0pt \box0} \\\hline
    0 & D\\
\end{array}
\right)
\]
\end{document}
+1 -0
Auteur du sujet

Eh bien… Wow, merci beaucoup c’est parfait Ôo

Juste, où apprend-t-on à manipuler les primitives de TeX, et est-ce vraiment utile ? Je veux dire, là on a un exemple typique d’un cas où c’est utile, mais sachant les manipuler, s’en sert-on souvent ? Savoir si je devrais m’y plonger ou non.

Merci encore en tout cas !

Without geometry, life is pointless.

+0 -0

Eh bien… Wow, merci beaucoup c’est parfait Ôo

Ce n’est pas « parfait » car les indications hors de la matrice ne sont pas dans la boite englobante (on pourrait y remédier mais bon). Il faut y faire attention et prévoir une espace verticale supplémentaire pour garder une cohérence avec le reste des maths hors texte.

Juste, où apprend-t-on à manipuler les primitives de TeX

TeXbook, TeX pour l’impatient, et de nombreux autres ouvrages consacrés à TeX.

et est-ce vraiment utile ?

Oui mais surtout, on comprend ce qui se passe en coulisse. La compréhension des mécanismes sous-jacents et tout aussi importante que l’utilité. On peut aussi vivre sans comprendre et se contenter d’utiliser les nombreux « packages » que l’on doit alors voir comme des « boites noires » magiques…

+1 -0
Vous devez être connecté pour pouvoir poster un message.
Connexion

Pas encore inscrit ?

Créez un compte en une minute pour profiter pleinement de toutes les fonctionnalités de Zeste de Savoir. Ici, tout est gratuit et sans publicité.
Créer un compte