3

This is and addendum of the "Ingredients" section posted on a previous question: How to draw a diagram of custom subject correlativities.

We need two more ingredients:

  • Make an elective subject. We can label it as nonfillable elective subject:

    Non fillable elective subject

    Also, we need to have a fillable elective subject, called for example fillable elective subject:

    Fillable elective subject

    As said in the question, you can use this very helpful answer.

  • Make a shape that contains a set of elective subjects:

    Shape containing elective subjects

(Both the background color of the shape and the TextField's may vary. Do not worry about that).

What I need

  1. The last shape must be in the lower part of the big orange rectangle, without reaching all margins.
  2. The elective subjects can have different heights depending on the stack of elective subjects but the width is always the same, but the elective subjects inside it must be centered:

    Example

  3. Note that elective subjects do not relate to any object, so that's why we can reduce the width of the light blue shape.

What I have done

The same source code of marmot's answer:

\documentclass{article}
\usepackage[showframe,margin=0in,footskip=0.25in,paperwidth=50cm,paperheight=20cm]{geometry}
\usepackage[english]{babel}
\usepackage[utf8]{inputenc}
\usepackage[T1]{fontenc}
%\usepackage{globalvals}
\usepackage{hyperref}
\usepackage{tikz}
\usetikzlibrary{positioning,backgrounds,fit}
\tikzset{text field/.style={text height=1.5ex,align=center,rounded corners},
title field/.style={text height=2ex,text depth=0.3em,anchor=south,text
width=4.5cm,align=center,font=\footnotesize\sffamily},
pics/fillable subject/.style={code={%
\node[text field] (-TF) 
{\hspace*{-0.5em}\TextField[align=1,name=#1-day,width=1em,charsize=7pt,maxlen=2,bordercolor={1 1 1}]~~/\hspace*{-0.15em}\TextField[align=1,name=#1-month,width=1em,charsize=7pt,maxlen=2,bordercolor={1 1 1}]~~/\hspace*{-0em}\TextField[align=1,name=#1-year,width=2em,charsize=7pt,maxlen=4,bordercolor={1 1 1}]{}~};
\node[title field] (-Title) 
at ([yshift=0.4em]-TF.north) {#1};
\draw[rounded corners] (-TF.south west) |- (-Title.south west)
|- (-Title.north east) -- (-Title.south east) -| (-TF.south east)
 -- cycle;
\draw ([xshift=4pt]-Title.south west) -- ([xshift=-4pt]-Title.south east);
 }},
pics/nonfillable subject/.style={code={%
\node[text field] (-TF) 
{\hspace{1.2em}~/~\hspace{1.15em}~/~\hspace{2.35em}{}};
\node[title field] (-Title) 
at ([yshift=0.4em]-TF.north) {#1};
\draw[rounded corners] (-TF.south west) |- (-Title.south west)
|- (-Title.north east) -- (-Title.south east) -| (-TF.south east)
 -- cycle;
\draw ([xshift=4pt]-Title.south west) -- ([xshift=-4pt]-Title.south east);
 }}, 
 manoooh/.style={column sep=-2cm,row sep=5mm}
 }

\begin{document}

\thispagestyle{empty}   % To suppress page number

\noindent
\begin{tikzpicture}
\fill[white,fill=orange] (0,0) rectangle (\paperwidth,-2cm) node[midway,align=center,font=\Huge] {\bfseries Some text here\\\LARGE More text here};
\end{tikzpicture}

\vfill
\centering
\begin{tikzpicture}[node distance=3.14cm]
 % step 1: add the matrices, name them mat0, mat1 etc.
 \begin{scope}[local bounding box=matrices] 
  \matrix[manoooh] (mat0)  {
         \pic (A)  {nonfillable subject={Subject}}; & & 
         \pic (B)  {nonfillable subject={Subject}}; \\
         & \pic (C)  {nonfillable subject={Subject}}; & \\
         };
  \matrix[manoooh,right=of mat0] (mat1){
         \pic (D)  {nonfillable subject={Subject}}; \\ 
         \pic (E)  {nonfillable subject={Subject}}; \\
         \pic (F)  {nonfillable subject={Subject}}; \\ 
         \pic (G)  {nonfillable subject={Subject}}; \\ 
         };
  \matrix[manoooh,right=of mat1] (mat2)  {
         \pic (H)  {nonfillable subject={Subject}}; & & 
         \pic (I)  {nonfillable subject={Subject}}; \\
         & \pic (J)  {nonfillable subject={Subject}};  & \\
         \pic (K)  {nonfillable subject={Subject}}; 
         & &
         \pic (L)  {nonfillable subject={Subject}}; \\
         };
  \matrix[manoooh,right=of mat2] (mat3)  {
         & \pic (M)  {nonfillable subject={Subject}};  & \\
         \pic (N)  {nonfillable subject={Subject}}; & & 
         \pic (O)  {nonfillable subject={Subject}}; \\
         \pic (P)  {nonfillable subject={Subject}}; 
         & &
         \pic (Q)  {nonfillable subject={Subject}}; \\
         };
 \end{scope}
 \foreach \X in {0,...,3} %<- if you have more or less matrices, adjust 3       
 {\node[anchor=south,yshift=1cm,align=center,font=\LARGE\bfseries\boldmath] 
 at (mat\X |-matrices.north) (L\X) {Level $\X$};
 \begin{scope}[on background layer]
  % the fit parameters determine the shape of the background rectangles
  \node[fit=(L\X) (mat\X) (matrices.south-|mat\X.south),inner ysep=5mm,
  inner xsep=5mm,fill=orange!30,rounded corners=50pt](F\X){};
 \end{scope}}
 % now add the arrows 
 \foreach \X in {D,...,G}
 {\draw[blue,-latex] (B-Title) to[out=0,in=180] (\X-Title);}
\end{tikzpicture}

\vfill
\end{document}

I think that we could also use the matrix command of the TikZ package to position the pictures inside the light blue shape, but we need to define a new type of subject: (non)fillable elective subject.

Final result

Similar to the original question but adding these new shapes and vertically centering those subjects that are between "Level X" and the light blue shapes:

Final result

Thanks!!

  • 2
    If you dont mind, could you please add the code from the linked questions (I would still retain the links :)). So that it will be easier for looking-up. – Raaja Mar 13 at 10:59
  • 1
    @Raaja done. Thanks for the suggestion! – manooooh Mar 13 at 14:10
  • 1
    Perfect!! :-D – Raaja Mar 13 at 14:12
2
+50

Here is an answer for your updated question. (To those who feel I shouldn't add two answers: I will be happy to remove one of them. However, I think that the other one might be potentially useful for others.) As before, the strategy is to write computed distances to the aux file such that they can be used after a recompilation.

\documentclass{article}
\usepackage[showframe,margin=0in,footskip=0.25in,paperwidth=54cm,paperheight=24cm]{geometry}
\usepackage[english]{babel}
\usepackage[utf8]{inputenc}
\usepackage[T1]{fontenc}
\usepackage{hyperref}
\usepackage{tikz}
\usetikzlibrary{positioning,backgrounds,fit,calc}
\tikzset{text field/.style={text height=1.5ex,align=center,rounded corners},
title field/.style={text height=2ex,text depth=0.3em,anchor=south,text
width=4.5cm,align=center,font=\footnotesize\sffamily},
pics/fillable subject/.style={code={%
\node[text field] (-TF) 
{\hspace*{-0.5em}\TextField[align=1,name=#1-day,width=1em,charsize=7pt,maxlen=2,bordercolor={1 1 1}]~~/\hspace*{-0.15em}\TextField[align=1,name=#1-month,width=1em,charsize=7pt,maxlen=2,bordercolor={1 1 1}]~~/\hspace*{-0em}\TextField[align=1,name=#1-year,width=2em,charsize=7pt,maxlen=4,bordercolor={1 1 1}]{}~};
\node[title field] (-Title) 
at ([yshift=0.4em]-TF.north) {#1};
\draw[rounded corners] (-TF.south west) |- (-Title.south west)
|- (-Title.north east) -- (-Title.south east) -| (-TF.south east)
 -- cycle;
\draw ([xshift=4pt]-Title.south west) -- ([xshift=-4pt]-Title.south east);
 }},
pics/nonfillable subject/.style={code={%
\node[text field] (-TF) 
{\hspace{1.2em}~/~\hspace{1.15em}~/~\hspace{2.35em}{}};
\node[title field] (-Title) 
at ([yshift=0.4em]-TF.north) {#1};
\draw[rounded corners] (-TF.south west) |- (-Title.south west)
|- (-Title.north east) -- (-Title.south east) -| (-TF.south east)
 -- cycle;
\draw ([xshift=4pt]-Title.south west) -- ([xshift=-4pt]-Title.south east);
 }}, 
 manoooh/.style={column sep=-1.75cm,row sep=5mm},
 manooohE/.style={column sep=-2.25cm,row sep=5mm,anchor=south},
 electives/.style={column sep=-2.25cm,row sep=5mm},
 fit sep/.initial=10pt,
 fit dist/.initial=20pt,
 inlay top sep/.initial=24pt,
 matrix top sep/.initial=24pt,
 }

\makeatletter% from https://tex.stackexchange.com/a/85531/121799
\long\def\ifnodedefined#1#2#3{%
    \@ifundefined{pgf@sh@ns@#1}{#3}{#2}%
}
\makeatother

\begin{document}
\thispagestyle{empty}   % To suppress page number
\noindent
\begin{tikzpicture}
\fill[white,fill=orange] (0,0) rectangle (\paperwidth,-2cm) node[midway,align=center,font=\Huge] {\bfseries Some text here\\\LARGE More text here};
\end{tikzpicture}

\ifdefined\mymatdist
%\typeout{got\space\mymatdist}
\else
\typeout{Please\space recompile\space your\space file!}
\def\mymatdist{150pt}
\fi
\ifdefined\mymatbottom
%\typeout{got\space\mymatbottom}
\else
\typeout{Please\space recompile\space your\space file!}
\def\mymatbottom{-150pt}
\fi
\ifdefined\myheight
\else
\def\myheight{0}
\typeout{Please\space recompile\space your\space file!}
\fi
\ifdefined\LstMatShifts
\else
\def\LstMatShifts{{0pt,0pt,0pt,0pt,0pt}}
\fi
%\typeout{height:\myheight}
%\typeout{shifts(in):\LstMatShifts}

\vfill
\centering
\begin{tikzpicture}[node distance=3.14cm]
 % step 1: add the matrices, name them mat0, mat1 etc.
 \begin{scope}[local bounding box=matrices] 
  \matrix[manoooh] (mat0) at (0*\mymatdist,{\LstMatShifts[0]}) {
         \pic[local bounding box=A] (A)  {nonfillable subject={Subject}}; & & 
         \pic (B)  {nonfillable subject={Subject}}; \\
         & \pic (C)  {nonfillable subject={Subject}}; & \\
         };
  \matrix[manooohE,column sep=8pt] (matE0)  at (0*\mymatdist,\mymatbottom) {
         \pic (AE)  {nonfillable subject={Subject}}; &  
         \pic (BE)  {nonfillable subject={Subject}}; \\
         \pic (CE)  {nonfillable subject={Subject}}; &  
         \pic (DE)  {nonfillable subject={Subject}}; \\         
         };       
  \matrix[manoooh] (mat1) at (1*\mymatdist,{\LstMatShifts[1]}) {
         \pic (D)  {nonfillable subject={Subject}}; \\ 
         \pic (E)  {nonfillable subject={Subject}}; \\
         \pic (F)  {nonfillable subject={Subject}}; \\ 
         \pic (G)  {nonfillable subject={Subject}}; \\ 
         \pic (D')  {nonfillable subject={Subject}}; \\ 
         \pic (E')  {nonfillable subject={Subject}}; \\
         \pic (F')  {nonfillable subject={Subject}}; \\ 
         \pic (G')  {nonfillable subject={Subject}}; \\ 
         };
  \matrix[manoooh] (mat2) at (2*\mymatdist,{\LstMatShifts[2]}) {
         \pic (H)  {nonfillable subject={Subject}}; & & 
         \pic (I)  {nonfillable subject={Subject}}; \\
         & \pic (J)  {nonfillable subject={Subject}};  & \\
         \pic (K)  {nonfillable subject={Subject}}; 
         & &
         \pic (L)  {nonfillable subject={Subject}}; \\
         };
  \matrix[manooohE] (matE2) at (2*\mymatdist,\mymatbottom) {
         \pic (HE)  {nonfillable subject={Subject}}; \\
         };       
  \matrix[manoooh] (mat3) at (3*\mymatdist,{\LstMatShifts[3]}) {
         & \pic (M)  {nonfillable subject={Subject}};  & \\
         \pic (N)  {nonfillable subject={Subject}}; & & 
         \pic (O)  {nonfillable subject={Subject}}; \\
         \pic (P)  {nonfillable subject={Subject}}; 
         & &
         \pic (Q)  {nonfillable subject={Subject}}; \\
         };
  \matrix[manooohE] (matE3) at (3*\mymatdist,\mymatbottom) {
         &\pic (ME)  {nonfillable subject={Subject}};  &\\
         \pic (NE)  {nonfillable subject={Subject}}; & &
         \pic (POE)  {nonfillable subject={Subject}}; \\
         \pic (PE)  {nonfillable subject={Subject}}; &  &
         \pic (QE)  {nonfillable subject={Subject}}; \\         
         };              
 \end{scope}
 \pgfmathsetmacro{\mywidth}{0}
 \foreach \X in {0,...,3} %<- if you have more or less matrices, adjust 3       
 {
  \ifnodedefined{matE\X}{% has inlay
   \path let \p1=($(mat\X.north east)-(mat\X.south west)$),
    \p2=($(matE\X.north east)-(matE\X.south west)$)
      in 
    \pgfextra{\pgfmathsetmacro{\mywidth}{max(\x1,\mywidth)}
     \pgfmathsetmacro{\myheight}{max(\y1+\y2+%
       \pgfkeysvalueof{/tikz/inlay top sep}+\pgfkeysvalueof{/tikz/matrix top sep},%
       \myheight)}
     \xdef\mywidth{\mywidth}\xdef\myheight{\myheight}
     \pgfmathsetmacro{\myshift}{(\pgfkeysvalueof{/tikz/inlay top sep}+\y2)/2}
     \ifnum\X=0
     \xdef\LstMatShifts{\myshift pt}
     \else
     \xdef\LstMatShifts{\LstMatShifts,\myshift pt}
     \fi};}{% no inlay
   \path 
    let \p1=($(mat\X.north east)-(mat\X.south west)$)  in 
  \pgfextra{\pgfmathsetmacro{\mywidth}{max(\x1,\mywidth)}
    \pgfmathsetmacro{\myheight}{max(\y1+\pgfkeysvalueof{/tikz/matrix top sep},\myheight)} 
    \xdef\mywidth{\mywidth}\xdef\myheight{\myheight}};
    \ifnum\X=0
    \xdef\LstMatShifts{0pt}
    \else
    \xdef\LstMatShifts{\LstMatShifts,0pt}
    \fi
     }
  \node[anchor=south,yshift=1cm,align=center,font=\LARGE\bfseries\boldmath] 
  at (mat\X |-matrices.north) (L\X) {Level $\X$};
  \begin{scope}[on background layer]
   % the fit parameters determine the shape of the background rectangles
   \node[fit=(L\X) (mat\X) (matrices.south-|mat\X.south),inner ysep=5mm,
   minimum width=\mymatdist-\pgfkeysvalueof{/tikz/fit dist}/2,
   fill=orange!30,rounded corners=50pt](F\X){};
  \end{scope}}
 %\typeout{height1:\myheight} % 
 %
 \pgfmathsetmacro{\mydist}{\mywidth+2*\pgfkeysvalueof{/tikz/fit
 sep}+\pgfkeysvalueof{/tikz/fit dist}}
 \xdef\mydist{\mydist}
 \def\mymatbottom{0pt}
 \foreach \X in {0,...,3} %
 {\ifnodedefined{matE\X}{\path let \p1=($(mat\X.north)-(mat\X.south)$),
      \p2=($(matE\X.north)-(matE\X.south)$),
      \n1={max(abs(\y1)/2+abs(\y2)+2*\pgfkeysvalueof{/tikz/inlay top sep},\mymatbottom)}
     in \pgfextra{\xdef\mymatbottom{\n1}}
     node[anchor=south east,xshift=-2cm,font=\LARGE\bfseries] (El\X)
      at (matE\X.north){Electives};
  \begin{scope}[on background layer]      
    \node[fit=(matE\X) (El\X)] (FE\X){};
    \fill[blue!30,rounded corners=30pt] (\X*\mymatdist-
    \mymatdist/2+\pgfkeysvalueof{/tikz/fit dist}/4+10pt,0|-FE\X.north)
    rectangle (\X*\mymatdist+
    \mymatdist/2-\pgfkeysvalueof{/tikz/fit dist}/4-10pt,0|-FE\X.south);
  \end{scope}}{}}
 %\typeout{shifts(end):\LstMatShifts} 
 \makeatletter
 \immediate\write\@mainaux{\xdef\string\mymatdist{\mydist pt}\relax}
 \immediate\write\@mainaux{\xdef\string\mymatbottom{-\mymatbottom}\relax}
 \immediate\write\@mainaux{\xdef\string\myheight{\myheight}\relax}
 \immediate\write\@mainaux{\xdef\string\LstMatShifts{{\LstMatShifts}}\relax}
 \makeatother

 % now add the arrows 
 \foreach \X in {D,...,G}
 {\draw[blue,-latex] (B-Title) to[out=0,in=180] (\X-Title);}
\end{tikzpicture}

\vfill
\end{document}

enter image description here

  • "Rerun" seems a more standard wording than "Recompile"... – Paul Gaborit Mar 19 at 1:26
  • ... see also tex.stackexchange.com/q/82063/14500. – Paul Gaborit Mar 19 at 1:29
  • (I understand what this code does... but I'm not sure that I understand what it tries to do. ;-)) – Paul Gaborit Mar 19 at 6:27
  • @PaulGaborit It tries to collect the dimensions of all nodes in the first run and then use the information to place the nodes in the second run, doing what in ordinary LaTeX \hfill and \vfill do. AFAIK there are no TikZ analogs of \hfill and \vfill. Of course, in less complex examples you do not need them, but here I didn't see a way to accomplish the task with the ordinary positioning library. – user121799 Mar 19 at 6:32
1

The main complication is that one cannot yet (?) nest tikz matrices. So this proposal follows a slightly different strategy, which is conceptually more or less the same as the one used here:

  1. Build the matrices with some guessed distances.
  2. Measure the matrices.
  3. Compute "optimal" distances from the measured values.
  4. Write the "optimal" distances to the aux file such that they can be used after recompilation.

The example has a lot of annotations that should help to understand what is going on. Notice also that you have to loop over the actual inlays, that is, if you want to add or remove inlays, you may have to modify \foreach \X in {0,2,3}.

\documentclass{article}
\usepackage[showframe,margin=0in,footskip=0.25in,paperwidth=54cm,paperheight=20cm]{geometry}
\usepackage[english]{babel}
\usepackage[utf8]{inputenc}
\usepackage[T1]{fontenc}
\usepackage{hyperref}
\usepackage{tikz}
\usetikzlibrary{positioning,backgrounds,fit,calc}
\tikzset{text field/.style={text height=1.5ex,align=center,rounded corners},
title field/.style={text height=2ex,text depth=0.3em,anchor=south,text
width=4.5cm,align=center,font=\footnotesize\sffamily},
pics/fillable subject/.style={code={%
\node[text field] (-TF) 
{\hspace*{-0.5em}\TextField[align=1,name=#1-day,width=1em,charsize=7pt,maxlen=2,bordercolor={1 1 1}]~~/\hspace*{-0.15em}\TextField[align=1,name=#1-month,width=1em,charsize=7pt,maxlen=2,bordercolor={1 1 1}]~~/\hspace*{-0em}\TextField[align=1,name=#1-year,width=2em,charsize=7pt,maxlen=4,bordercolor={1 1 1}]{}~};
\node[title field] (-Title) 
at ([yshift=0.4em]-TF.north) {#1};
\draw[rounded corners] (-TF.south west) |- (-Title.south west)
|- (-Title.north east) -- (-Title.south east) -| (-TF.south east)
 -- cycle;
\draw ([xshift=4pt]-Title.south west) -- ([xshift=-4pt]-Title.south east);
 }},
pics/nonfillable subject/.style={code={%
\node[text field] (-TF) 
{\hspace{1.2em}~/~\hspace{1.15em}~/~\hspace{2.35em}{}};
\node[title field] (-Title) 
at ([yshift=0.4em]-TF.north) {#1};
\draw[rounded corners] (-TF.south west) |- (-Title.south west)
|- (-Title.north east) -- (-Title.south east) -| (-TF.south east)
 -- cycle;
\draw ([xshift=4pt]-Title.south west) -- ([xshift=-4pt]-Title.south east);
 }}, 
 manoooh/.style={column sep=-1.75cm,row sep=5mm},
 manooohE/.style={column sep=-2.25cm,row sep=5mm,anchor=south},
 wrapper/.style={fit=#1,inner sep=0pt,minimum width=\useVal{matrix_width}}
 electives/.style={column sep=-2.25cm,row sep=5mm},
 fit sep/.initial=10pt,
 fit dist/.initial=20pt,
 inlay top sep/.initial=24pt
 }

\begin{document}
\thispagestyle{empty}   % To suppress page number
\noindent
\begin{tikzpicture}
\fill[white,fill=orange] (0,0) rectangle (\paperwidth,-2cm) node[midway,align=center,font=\Huge] {\bfseries Some text here\\\LARGE More text here};
\end{tikzpicture}

\ifdefined\mymatdist
%\typeout{got\space\mymatdist}
\else
\typeout{Please\space recompile\space your\space file!}
\def\mymatdist{150pt}
\fi
\ifdefined\mymatbottom
%\typeout{got\space\mymatbottom}
\else
\typeout{Please\space recompile\space your\space file!}
\def\mymatbottom{-150pt}
\fi


\vfill
\centering
\begin{tikzpicture}[node distance=3.14cm]
 % step 1: add the matrices, name them mat0, mat1 etc.
 \begin{scope}[local bounding box=matrices] 
  \matrix[manoooh] (mat0) at (0*\mymatdist,0) {
         \pic[local bounding box=A] (A)  {nonfillable subject={Subject}}; & & 
         \pic (B)  {nonfillable subject={Subject}}; \\
         & \pic (C)  {nonfillable subject={Subject}}; & \\
         };
  \matrix[manooohE,column sep=8pt] (matE0)  at (0*\mymatdist,\mymatbottom) {
         \pic (AE)  {nonfillable subject={Subject}}; &  
         \pic (BE)  {nonfillable subject={Subject}}; \\
         \pic (CE)  {nonfillable subject={Subject}}; &  
         \pic (DE)  {nonfillable subject={Subject}}; \\         
         };       
  \matrix[manoooh] (mat1) at (1*\mymatdist,0) {
         \pic (D)  {nonfillable subject={Subject}}; \\ 
         \pic (E)  {nonfillable subject={Subject}}; \\
         \pic (F)  {nonfillable subject={Subject}}; \\ 
         \pic (G)  {nonfillable subject={Subject}}; \\ 
         };
  \matrix[manoooh] (mat2) at (2*\mymatdist,0) {
         \pic (H)  {nonfillable subject={Subject}}; & & 
         \pic (I)  {nonfillable subject={Subject}}; \\
         & \pic (J)  {nonfillable subject={Subject}};  & \\
         \pic (K)  {nonfillable subject={Subject}}; 
         & &
         \pic (L)  {nonfillable subject={Subject}}; \\
         };
  \matrix[manooohE] (matE2) at (2*\mymatdist,\mymatbottom) {
         \pic (HE)  {nonfillable subject={Subject}}; \\
         };       
  \matrix[manoooh] (mat3) at (3*\mymatdist,0) {
         & \pic (M)  {nonfillable subject={Subject}};  & \\
         \pic (N)  {nonfillable subject={Subject}}; & & 
         \pic (O)  {nonfillable subject={Subject}}; \\
         \pic (P)  {nonfillable subject={Subject}}; 
         & &
         \pic (Q)  {nonfillable subject={Subject}}; \\
         };
  \matrix[manooohE] (matE3) at (3*\mymatdist,\mymatbottom) {
         &\pic (ME)  {nonfillable subject={Subject}};  &\\
         \pic (NE)  {nonfillable subject={Subject}}; & &
         \pic (POE)  {nonfillable subject={Subject}}; \\
         \pic (PE)  {nonfillable subject={Subject}}; &  &
         \pic (QE)  {nonfillable subject={Subject}}; \\         
         };              
 \end{scope}
 \pgfmathsetmacro{\mywidth}{0pt}
 \foreach \X in {0,...,3} %<- if you have more or less matrices, adjust 3       
 {\path let \p1=($(mat\X.east)-(mat\X.west)$) in 
 \pgfextra{\pgfmathsetmacro{\mywidth}{max(\x1,\mywidth)}
 \xdef\mywidth{\mywidth}};
 \node[anchor=south,yshift=1cm,align=center,font=\LARGE\bfseries\boldmath] 
 at (mat\X |-matrices.north) (L\X) {Level $\X$};
 \begin{scope}[on background layer]
  % the fit parameters determine the shape of the background rectangles
  \node[fit=(L\X) (mat\X) (matrices.south-|mat\X.south),inner ysep=5mm,
  minimum width=\mymatdist-\pgfkeysvalueof{/tikz/fit dist}/2,
  fill=orange!30,rounded corners=50pt](F\X){};
 \end{scope}}
 %\xdef\mydist{\mydist}
 \pgfmathsetmacro{\mydist}{\mywidth+2*\pgfkeysvalueof{/tikz/fit
 sep}+\pgfkeysvalueof{/tikz/fit dist}}
 \xdef\mydist{\mydist}
 \def\mymatbottom{0pt}
 \foreach \X in {0,2,3} %<run only over those entries that have inlays
 {\path let \p1=($(mat\X.north)-(mat\X.south)$),
      \p2=($(matE\X.north)-(matE\X.south)$),
      \n1={max(abs(\y1)/2+abs(\y2)+2*\pgfkeysvalueof{/tikz/inlay top sep},\mymatbottom)}
     in \pgfextra{\xdef\mymatbottom{\n1}}
     node[anchor=south east,xshift=-2cm,font=\LARGE\bfseries] (El\X)
      at (matE\X.north){Electives};
  \begin{scope}[on background layer]      
    \node[fit=(matE\X) (El\X)] (FE\X){};
    \fill[blue!30,rounded corners=30pt] (\X*\mymatdist-
    \mymatdist/2+\pgfkeysvalueof{/tikz/fit dist}/4+10pt,0|-FE\X.north)
    rectangle (\X*\mymatdist+
    \mymatdist/2-\pgfkeysvalueof{/tikz/fit dist}/4-10pt,0|-FE\X.south);
  \end{scope}}
 \makeatletter
 \immediate\write\@mainaux{\xdef\string\mymatdist{\mydist pt}\relax}
 \immediate\write\@mainaux{\xdef\string\mymatbottom{-\mymatbottom}\relax}
 \makeatother

 % now add the arrows 
 \foreach \X in {D,...,G}
 {\draw[blue,-latex] (B-Title) to[out=0,in=180] (\X-Title);}
\end{tikzpicture}

\vfill
\end{document}

enter image description here

And this is a second example with annotations which is also closer to your screen shot.

\documentclass{article}
\usepackage[showframe,margin=0in,footskip=0.25in,paperwidth=54cm,paperheight=24cm]{geometry}
\usepackage[english]{babel}
\usepackage[utf8]{inputenc}
\usepackage[T1]{fontenc}
\usepackage{hyperref}
\usepackage{tikz}
\usetikzlibrary{positioning,backgrounds,fit,calc}
\tikzset{text field/.style={text height=1.5ex,align=center,rounded corners},
title field/.style={text height=2ex,text depth=0.3em,anchor=south,text
width=4.5cm,align=center,font=\footnotesize\sffamily},
pics/fillable subject/.style={code={%
\node[text field] (-TF) 
{\hspace*{-0.5em}\TextField[align=1,name=#1-day,width=1em,charsize=7pt,maxlen=2,bordercolor={1 1 1}]~~/\hspace*{-0.15em}\TextField[align=1,name=#1-month,width=1em,charsize=7pt,maxlen=2,bordercolor={1 1 1}]~~/\hspace*{-0em}\TextField[align=1,name=#1-year,width=2em,charsize=7pt,maxlen=4,bordercolor={1 1 1}]{}~};
\node[title field] (-Title) 
at ([yshift=0.4em]-TF.north) {#1};
\draw[rounded corners] (-TF.south west) |- (-Title.south west)
|- (-Title.north east) -- (-Title.south east) -| (-TF.south east)
 -- cycle;
\draw ([xshift=4pt]-Title.south west) -- ([xshift=-4pt]-Title.south east);
 }},
pics/nonfillable subject/.style={code={%
\node[text field] (-TF) 
{\hspace{1.2em}~/~\hspace{1.15em}~/~\hspace{2.35em}{}};
\node[title field] (-Title) 
at ([yshift=0.4em]-TF.north) {#1};
\draw[rounded corners] (-TF.south west) |- (-Title.south west)
|- (-Title.north east) -- (-Title.south east) -| (-TF.south east)
 -- cycle;
\draw ([xshift=4pt]-Title.south west) -- ([xshift=-4pt]-Title.south east);
 }}, 
 manoooh/.style={column sep=-1.75cm,row sep=5mm},
 manooohE/.style={column sep=-2.25cm,row sep=5mm,anchor=south},
 wrapper/.style={fit=#1,inner sep=0pt,minimum width=\useVal{matrix_width}}
 electives/.style={column sep=-2.25cm,row sep=5mm},
 fit sep/.initial=10pt,
 fit dist/.initial=20pt,
 inlay top sep/.initial=24pt
 }

\begin{document}
\thispagestyle{empty}   % To suppress page number
\noindent
\begin{tikzpicture}
\fill[white,fill=orange] (0,0) rectangle (\paperwidth,-2cm) node[midway,align=center,font=\Huge] {\bfseries Some text here\\\LARGE More text here};
\end{tikzpicture}

\ifdefined\mymatdist
%\typeout{got\space\mymatdist}
\else
\typeout{Please\space recompile\space your\space file!}
\def\mymatdist{150pt}
\fi
\ifdefined\mymatbottom
%\typeout{got\space\mymatbottom}
\else
\typeout{Please\space recompile\space your\space file!}
\def\mymatbottom{-150pt}
\fi


\vfill
\centering
\begin{tikzpicture}[node distance=3.14cm]
 % step 1: add the matrices, name them mat0, mat1 etc.
 \begin{scope}[local bounding box=matrices] 
  \matrix[manoooh] (mat0) at (0*\mymatdist,0) {
         \pic[local bounding box=A] (A)  {nonfillable subject={Subject}}; & & 
         \pic (B)  {nonfillable subject={Subject}}; \\
         & \pic (C)  {nonfillable subject={Subject}}; & \\
         };
  \matrix[manooohE,column sep=8pt] (matE0)  at (0*\mymatdist,\mymatbottom) {
         \pic (AE)  {nonfillable subject={Subject}}; &  
         \pic (BE)  {nonfillable subject={Subject}}; \\
         \pic (CE)  {nonfillable subject={Subject}}; &  
         \pic (DE)  {nonfillable subject={Subject}}; \\         
         };       
  \matrix[manoooh] (mat1) at (1*\mymatdist,0) {
         \pic (D)  {nonfillable subject={Subject}}; \\ 
         \pic (E)  {nonfillable subject={Subject}}; \\
         \pic (F)  {nonfillable subject={Subject}}; \\ 
         \pic (G)  {nonfillable subject={Subject}}; \\ 
         \pic (D')  {nonfillable subject={Subject}}; \\ 
         \pic (E')  {nonfillable subject={Subject}}; \\
         \pic (F')  {nonfillable subject={Subject}}; \\ 
         \pic (G')  {nonfillable subject={Subject}}; \\ 
         };
  \matrix[manoooh] (mat2) at (2*\mymatdist,0) {
         \pic (H)  {nonfillable subject={Subject}}; & & 
         \pic (I)  {nonfillable subject={Subject}}; \\
         & \pic (J)  {nonfillable subject={Subject}};  & \\
         \pic (K)  {nonfillable subject={Subject}}; 
         & &
         \pic (L)  {nonfillable subject={Subject}}; \\
         };
  \matrix[manooohE] (matE2) at (2*\mymatdist,\mymatbottom) {
         \pic (HE)  {nonfillable subject={Subject}}; \\
         };       
  \matrix[manoooh] (mat3) at (3*\mymatdist,0) {
         & \pic (M)  {nonfillable subject={Subject}};  & \\
         \pic (N)  {nonfillable subject={Subject}}; & & 
         \pic (O)  {nonfillable subject={Subject}}; \\
         \pic (P)  {nonfillable subject={Subject}}; 
         & &
         \pic (Q)  {nonfillable subject={Subject}}; \\
         };
  \matrix[manooohE] (matE3) at (3*\mymatdist,\mymatbottom) {
         &\pic (ME)  {nonfillable subject={Subject}};  &\\
         \pic (NE)  {nonfillable subject={Subject}}; & &
         \pic (POE)  {nonfillable subject={Subject}}; \\
         \pic (PE)  {nonfillable subject={Subject}}; &  &
         \pic (QE)  {nonfillable subject={Subject}}; \\         
         };              
 \end{scope}
 \pgfmathsetmacro{\mywidth}{0pt}
 \foreach \X in {0,...,3} %<- if you have more or less matrices, adjust 3       
 {\path let \p1=($(mat\X.east)-(mat\X.west)$) in 
 \pgfextra{\pgfmathsetmacro{\mywidth}{max(\x1,\mywidth)}
 \xdef\mywidth{\mywidth}};
 \node[anchor=south,yshift=1cm,align=center,font=\LARGE\bfseries\boldmath] 
 at (mat\X |-matrices.north) (L\X) {Level $\X$};
 \begin{scope}[on background layer]
  % the fit parameters determine the shape of the background rectangles
  \node[fit=(L\X) (mat\X) (matrices.south-|mat\X.south),inner ysep=5mm,
  minimum width=\mymatdist-\pgfkeysvalueof{/tikz/fit dist}/2,
  fill=orange!30,rounded corners=50pt](F\X){};
 \end{scope}}
 %\xdef\mydist{\mydist}
 \pgfmathsetmacro{\mydist}{\mywidth+2*\pgfkeysvalueof{/tikz/fit
 sep}+\pgfkeysvalueof{/tikz/fit dist}}
 \xdef\mydist{\mydist}
 \def\mymatbottom{0pt}
 \foreach \X in {0,2,3} %<run only over those entries that have inlays
 {\path let \p1=($(mat\X.north)-(mat\X.south)$),
      \p2=($(matE\X.north)-(matE\X.south)$),
      \n1={max(abs(\y1)/2+abs(\y2)+2*\pgfkeysvalueof{/tikz/inlay top sep},\mymatbottom)}
     in \pgfextra{\xdef\mymatbottom{\n1}}
     node[anchor=south east,xshift=-2cm,font=\LARGE\bfseries] (El\X)
      at (matE\X.north){Electives};
  \begin{scope}[on background layer]      
    \node[fit=(matE\X) (El\X)] (FE\X){};
    \fill[blue!30,rounded corners=30pt] (\X*\mymatdist-
    \mymatdist/2+\pgfkeysvalueof{/tikz/fit dist}/4+10pt,0|-FE\X.north)
    rectangle (\X*\mymatdist+
    \mymatdist/2-\pgfkeysvalueof{/tikz/fit dist}/4-10pt,0|-FE\X.south);
  \end{scope}}
 \makeatletter
 \immediate\write\@mainaux{\xdef\string\mymatdist{\mydist pt}\relax}
 \immediate\write\@mainaux{\xdef\string\mymatbottom{-\mymatbottom}\relax}
 \makeatother

 % now add the arrows 
 \foreach \X in {D,...,G}
 {\draw[blue,-latex] (B-Title) to[out=0,in=180] (\X-Title);}
 \foreach \X in {0,...,3}
 {\node[circle,red,inner sep=4pt,fill,label={[font=\Huge,text=red]above:mat \X\ center}] (c\X) at 
 (mat\X.center){};
 \unless\ifnum\X=1
 \node[circle,blue,inner sep=4pt,fill,
 label={[font=\Huge,text=blue]above:matE \X' south}] (c\X') at 
 (matE\X.south){};
 \fi
 }
\end{tikzpicture}

\vfill
\end{document}

enter image description here

  • Yes of course, I agree with your answer. No problem in compiling twice. – manooooh Mar 14 at 17:24
  • @manooooh I updated my answer. Notice that it is quite possible that there is a simple trick that allows one to avoid this gymnastics but everything I could come up with (like putting the matrices into a tabular) is of comparable complexity, or even more complex. – user121799 Mar 15 at 0:33

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.