6

I am working on my dissertation and I have no idea how I should do this in LaTeX.

And the shading definitely is challenging.

enter image description here

I have only been able to do this so far, I am still an amateur at it.

\usepackage{color}
\newcommand\x{\times}
\newcommand\y{\cellcolor{green}}

\begin{document}
\begin{equation*}
   \left[
  \begin{array}{ccc}
\y & \y    & \y   \\
   & \y   & \y R  \\
   &       & \y   \\
\end{array}
 \right]\left[
     \begin{array}{c}
        \\
       a_j \\
        \\
     \end{array}
   \right]=
\end{equation*}
\end{document}

output

4

With TikZ matrix:

\documentclass{article}
\usepackage{amsmath}
\usepackage{tikz}
\usetikzlibrary{matrix,  positioning, patterns, backgrounds}
\tikzset{
    every matrix/.append style={
        matrix of math nodes,
        nodes in empty cells,
        inner sep=0pt,
        outer sep=0pt,
        column sep=-\pgflinewidth,
        row sep=-\pgflinewidth,
        },
    mylargenode/.style={
        text centered,
        text width=30pt,
        text height=20pt,
        text depth=10pt,
    },
    mylongnode/.style={
        text centered,
        text width=20pt,
        text height=40pt,
        text depth=30pt,
    },
    mysmallnode/.style={
        text centered,
        text width=20pt,
        text height=20pt,
        text depth=10pt,
    },
    mylonglargenode/.style={
        text centered,
        text width=30pt,
        text height=40pt,
        text depth=30pt,
    },
}

\begin{document}
With delimiters like in your image:
\[
\begin{tikzpicture}
\matrix[
    nodes={mylargenode},
    column 6/.style={nodes={mysmallnode}},
    row 6/.style={nodes={mylonglargenode}}
    ] (A) {%
    &&&&&|[draw=blue, fill=blue!10!white]| \\
    &&&&&|[draw=blue, fill=blue!30!white]|\\
    &&&&&|[draw=blue, fill=blue!50!white]|\\
    &&&&&|[draw=blue,dotted]| \\
    &&&&&|[draw=blue, fill=blue!70!white]|\\
    &&&&& |[mylongnode,pattern=crosshatch,pattern color=blue!40!white, draw=blue]|\Dot{F}\\
    };
\begin{scope}[on background layer]
\foreach \ind in {1,2,3,5}
    {
    \draw[green!70!black,fill=green!40!lightgray] (A-\ind-\ind.north west) -- (A-\ind-\ind.north east) -- (A-\ind-\ind.south east) -- cycle;
    \node[anchor=north east] at (A-\ind-\ind.north east) {R};
    }
\end{scope}
\draw[dotted, green!70!black] (A-4-4.north west) -- (A-4-4.north east) -- (A-4-4.south east) -- cycle;
\node[font=\Huge,shift={(-1,-2)}] at (A) {$0$}; 
\node[font=\Huge,shift={(1,3)}] at (A) {$0$};
\matrix[
    right =of A.north east,
    anchor=north west,
    nodes={mysmallnode}
    ] (B) {%
    \underline{a}_1  \\
    \underline{a}_2 \\
    \underline{a}_3 \\
    \\
    \underline{a}_M\\
    \underline{b}\\
    };
\foreach \ind in {1,2,...,5}{
    \draw (B-\ind-1.south west) -- (B-\ind-1.south east);
}
\draw[dotted] (B-4-1.north) -- (B-4-1.south);
\matrix[
    right =4em of B.north east,
    anchor=north west,
    nodes={draw,mysmallnode}
    ] (C) {%
    |[fill=yellow!10!white]|\\
    |[fill=yellow!30!white]|\\
    |[fill=yellow!50!white]|\\
    \\
    |[fill=yellow!70!white]|\\
    |[mylongnode, pattern=horizontal lines, pattern color=yellow!90!white]|\underline{\Dot{f}}\\
    };
\path (B-4-1) -- node[midway] {$=$} (C-4-1);
\draw[dotted] (C-4-1.north) -- (C-4-1.south);
% delimiters:
\foreach \mymatr in {A,B,C}
{
\draw[very thick] ([xshift=4pt]\mymatr.north west) -- (\mymatr.north west) -- (\mymatr.south west) -- ([xshift=4pt]\mymatr.south west);
\draw[very thick] ([xshift=-4pt]\mymatr.north east) -- (\mymatr.north east) -- (\mymatr.south east) -- ([xshift=-4pt]\mymatr.south east);
}
\end{tikzpicture}
\]

