我需要建立一個大圖表,即自訂主題相關性的圖表,但我無法做某些事情。為此,我將使用 TikZ。
原料
成分是:
- 一個標題。沒什麼好說的。
科目。為了創建這些對象,我將使用以下原始程式碼這個非常有幫助的答案:
大矩形。每個矩形將指示科目分組的年份(也稱為級別):
箭頭。他們將課程同一年甚至不同年份之間的科目連結起來:
事物是如何組裝的
- 主題被分組在一個矩形內(職業年)。
- 兩個主題可以在同一年或不同年份相關。同年級科目之間的關係總是並排的(一個在左邊,一個在右邊)。
我做了什麼
微量元素:
\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}
在適當的地方添加。我基本上不知道這涉及什麼。這篇文章的重點是鈦kZ 部分。
\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}