vraag over trees in TikZ in LaTeX
Dag allemaal, Ik ben nu al drie dagen bezig met een probleem dat ik maar niet opgelost krijg. Tijd om hulp in te schakelen :-). Ik ben een programma aan het schrijven dat organogrammen genereert, Een versie in HTML en een versie PDF, via TeX (ik genereer dus TeX-code). Ik heb met ene hele grote mond gezegd dat de TeX output vele malen mooier en beter is, en dat is natuurlijk ook zo, maar zo makkelijk is het niet, zeker als er een boom getekend moet worden met staf en lijn (dus twee groeirichtingen)... Tussen alle problemen die ik tegenkom, is het volgende: Alle boxen in de boom moeten gelijke grootte hebben, om esthetische gronden. Ik kan die grootte vooraf berekenen, omdat ik de data heb. De TikZ argumenten "minimal height" en "minimal width" van een node-box zijn dus hard ingegeven in de setup van het plaatje. Welnu: als ik een vertakking heb, en de boxen worden te groot, dan komt de vork dwars door mijn box te staan. Ik heb van alles geprobeerd, maar geen oplossing kunnen vinden (o.a. spelen met level distance, zie commentaarregel in het voorbeeld). Hieronder een minimaal voorbeeld (snippet uit mijn gegenereerde TeX code). Het gaat er dus om dat ik: - ofwel moet aangeven dat "edge from parent fork down" bij "anchor south" van het hoger gelegen blokje moet beginnen te tekenen - ofwel dat ik een instructie moet geven dat hij de vertakking van de vork niet eerder dan een gegeven lengte mag laten beginnen. De voorbeelden op het internet (o.a. bij TeXample.net) werken allemaal niet, want zij maken allen gebruik van een verbreding van de node afstand, en dat wil ik niet want dan worden mijn plaatjes te uitgerekt en niet meer leesbaar. Wie kan mij helpen? Alvast bedankt! Hartelijke TeX-groeten, BAsD Bas Dekker (sub-account voor TeXniek) Postbus 11088 1001 GB Amsterdam +31 (0)6 25 00 32 78 texnics@digifuga.nl ---------------- Minimal Working Example --------------------- \documentclass{standalone} \renewcommand{\rmdefault}{phv} % Arial \renewcommand{\sfdefault}{phv} % Arial \usepackage[T1]{fontenc} \usepackage{color} \usepackage{colortbl} \usepackage{graphicx} \usepackage{tikz} \usetikzlibrary{arrows,shapes,positioning,shadows,trees} \begin{document} \tikzset{ basic/.style = {draw, drop shadow, font=\sffamily\small, rectangle,minimum width=4cm,minimum height =5em, text width = 3.6cm, align = flush center} , node distance = 2.4cm, root/.style = {basic, thin, align=center}, %level 1/.style={basic}, edge from parent fork down, sibling distance = 4cm, level distance =4cm,edge from parent/.style={draw}, level 1/.style={basic}, edge from parent fork down,edge from parent/.style={draw}, } \begin{tikzpicture} \node [root,fill = blue!20] (OUT-001) {Project Office} %KEYS for OUT-001 (1): STF-146 child {%Start STF-146 node [level 1, below of = OUT-001,fill = blue!40] (STF-146) {Project Director\\{\it STF-146}} %KEYS for STF-146 (3): STF-149|STF-148|STF-101 child {%Start STF-148 node [level 1, below of = STF-146,fill = blue!60] (STF-148) {Development Manager\\{\it STF-148}} }%Close STF-148 child {%Start STF-149 node [level 1, left of=STF-148,xshift =-2cm,fill = blue!60] (STF-149) {OnBoarding Manager\\{\it STF-149}} }%Close STF-149 child {%Start STF-101 node [level 1, right of=STF-148,xshift =2cm,fill = blue!60] (STF-101) {Chief Architect\\{\it STF-101}\\(Benoît Schoeffler)} }%Close STF-101 };%Close STF-146 \end{tikzpicture} \end{document} ---------------- End Minimal Working Example ---------------------
Lijkt me een klus van het type dat de meer ervaren ConTeXt gebruikers al vaak hebben gedaan, heb je daar al eens gekeken?
Op 27 sep. 2014, om 11:56 heeft Bas Dekker (TeXniek)
Alle boxen in de boom moeten gelijke grootte hebben, om esthetische gronden. Ik kan die grootte vooraf berekenen, omdat ik de data heb. De TikZ argumenten "minimal height" en "minimal width" van een node-box zijn dus hard ingegeven in de setup van het plaatje. Welnu: als ik een vertakking heb, en de boxen worden te groot, dan komt de vork dwars door mijn box te staan. Ik heb van alles geprobeerd, maar geen oplossing kunnen vinden (o.a. spelen met level distance, zie commentaarregel in het voorbeeld). Hieronder een minimaal voorbeeld (snippet uit mijn gegenereerde TeX code).
Ehm nee, ga ik doen als ik er in LaTeX écht niet uit kom, want mijn programmatuur hele machinekamer vol met LaTeX scripting en dit zou een major change betekenen :-( ...
Vooralsnog ga ik er vanuit dat er een oplossing in LaTeX maar ik te dom ben om die in te zien... ;-)
Op 27 sep. 2014, om 12:05 heeft Frans Goddijn
Lijkt me een klus van het type dat de meer ervaren ConTeXt gebruikers al vaak hebben gedaan, heb je daar al eens gekeken?
Op 27 sep. 2014, om 11:56 heeft Bas Dekker (TeXniek)
het volgende geschreven: Alle boxen in de boom moeten gelijke grootte hebben, om esthetische gronden. Ik kan die grootte vooraf berekenen, omdat ik de data heb. De TikZ argumenten "minimal height" en "minimal width" van een node-box zijn dus hard ingegeven in de setup van het plaatje. Welnu: als ik een vertakking heb, en de boxen worden te groot, dan komt de vork dwars door mijn box te staan. Ik heb van alles geprobeerd, maar geen oplossing kunnen vinden (o.a. spelen met level distance, zie commentaarregel in het voorbeeld). Hieronder een minimaal voorbeeld (snippet uit mijn gegenereerde TeX code).
_______________________________________________ TeX-NL mailing list TeX-NL@ntg.nl http://www.ntg.nl/cgi-bin/mailman/listinfo/tex-nl
Bas Dekker (sub-account voor TeXniek) Postbus 11088 1001 GB Amsterdam +31 (0)6 25 00 32 78 texnics@digifuga.nl
Bas Dekker (TeXniek) schreef: [...]
Alle boxen in de boom moeten gelijke grootte hebben, om esthetische gronden. Ik kan die grootte vooraf berekenen, omdat ik de data heb. De TikZ argumenten "minimal height" en "minimal width" van een node-box zijn dus hard ingegeven in de setup van het plaatje. Welnu: als ik een vertakking heb, en de boxen worden te groot, dan komt de vork dwars door mijn box te staan. Ik heb van alles geprobeerd, maar geen oplossing kunnen vinden (o.a. spelen met level distance, zie commentaarregel
Als ik level distance = 2.5cm zet dan komt het wel goed uit. Natuurlijk zul je even moeten uitzoeken hoe je de juiste level distance uitrekent aan de hand van de grootte van de boxen.
Met hartelijke groeten,
--
Piet van Oostrum
Overigens kan het allemaal nog makkelijker. Je moet niet handmatig de boxen gaan zitten positioneren (met below en xshift). Laat Tikz dat maar doen, die doet het goed. En node distance heb je ook niet nodig wat daarvoor heb je level distance en sibling distance.
De sibling distance neem je iets groter dan de breedte van de boxen, bijv. 5 mm meer zodat er 5 mm ruimte horizontaal tussen de boxen zit. In dit voorbeeld dus 4.5cm.
De level distance neem je iets meer dan de hoogte van de boxen; in dit geval iets meer omdat de horizontale lijn er ook nog tussen moet, bijvoorbeeld 8 mm meer. Overigens is het een beetje vreemd om de hoogte in ems uit te drukken want em is een horizontale maat. Dan zou ik eerder denken aan \baselineskips als eenheid. Ik heb het voorbeeld aangepast en cms genomen. Als box hoogte heb ik 2cm genomen, dus level distance=2.8cm.
Dan wordt dit het, met een en ander opgeschoond. Overigens heb je nu de node labels niet meer nodig.
\documentclass{standalone}
\renewcommand{\rmdefault}{phv} % Arial
\renewcommand{\sfdefault}{phv} % Arial
\usepackage[T1]{fontenc}
\usepackage{color}
\usepackage{colortbl}
\usepackage{graphicx}
\usepackage{tikz}
\usetikzlibrary{arrows,shapes,positioning,shadows,trees}
\begin{document}
\tikzset{
basic/.style = {draw, drop shadow, font=\sffamily\small,
rectangle,minimum width=4cm,minimum height =2cm,
text width = 3.6cm, align = flush center},
root/.style = {basic, thin, align=center}, sibling distance = 4.5cm,
level 1/.style={basic}, edge from parent fork down,
edge from parent/.style={draw}, level distance = 2.8cm,
}
\begin{tikzpicture}
\node [root,fill = blue!20] (OUT-001) {Project Office}
%KEYS for OUT-001 (1): STF-146
child {%Start STF-146
node [level 1, fill = blue!40] (STF-146) {Project Director\\{\it STF-146}}
%KEYS for STF-146 (3): STF-149|STF-148|STF-101
child {%Start STF-148
node [level 1, fill = blue!60] (STF-148) {Development Manager\\{\it STF-148}}
}%Close STF-148
child {%Start STF-149
node [level 1, fill = blue!60] (STF-149) {OnBoarding Manager\\{\it
STF-149}}
}%Close STF-149
child {%Start STF-101
node [level 1, fill = blue!60] (STF-101) {Chief Architect\\{\it
STF-101}\\(Benoît Schoeffler)}
}%Close STF-101
};%Close STF-146
\end{tikzpicture}
\end{document}
Het enige is nu dat de afstand tussen de bovenste twee boxen ook 8mm is en dat is een beetje groot omdat er geen horizontale lijn loopt. Dat kun je corrigeren door de tweede box (i.h.a. elke box die enig kind is) de optie yshift=3mm of zo te geven.
Met hartelijke groeten,
--
Piet van Oostrum
Hallo Piet,
Zeer hartelijk dank voor het onderstaande. Zo was ik min of meer ook begonnen, en dat werkte goed (ik ging niet voor de sibling distance maar voor de node distance ;-)).
De ellende begon met het tekenen van de staf, want daar moet ik met absolute afstanden gaan werken... Althans, dat dacht ik.
Het onderstaande is een minimaal werkend voorbeeld voor iets waar ik tegenaan liep. De echte organogram bevat iets meer dan 50 units :-).
Maar met alle input, waaronder de jouwe, ben ik inderdaad de boom aan het vereenvoudigen, en ik kom inderdaad een heel eind door TikZ slimmer in te zetten.
Bedankt, dus!
Hartelijke groeten vanuit Toulouse,
BAsD
Op 27 sep. 2014, om 23:30 heeft Piet van Oostrum
Overigens kan het allemaal nog makkelijker. Je moet niet handmatig de boxen gaan zitten positioneren (met below en xshift). Laat Tikz dat maar doen, die doet het goed. En node distance heb je ook niet nodig wat daarvoor heb je level distance en sibling distance.
De sibling distance neem je iets groter dan de breedte van de boxen, bijv. 5 mm meer zodat er 5 mm ruimte horizontaal tussen de boxen zit. In dit voorbeeld dus 4.5cm.
De level distance neem je iets meer dan de hoogte van de boxen; in dit geval iets meer omdat de horizontale lijn er ook nog tussen moet, bijvoorbeeld 8 mm meer. Overigens is het een beetje vreemd om de hoogte in ems uit te drukken want em is een horizontale maat. Dan zou ik eerder denken aan \baselineskips als eenheid. Ik heb het voorbeeld aangepast en cms genomen. Als box hoogte heb ik 2cm genomen, dus level distance=2.8cm.
Dan wordt dit het, met een en ander opgeschoond. Overigens heb je nu de node labels niet meer nodig.
\documentclass{standalone} \renewcommand{\rmdefault}{phv} % Arial \renewcommand{\sfdefault}{phv} % Arial \usepackage[T1]{fontenc} \usepackage{color} \usepackage{colortbl} \usepackage{graphicx} \usepackage{tikz} \usetikzlibrary{arrows,shapes,positioning,shadows,trees} \begin{document} \tikzset{ basic/.style = {draw, drop shadow, font=\sffamily\small, rectangle,minimum width=4cm,minimum height =2cm, text width = 3.6cm, align = flush center}, root/.style = {basic, thin, align=center}, sibling distance = 4.5cm, level 1/.style={basic}, edge from parent fork down, edge from parent/.style={draw}, level distance = 2.8cm, } \begin{tikzpicture} \node [root,fill = blue!20] (OUT-001) {Project Office} %KEYS for OUT-001 (1): STF-146 child {%Start STF-146 node [level 1, fill = blue!40] (STF-146) {Project Director\\{\it STF-146}} %KEYS for STF-146 (3): STF-149|STF-148|STF-101 child {%Start STF-148 node [level 1, fill = blue!60] (STF-148) {Development Manager\\{\it STF-148}} }%Close STF-148 child {%Start STF-149 node [level 1, fill = blue!60] (STF-149) {OnBoarding Manager\\{\it STF-149}} }%Close STF-149 child {%Start STF-101 node [level 1, fill = blue!60] (STF-101) {Chief Architect\\{\it STF-101}\\(Benoît Schoeffler)} }%Close STF-101 };%Close STF-146 \end{tikzpicture} \end{document}
Het enige is nu dat de afstand tussen de bovenste twee boxen ook 8mm is en dat is een beetje groot omdat er geen horizontale lijn loopt. Dat kun je corrigeren door de tweede box (i.h.a. elke box die enig kind is) de optie yshift=3mm of zo te geven.
Met hartelijke groeten, -- Piet van Oostrum
WWW: http://pietvanoostrum.com/ PGP key: [8DAE142BE17999C4] _______________________________________________ TeX-NL mailing list TeX-NL@ntg.nl http://www.ntg.nl/cgi-bin/mailman/listinfo/tex-nl
Bas Dekker (sub-account voor TeXniek) Postbus 11088 1001 GB Amsterdam +31 (0)6 25 00 32 78 texnics@digifuga.nl
participants (3)
-
Bas Dekker (TeXniek)
-
Frans Goddijn
-
Piet van Oostrum