Or with ordinary delimiter:
\[
\begin{tikzpicture}[   
    every matrix/.append style={
        left delimiter={[},
        right delimiter={]},
        }
 ]
\matrix[
    nodes={mylargenode},
    column 6/.style={nodes={mysmallnode}},
    row 6/.style={nodes={mylonglargenode}}
    ] (A) {%
    &&&&&|[draw=blue, fill=blue!10!white]| \\
    &&&&&|[draw=blue, fill=blue!30!white]|\\
    &&&&&|[draw=blue, fill=blue!50!white]|\\
    &&&&&|[draw=blue,dotted]| \\
    &&&&&|[draw=blue, fill=blue!70!white]|\\
    &&&&& |[mylongnode,pattern=crosshatch,pattern color=blue!40!white, draw=blue]|\Dot{F}\\
    };
\begin{scope}[on background layer]
\foreach \ind in {1,2,3,5}
    {
    \draw[green!70!black,fill=green!40!lightgray] (A-\ind-\ind.north west) -- (A-\ind-\ind.north east) -- (A-\ind-\ind.south east) -- cycle;
    \node[anchor=north east] at (A-\ind-\ind.north east) {R};
    }
\end{scope}
\draw[dotted, green!70!black] (A-4-4.north west) -- (A-4-4.north east) -- (A-4-4.south east) -- cycle;
\node[font=\Huge,shift={(-1,-2)}] at (A) {$0$}; 
\node[font=\Huge,shift={(1,3)}] at (A) {$0$};
\matrix[
    right =of A.north east,
    anchor=north west,
    nodes={mysmallnode}
    ] (B) {%
    \underline{a}_1  \\
    \underline{a}_2 \\
    \underline{a}_3 \\
    \\
    \underline{a}_M\\
    \underline{b}\\
    };
\foreach \ind in {1,2,...,5}{
    \draw (B-\ind-1.south west) -- (B-\ind-1.south east);
}
\draw[dotted] (B-4-1.north) -- (B-4-1.south);
\matrix[
    right =4em of B.north east,
    anchor=north west,
    nodes={draw,mysmallnode}
    ] (C) {%
    |[fill=yellow!10!white]|\\
    |[fill=yellow!30!white]|\\
    |[fill=yellow!50!white]|\\
    \\
    |[fill=yellow!70!white]|\\
    |[mylongnode, pattern=horizontal lines, pattern color=yellow!90!white]|\underline{\Dot{f}}\\
    };
\path (B-4-1) -- node[midway] {$=$} (C-4-1);
\draw[dotted] (C-4-1.north) -- (C-4-1.south);
\end{tikzpicture}
\]
\end{document}

enter image description here

  • How nice is yours, too. I'll vote for it now. – Sebastiano Mar 17 at 21:43
  • 1
    @Sebastiano Thank you! – CarLaTeX Mar 17 at 21:47
  • I used this one in my dissertation and I am very happy with the result. – Tarini Ramsewak Mar 18 at 14:33
  • @TariniRamsewak You're welcome! I'm happy my answer is useful. – CarLaTeX Mar 18 at 14:40
  • Hello, I had a question. Is it possible to resize this structure without manipulating any of the environments? I tried using the figure environment(scale=0.5), but it does not work. @CarLaTeX – Tarini Ramsewak Mar 22 at 17:17
11

It is indeed a bit tedious. (EDIT: Fixed the first R to become math mode, mille grazie to @Sebastiano!)

