Cómo insertar una sección de materias optativas dentro de un diagrama

Cómo insertar una sección de materias optativas dentro de un diagrama

Este es un apéndice de la sección "Ingredientes" publicada en una pregunta anterior:Cómo dibujar un diagrama de correlatividades temáticas personalizadas.

Necesitamos dos ingredientes más:

  • Realizar una materia optativa. Podemos etiquetarlo como nonfillable elective subject:

    Materia optativa no rellenable

    Además, necesitamos tener una materia optativa que se pueda completar, llamada por ejemplo fillable elective subject:

    Materia optativa rellenable

    Como se dice en la pregunta, puedes usaresta respuesta muy útil.

  • Haz una forma que contenga un conjunto de materias optativas:

    Forma que contiene materias optativas.

(Tanto el color de fondo de la forma como el de las TextField'pueden variar. No te preocupes por eso).

Lo que necesito

  1. La última forma debe estar en la parte inferior del gran rectángulo naranja, sin llegar a todos los márgenes.
  2. Las materias optativas pueden tener diferentes alturas dependiendo del montón de materias optativas pero el ancho es siempre el mismo, pero las materias optativas en su interior deben estar centradas:

    Ejemplo

  3. Tenga en cuenta que las materias optativas no se relacionan con ningún objeto, por eso podemos reducir el ancho de la forma azul claro.

Que he hecho

El mismo código fuente dela respuesta de la marmota:

\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}

Creo que también podríamos utilizar elmatrix comando del Ti.kPaquete Z para colocar las imágenes dentro de la forma azul claro, pero necesitamos definir un nuevo tipo de subject: (non)fillable elective subject.

Resultado final

Similar a la pregunta original pero agregando estas nuevas formas y centrando verticalmente aquellos sujetos que están entre el "Nivel X" y las formas celestes:

Resultado final

¡¡Gracias!!

Respuesta1

Aquí hay una respuesta para su pregunta actualizada. (Para aquellos que sienten que no debería agregar dos respuestas: estaré feliz de eliminar una de ellas. Sin embargo, creo que la otra podría ser potencialmente útil para otros). Como antes, la estrategia es escribir distancias calculadas para el archivo auxiliar de manera que puedan usarse después de una recompilación.

\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}

ingrese la descripción de la imagen aquí

Respuesta2

La principal complicación es que todavía no se pueden (?) anidar matrices tikz. Así que esta propuesta sigue una estrategia ligeramente diferente, que conceptualmente es más o menos la misma queel que se usa aquí:

  1. Construye las matrices con algunas distancias supuestas.
  2. Mide las matrices.
  3. Calcule las distancias "óptimas" a partir de los valores medidos.
  4. Escriba las distancias "óptimas" al archivo auxiliar de modo que puedan usarse después de la recompilación.

El ejemplo tiene muchas anotaciones que deberían ayudar a comprender lo que está sucediendo. Tenga en cuenta también que debe recorrer las incrustaciones reales, es decir, si desea agregar o eliminar incrustaciones, es posible que deba modificarlas \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}

ingrese la descripción de la imagen aquí

Y este es un segundo ejemplo con anotaciones que también está más cerca de su captura de pantalla.

\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}

ingrese la descripción de la imagen aquí

información relacionada