Это дополнение к разделу «Ингредиенты», опубликованному в предыдущем вопросе:Как нарисовать диаграмму корреляций пользовательских субъектов.
Нам понадобятся еще два ингредиента:
Создайте предмет по выбору. Мы можем обозначить его как
nonfillable elective subject
:Также нам необходимо иметь факультативный предмет, который можно заполнить, например
fillable elective subject
:Как сказано в вопросе, вы можете использоватьэтот очень полезный ответ.
Создайте форму, содержащую набор предметов по выбору:
(Цвет фона фигуры и TextField
' могут отличаться. Не беспокойтесь об этом).
Что мне нужно
- Последняя фигура должна располагаться в нижней части большого оранжевого прямоугольника, не выходя за его края.
Факультативные предметы могут иметь разную высоту в зависимости от стопки факультативных предметов, но ширина всегда одинакова, но факультативные предметы внутри нее должны быть отцентрированы:
- Обратите внимание, что факультативные предметы не связаны ни с каким объектом, поэтому мы можем уменьшить ширину светло-голубой фигуры.
Что я наделал
Тот же исходный кодответ сурка:
\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}
Я думаю, что мы также могли бы использовать matrix
команду TiкПакет Z для размещения изображений внутри светло-голубой фигуры, но нам нужно определить новый тип subject
: (non)fillable elective subject
.
Конечный результат
Аналогично исходному вопросу, но с добавлением новых фигур и вертикальным центрированием тех предметов, которые находятся между «Уровнем X» и светло-голубыми фигурами:
Спасибо!!
решение1
Вот ответ на ваш обновленный вопрос. (Тем, кто считает, что мне не следует добавлять два ответа: я с радостью удалю один из них. Однако я думаю, что другой может быть потенциально полезен для других.) Как и прежде, стратегия заключается в записи вычисленных расстояний в aux-файл таким образом, чтобы их можно было использовать после перекомпиляции.
\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}
решение2
Основная сложность в том, что пока нельзя (?) вкладывать матрицы tikz. Поэтому это предложение следует немного другой стратегии, которая концептуально более или менее та же, чтотот, который здесь используется:
- Постройте матрицы с некоторыми предполагаемыми расстояниями.
- Измерьте матрицы.
- Рассчитайте «оптимальные» расстояния на основе измеренных значений.
- Запишите «оптимальные» расстояния в aux-файл, чтобы их можно было использовать после перекомпиляции.
В примере много аннотаций, которые должны помочь понять, что происходит. Обратите внимание также, что вам нужно пройтись по фактическим вкладкам, то есть, если вы хотите добавить или удалить вкладки, вам, возможно, придется изменить \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}
А это второй пример с аннотациями, который также ближе к вашему снимку экрана.
\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}