Problema con el formato de receta interesante.

Problema con el formato de receta interesante.

Estaba navegando por Internet y me encontréhttp://graphicalcooking.co. Un formato atractivo y me dije: "¡TikZ puede hacerlo!". Y así puede ser. Luché con esto esta mañana y llegué a lo siguiente. Mi único problema son las líneas que conectan los hexágonos en las instrucciones de la receta. No puedo pensar en una manera de hacer que las distintas líneas se crucen entre sí (en las ubicaciones marcadas con círculos) sin calcular explícitamente las distancias. Sería bueno tener una macro \connectque hiciera el trabajo, digamos, mediante el uso de la intersectionsbiblioteca TikZ. ¿Alguna sugerencia? Espero haber comentado el código lo suficiente como para que no haya misterios... He incluido un par de ejemplos de lo que podría hacer la macro aún ficticia \connect.

\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}

ingrese la descripción de la imagen aquí

Respuesta1

He aquí una propuesta. Creo haber implementado más o menos tu comando excepto que reemplacé la segunda distancia absoluta por la fracción del camino. También me gusta el hecho de que no hay piña en la receta.

\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}

ingrese la descripción de la imagen aquí

El principal problema, sin embargo, es que realmente no me gustan las cebollas. (Por eso los conecté con el color feo). ¿Podrías omitirlos? (¡El ajo sería muchísimo mejor y más saludable!)

información relacionada