\documentclass[tikz,border=3.14mm]{standalone}
\usetikzlibrary{positioning,backgrounds,patterns}
\begin{document}
\begin{tikzpicture}
 \begin{scope}[local bounding box=mat1]
  \path node (R0) {$R$} foreach \X [remember=\X as \lastX (initially 0)] in
  {1,...,4}
  {\ifnum\X=3
    node[below right=1.5em of R\lastX] (R\X) {$\phantom{R}$}
   \else
    node[below right=1.5em of R\lastX] (R\X)  {$R$}
   \fi
   };
  \begin{scope}[on background layer]
   \draw[fill=green!70!black] 
   foreach \X in {0,1,2,4} {
   ([xshift=-1em]R\X.north west) -- ([yshift=-1em]R\X.south east)
   coordinate(b\X)
   |- cycle};
   \draw[densely dotted] ([xshift=-1em]R3.north west) -- ([yshift=-1em]R3.south east)
   coordinate(b3) |- cycle;
  \end{scope}
  \node[pattern=crosshatch,pattern color=purple,anchor=north west,
  minimum height=6em] (F) at ([yshift=-1em]R4.south east) {$F$}; 
  \draw[densely dotted] ([yshift=-1em]R3.south east-|R4.south east)
   rectangle  (F.east|-R3.north);
  \foreach \X [evaluate=\X as \Y using {int(40+10*\X)}] in {0,1,2,4} 
  {\draw[fill=purple!\Y] ([yshift=-1em]R\X.south east-|R4.south east)
   rectangle  (F.east|-R\X.north);}
 \end{scope} 
 \path (mat1.south west) -- (mat1.north east)
  node[pos=0.3,font=\Large] {$0$} node[pos=0.7,font=\Large] {$0$};
 \draw[thick] ([xshift=0.7em]mat1.north west) -| (mat1.south west) -- ++ (0.7em,0)
 ([xshift=-0.7em]mat1.north east) -| (mat1.south east) -- ++ (-0.7em,0);
 %
 \begin{scope}[local bounding box=mat2]
  \foreach \X [remember=\X as \lastX (initially 0)] in {1,2,3}
  {\path ([xshift=1em]mat1.east|-R\lastX.north) --
  ([xshift=2.5em]mat1.east|-b\lastX) node[midway] (a\X) {$a_{\X}$};}
  \path ([xshift=1em]mat1.east|-R4.north) --
  ([xshift=2.5em]mat1.east|-b4) node[midway] (aM) {$a_{M}$};
  \node[below=0.5em of aM] (b) {$b$}; 
 \end{scope}
 \draw[thick] ([xshift=0.5em]mat2.north west) -| (mat2.south west) -- ++ 
 (0.5em,0)
 ([xshift=-0.5em]mat2.north east) -| (mat2.south east) -- ++ (-0.5em,0);
  \foreach \X in {0,...,4}
  {\draw (mat2.west|-b\X) -- (mat2.east|-b\X);}
 %
 \node[anchor=west] (eq) at (mat2.east|-mat1.center) {$=$};
 %
 \begin{scope}[local bounding box=mat3]
  \node[pattern=dots,anchor=north west,pattern color=yellow!60!orange,
  minimum height=6em] (f) at ([xshift=0.1em]eq.east|-F.north) {$f$}; 
  \foreach \X [remember=\X as \lastX (initially 0),
  evaluate=\X as \Y using {int(30*\X+10)}] in {1,2,3}
  {\fill[yellow!\Y] ([xshift=0.1em]eq.east|-R\lastX.north) rectangle
  (f.east|-b\lastX); }
  \fill[yellow] ([xshift=0.1em]eq.east|-R4.north) rectangle
  (f.east|-b4); 
  \draw[densely dotted] (f.center|-b2) -- (f.center|-b3);
 \end{scope}
 \foreach \X in {0,...,4}
  {\draw (mat3.west|-b\X) -- (mat3.east|-b\X);}
 \draw[thick] ([xshift=0.3em]mat3.north west) -| (mat3.south west) -- ++ 
 (0.3em,0)
 ([xshift=-0.3em]mat3.north east) -| (mat3.south east) -- ++ (-0.3em,0);
\end{tikzpicture}
\end{document}

enter image description here

  • 1
    Spectacular! There is the first R on the top left that is not in math-mode. :-) – Sebastiano Mar 17 at 12:50
  • @Sebastiano Mille grazie! – user121799 Mar 17 at 14:42
  • 1
    @JouleV Thanks! The second code shouldn't be there so I removed it. (I have one file for answers and accidentally copied the code for another answer, too.) – user121799 Mar 17 at 15:06
  • I hope I've been of some help to you. This is what I so much regret about my mistakes, which are the result of naivety and which, by emphasizing my mistakes, the haters find fertile ground in my regard. Peraphs is better "grazie mille". Why? See this link youtube.com/watch?v=KvS_BVda9ww. :-) – Sebastiano Mar 17 at 21:41
  • Thank you very much, this has been useful. I learnt quite a few things. – Tarini Ramsewak Mar 18 at 13:43

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.