Como desenhar um diagrama de correlatividades de assuntos personalizados

Como desenhar um diagrama de correlatividades de assuntos personalizados

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:

  1. Um título. Não há muito a dizer.
  2. Assuntos. Para criar esses objetos usarei o código fonte doesta resposta muito útil:

    Foto do assunto

  3. Grandes retângulos. Cada retângulo indicará o ano (também conhecido como nível) em que as disciplinas estão agrupadas:

    Retângulo

  4. Setas; flechas. Relacionam as disciplinas dentro de um mesmo ano do currículo e até entre anos diferentes:

    Seta

Como as coisas são montadas

  1. Os assuntos são agrupados dentro de um retângulo (ano de carreira).
  2. 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}

O que eu fiz

Resultado final

É isso que eu quero:

O que eu quero

Você não é obrigado a copiar textualmente a imagem, mas sim alguns assuntos e alguns retângulos.

O que eu preciso

  1. O número de retângulos varia entre 6e 7(diferentemente da última imagem onde são quatro). O código deve ser o mais simples possível para poder adicionar assuntos facilmente.
  2. No máximo cada retângulo possui 8assuntos 9verticais, e no máximo cada retângulo possui 2assuntos horizontais.
  3. A etiqueta do ano corrente deve ser centralizada superiormente e não centralizada:

    Centro superior

  4. 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:

    Tudo tem que estar centrado

  5. 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:

    Medidas que calculei

    Se forem 7anos (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 a 100.5cm. Não calculei a altura, mas deve ser em torno 20cm(considerando o máximo de assuntos verticais, ou seja 8/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 A4formato).

A última coisa que poderia acontecer:

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 npartes 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.

  1. Você pode usar pics em uma matriz, não apenas em nós. Isso ajuda muito aqui.
  2. Para a centralização horizontal e vertical do tikzpicturevocê pode simplesmente usar \centeringe \vfill.
  3. A aparência da coisa é determinada por algumas teclas e estilos pgf. Isso está marcado no código.
  4. 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.
  5. 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}

insira a descrição da imagem aqui

informação relacionada