Мне нужно создать большую диаграмму, т.е. диаграмму пользовательских предметных корреляций, но я не могу сделать некоторые вещи. Для этого я собираюсь использовать TiкЗ.
Ингредиенты
Ингредиенты:
- Название. Тут особо нечего сказать.
Субъекты. Для создания этих объектов я буду использовать исходный кодэтот очень полезный ответ:
Большие прямоугольники. Каждый прямоугольник будет указывать год (он же уровень), в котором сгруппированы предметы:
Стрелки. Они связывают предметы в рамках одного года учебной программы и даже между разными годами:
Как вещи собираются
- Предметы сгруппированы внутри прямоугольника (год карьеры).
- Два предмета могут быть связаны в одном и том же году или в разных годах. Отношения между предметами одного года всегда находятся рядом (один слева, один справа).
Что я наделал
МВЭ:
\documentclass{article}
\usepackage[showframe,margin=0in,footskip=0.25in,paperwidth=100cm,paperheight=20cm]{geometry}
\usepackage[english]{babel}
\usepackage[utf8]{inputenc}
\usepackage[T1]{fontenc}
\usepackage{hyperref}
\usepackage{tikz}
\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);
}},
}
\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}
\noindent
\begin{Form} % From https://tex.stackexchange.com/a/478346/152550
\begin{tikzpicture}
\path (0,0) pic (Geo) {nonfillable subject={Subject}} (8.5cm,0) pic (Whatever) {nonfillable subject={Subject}} (15cm,0) pic[draw=red] (Math) {nonfillable subject={Math}};
\draw[-latex] (Geo-Title) -- (Whatever-Title);
\draw[-latex] (Whatever-Title) -- (Math-Title);
\end{tikzpicture}
\end{Form}
\noindent
\begin{tikzpicture}
\fill[fill=orange!30,rounded corners=50pt] (0,0) rectangle (11.5cm,-14cm) node[midway,align=center,font=\LARGE] {\bfseries Level $0$};
\end{tikzpicture}
\end{document}
Конечный результат
Вот чего я хочу:
Вам не обязательно копировать текст изображения, но необходимо копировать некоторые предметы и некоторые прямоугольники.
Что мне нужно
- Количество прямоугольников варьируется от
6
до7
(не как на последнем изображении, где их четыре). Код должен быть максимально простым, чтобы можно было легко добавлять субъектов. - Максимум в каждом прямоугольнике может быть
8
не более9
вертикальных объектов, и максимум в каждом прямоугольнике может быть не более2
горизонтальных объектов. Этикетка текущего года должна располагаться по центру сверху, а не по центру:
Насколько прямоугольники и предметы внутри прямоугольников должны быть центрированы по горизонтали и вертикали, не как мои MWE, которые выровнены по левому краю. Короче говоря, все должно быть центрировано:
Между всеми объектами должно быть соответствующее пространство, и пространство между годом и годом должно быть самым важным, о чем нужно позаботиться, поскольку, если пространства мало, стрелки будут очень близко друг к другу, и документ будет выглядеть некрасиво. В качестве справки вы можете взять измерения (в сантиметрах), которые я рассчитал:
Если это
7
годы (т.е. наибольшее количество), то ширина страницы будет:(0.5+4.5+1.5+4.5+0.5+3)*7-(3)+(1+1)
, что равно100.5cm
. Я не вычислял высоту, но она должна быть около20cm
(учитывая максимум вертикальных предметов, т.е.8/9
).Пока длина листа меньше, это намного лучше., но не ухудшая визуально диаграмму (т.к. я бы также хотел адаптировать диаграмму к формату
A4
).
Последнее, что может произойти:
(Необязательное требование)
Автоматизируйте цвет стрелок. Каждый субъект имеет свой цвет стрелки. Как вы видите в "Конечный результат", для каждого субъекта есть много стрелок, поэтому идеальным было бы иметь команду, которая, передавая общее количество субъектов, скажем n
, делит градиент цветов на n
равные части, чтобы сделать цвета однородными. Если это кажется безумием, нет никаких проблем в том, чтобы раскрасить стрелки вручную.
Спасибо!!
решение1
После переписки это улучшенная версия.
- Вы можете использовать
pic
s в матрице, а не только узлы. Это очень помогает здесь. - Для горизонтального и вертикального центрирования
tikzpicture
вы можете просто использовать\centering
и\vfill
. - Внешний вид штуки определяется некоторыми ключами и стилями pgf. Это отмечено в коде.
- Я добавил всего несколько стрелок, но это показывает в принципе, как идти. Я не знаю надежного способа избежать того, чтобы эти стрелки пересекали узлы.
- Вам придется добавлять,
\begin{Form}...\end{Form}
где это уместно. Я, по сути, понятия не имею, о чем идет речь. Этот пост посвящен TiкZ-часть.
\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}