
Estava navegando pela internet e me depareihttp://graphicalcooking.co. Um formato atraente, e eu disse para mim mesmo: “TikZ pode fazer isso!” E assim pode. Lutei com isso esta manhã e cheguei ao seguinte. Meu único problema são as linhas que conectam os hexágonos nas instruções da receita. Não consigo pensar em uma maneira de fazer com que as várias linhas se cruzem (nos locais circulados) sem calcular explicitamente as distâncias. Seria bom ter uma macro \connect
que fizesse o trabalho, digamos, usando a intersections
biblioteca TikZ. Alguma sugestão? Espero ter comentado o código o suficiente para que não haja mistérios... Incluí alguns exemplos do que a \connect
macro ainda fictícia pode fazer.
\documentclass{article}
%% Compare with http://graphicalcooking.co
\usepackage{xcolor}
\usepackage{tikz}
\usepackage[papersize={5.5in,8.5in},margin=0.5in,bottom=0.75in]{geometry}
\usepackage{xfrac}
\usetikzlibrary{calc,positioning,shapes.geometric,intersections}
\newlength{\minsize}
\newlength{\skipln}
\setlength{\minsize}{1.00in}
\setlength{\skipln}{0.1in}
\def\fr#1/#2 {\sfrac{#1}{#2} }
\tikzset{% Simplify using TikZ pics
pics/hex/.style n args={4}{% #1= name; #2=color; #3 top in bold; #4 bottom in italics
code={%
\node[%
draw,
very thick,
color=#2,
rounded corners=3pt,
regular polygon,
regular polygon sides=6,
shape border rotate=90, %% !!
inner sep=0pt,
minimum size=\minsize,
inner sep=0pt,
align=center
] (#1) at (0,0) {};
\node[text width=0.95\minsize,align=center] at (#1)
{\textbf{\strut#3\strut}\\\emph{\strut#4\strut}};
}
}
}
\tikzset{rc/.style = {rounded corners=3pt}}
\begin{document}
\thispagestyle{empty}
\begin{tikzpicture}[]
\pgfmathsetlengthmacro{\movehex}{cos(30) * \minsize} %% (0,0) to *side* of hexagon
\pgfmathsetlengthmacro{\branchln}{(\movehex+\skipln)/2/cos(30)} %% length of line after bend
%% Create the hexagons
\pic at (0,0) {hex={A}{blue}{Parmesan}{\fr1/4 cup}};
\pic at (\movehex+\skipln,0.0in) {hex={C}{green!70!black}{Lettuce}{\fr1/2 head}};
\pic at (2*\movehex+2*\skipln,0.0in) {hex={D}{orange}{Carrot}{1}};
\pic at (0.5*\movehex+\skipln/2,-\movehex+\skipln/2) {hex={B}{red}{Tomato}{1}};
\pic at (1.5*\movehex+3*\skipln/2,-\movehex+\skipln/2) {hex={E}{purple}{Red Onion}{\fr1/4 }};
\pic at ($(E) + (\movehex+\skipln,0)$) {hex={F}{yellow!80!green}{EVOO}{\fr1/4 cup}};
\pic at ($(F) + (\movehex+\skipln,0)$) {hex={G}{pink}{Red Wine\\Vinegar}{\fr1/8 cup}};
\coordinate (t1) at ($(B)!.5!(E)$);
\path (t1) -- ++(0,-3.5in) coordinate (t2);
%% Draw the connections
%% This would be neater with a macro something like (\connect yet to be defined!):
%% \connect{1.75in}{B.south}{C.south}{0.85in}{Place in bowl} where
%% #1=vertical displacement; #2=source coordinate; #3=coordinate with which to align end of connector
%% #4=vertical displacement for instruction; #5=instruction
%% Would also allow for arbitrary placement of hexagons
\draw[thick] (C.south) -- (t2);
\draw[rc,blue] (B.south) -- ++(0,-1.75in) -- ++(-30:\branchln) node[circle,draw] {};
%% or \connect{-1.75in}{B.south}{C.south}{0.85in}{Place in bowl}
\draw[rc] (E.south) -- ++(0,-1.5in) -- ++(210:\branchln) node[circle,draw] {};
\draw[rc,red] (A.south) -- ++(0,-1.75in) -- ++(-30:\branchln) node[circle,draw] {};
%% or \connect{-1.5in}{A.south}{B.south}{0.5in}{Slice}
\draw[rc] (D.south) -- ++(0,-2.5in) -- ++(210:2*\branchln) node[circle,draw] {};
\draw[rc] (F.south) -- ++(0,-0.25in) -- ++(-30:\branchln) node[circle,draw] {};
\draw[rc] (G.south) -- ++(0,-0.25in) -- ++(210:\branchln) coordinate (i1);
\draw[rc] (i1) -- ++(0,-1in) -- ++(210:4*\branchln) node[circle,draw] {};
%% Ingredient instructions
\node[below=0.85in of C.south,fill=white] {Place in bowl};
\node[below=1.0in of A.south,fill=white] {Grate};
\node[below=0.5in of B.south,fill=white] {Slice};
\node[below=1.0in of E.south,fill=white] {Dice};
\node[below=1.25in of D.south,fill=white] {Chop};
\node[below=0.25in of i1,fill=white] {Mix in blender};
\node[draw,fill=white,rounded corners=3pt] at (t2) {\strut Toss \& Serve};
\end{tikzpicture}
\newpage
\begin{tikzpicture}
\setlength{\skipln}{0.025in}
\pgfmathsetlengthmacro{\movehex}{cos(30) * \minsize}
\pgfmathsetlengthmacro{\branchln}{(\movehex+\skipln)/2/cos(30)}
\pic at (0,-5.25in) {hex={P}{blue}{Parmesan}{}};
\pic at ($(P) + (-60:\movehex+\skipln)$) {hex={Q}{green!70!black}{blue/Z2}{}};
\pic at ($(P) + (\movehex+\skipln,0)$) {hex={R}{orange}{Cheddar\\xxx}{}};
\pic at ($(R) + (\movehex+\skipln,0)$) {hex={S}{purple}{Eggplant\\yyy}{}};
\pic at ($(Q) + (\movehex+\skipln,0)$) {hex={T}{yellow}{Cream\\zzz}{}};
\end{tikzpicture}
\end{document}
Responder1
Aqui está uma proposta. Acho que implementei mais ou menos seu comando, exceto que substituí a segunda distância absoluta pela fração do caminho. Também gosto do fato de não haver abacaxi na receita.
\documentclass{article}
%% Compare with http://graphicalcooking.co
\makeatletter % from https://tex.stackexchange.com/a/412901/121799
\newcommand{\Distance}[3]{% % from https://tex.stackexchange.com/q/56353/121799
\tikz@scan@one@point\pgfutil@firstofone($#1-#2$)\relax
\pgfmathsetmacro{#3}{veclen(\the\pgf@x,\the\pgf@y)/28.45274}
}
\makeatother
\newcommand{\Connect}[6][]{%
\node[above=#2 of #4,circle,draw,#1] (y){};
\coordinate (x) at (y-|#3);
\Distance{(x)}{(y)}{\myDst}%\typeout{\myDst}
\ifthenelse {\isempty{#6}}{\draw[rc,#1] (#3) -- ($(x)+(0,0.6*\myDst)$)--(y.center);}{%
\draw[rc,#1] (#3) -- ($(x)+(0,0.6*\myDst)$) node[pos=#5,fill=white]{#6}-- (y.center);}
}
\usepackage{xifthen}
\usepackage{xcolor}
\usepackage{tikz}
\usepackage[papersize={5.5in,8.5in},margin=0.5in,bottom=0.75in]{geometry}
\usepackage{xfrac}
\usetikzlibrary{calc,positioning,shapes.geometric,intersections,calc}
\newlength{\minsize}
\newlength{\skipln}
\setlength{\minsize}{1.00in}
\setlength{\skipln}{0.1in}
\def\fr#1/#2 {\sfrac{#1}{#2} }
\tikzset{% Simplify using TikZ pics
pics/hex/.style n args={4}{% #1= name; #2=color; #3 top in bold; #4 bottom in italics
code={%
\node[%
draw,
very thick,
color=#2,
rounded corners=3pt,
regular polygon,
regular polygon sides=6,
shape border rotate=90, %% !!
inner sep=0pt,
minimum size=\minsize,
inner sep=0pt,
align=center
] (#1) at (0,0) {};
\node[text width=0.95\minsize,align=center] at (#1)
{\textbf{\strut#3\strut}\\\emph{\strut#4\strut}};
}
}
}
\tikzset{rc/.style = {rounded corners=3pt}}
\begin{document}
\thispagestyle{empty}
%% \connect{1.75in}{B.south}{C.south}{0.85in}{Place in bowl} where
%% #1=vertical displacement; #2=source coordinate; #3=coordinate with which to align end of connector
%% #4=vertical displacement for instruction; #5=instruction
%% Would also allow for arbitrary placement of hexagons
\begin{tikzpicture}[]
\pgfmathsetlengthmacro{\movehex}{cos(30) * \minsize} %% (0,0) to *side* of hexagon
\pgfmathsetlengthmacro{\branchln}{(\movehex+\skipln)/2/cos(30)} %% length of line after bend
%% Create the hexagons
\pic at (0,0) {hex={A}{blue}{Parmesan}{\fr1/4 cup}};
\pic at (\movehex+\skipln,0.0in) {hex={C}{green!70!black}{Lettuce}{\fr1/2 head}};
\pic at (2*\movehex+2*\skipln,0.0in) {hex={D}{orange}{Carrot}{1}};
\pic at (0.5*\movehex+\skipln/2,-\movehex+\skipln/2) {hex={B}{red}{Tomato}{1}};
\pic at (1.5*\movehex+3*\skipln/2,-\movehex+\skipln/2) {hex={E}{purple}{Red Onion}{\fr1/4 }};
\pic at ($(E) + (\movehex+\skipln,0)$) {hex={F}{yellow!80!green}{EVOO}{\fr1/4 cup}};
\pic at ($(F) + (\movehex+\skipln,0)$) {hex={G}{pink}{Red Wine\\Vinegar}{\fr1/8 cup}};
\coordinate (t1) at ($(B)!.5!(E)$);
\path (t1) -- ++(0,-3.5in) coordinate (t2);
\draw[thick] (C.south) -- (t2) node[pos=0.3,fill=white]{Place in bowl};
\node[draw,fill=white,rounded corners=3pt] at (t2) {\strut Toss \& Serve};
\Connect[green]{1.75in}{E.south}{t2.north}{0.7}{Dice}
\Connect[red]{0.75in}{B.south}{t2.north}{0.3}{Slice}
\Connect[blue]{0.5in}{A.south}{x}{0.7}{Grate}
% explanation: the `\Connect` command defines two nodes, x and y,
% which always get overwritten. I am using the x node from the previous
X \Connect here
\Connect[orange]{1.25in}{D.south}{t2.north}{0.7}{Chop}
\coordinate(dummy) at ($(F.south)!0.5!(G.south)+(0,-1in)$);
\Connect{0}{F.south}{dummy}{0.7}{}
\Connect{0}{G.south}{dummy}{0.7}{}
\Connect[thick]{0.25in}{dummy.south}{t2.north}{0.25}{Mix in blender}
\end{tikzpicture}
\end{document}
O principal problema, porém, é que eu realmente não gosto de cebola. (É por isso que os conectei com a cor feia.) Você poderia, por favor, deixá-los de fora? (O alho seria muuuito melhor e mais saudável!)