Preciso criar um diagrama grande, ou seja, um diagrama de correlatividades de assuntos personalizados, mas não consigo fazer certas coisas. Para fazer isso vou usar TikZ.
Ingredientes
Os ingredientes são:
- Um título. Não há muito a dizer.
Assuntos. Para criar esses objetos usarei o código fonte doesta resposta muito útil:
Grandes retângulos. Cada retângulo indicará o ano (também conhecido como nível) em que as disciplinas estão agrupadas:
Setas; flechas. Relacionam as disciplinas dentro de um mesmo ano do currículo e até entre anos diferentes:
Como as coisas são montadas
- Os assuntos são agrupados dentro de um retângulo (ano de carreira).
- Duas disciplinas podem estar relacionadas no mesmo ano ou em anos diferentes. As relações entre disciplinas do mesmo ano estão sempre lado a lado (uma à esquerda, outra à direita).
O que eu fiz
MWE:
\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}
Resultado final
É isso que eu quero:
Você não é obrigado a copiar textualmente a imagem, mas sim alguns assuntos e alguns retângulos.
O que eu preciso
- O número de retângulos varia entre
6
e7
(diferentemente da última imagem onde são quatro). O código deve ser o mais simples possível para poder adicionar assuntos facilmente. - No máximo cada retângulo possui
8
assuntos9
verticais, e no máximo cada retângulo possui2
assuntos horizontais. A etiqueta do ano corrente deve ser centralizada superiormente e não centralizada:
Por mais que os retângulos e os assuntos dentro dos retângulos devam ser centralizados horizontalmente e verticalmente, não como meus MWE que ficam alinhados à esquerda. Resumidamente, tudo tem que estar centrado:
Deve haver um espaço adequado entre todos os objetos, e o espaço entre ano e ano deve ser o mais importante a se cuidar, pois, se houver pouco espaço, as setas ficarão muito próximas e o documento ficará feio. Como referência, você pode tirar as medidas (em centímetros) que calculei:
Se forem
7
anos (ou seja, a maior quantidade), então a largura da página será:(0.5+4.5+1.5+4.5+0.5+3)*7-(3)+(1+1)
, que é igual a100.5cm
. Não calculei a altura, mas deve ser em torno20cm
(considerando o máximo de assuntos verticais, ou seja8/9
).Contanto que o comprimento da folha seja menor, é muito melhor, mas sem piorar visualmente o diagrama (porque também gostaria de adaptar o diagrama a um
A4
formato).
A última coisa que poderia acontecer:
(Requisito opcional)
Automatize a cor das setas. Cada assunto tem sua própria cor de seta. Como você pode ver em "Resultado final", existem muitas setas para cada assunto, então o ideal seria ter um comando que ao passar o número total de assuntos, digamos n
, divida o gradiente de cores em n
partes iguais, em ordem para homogeneizar as cores. Se isso parece loucura, não há problema em colorir as setas manualmente.
Obrigado!!
Responder1
Após correspondência, esta é uma versão refinada.
- Você pode usar
pic
s em uma matriz, não apenas em nós. Isso ajuda muito aqui. - Para a centralização horizontal e vertical do
tikzpicture
você pode simplesmente usar\centering
e\vfill
. - A aparência da coisa é determinada por algumas teclas e estilos pgf. Isso está marcado no código.
- Adicionei apenas algumas setas, mas isso mostra, em princípio, como proceder. Não conheço uma maneira infalível de evitar que essas setas cruzem os nós.
- Você terá que adicionar
\begin{Form}...\end{Form}
quando apropriado. Basicamente, não tenho ideia do que isso diz respeito. Esta postagem se concentra no TikParte 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}