Problem mit interessantem Rezeptformat

Problem mit interessantem Rezeptformat

Ich habe im Internet gestöbert und bin aufhttp://graphicalcooking.co. Ein attraktives Format, und ich sagte mir: „TikZ kann das!“ Und das kann es auch. Ich habe mich heute Morgen damit herumgeschlagen und bin zu folgendem Ergebnis gekommen. Mein einziges Problem sind die Linien, die die Sechsecke in den Anweisungen für das Rezept verbinden. Ich kann mir keine Möglichkeit vorstellen, die verschiedenen Linien miteinander zu kreuzen (an den eingekreisten Stellen), ohne die Abstände explizit zu berechnen. Es wäre schön, ein Makro zu haben, \connectdas die Arbeit erledigen würde, beispielsweise mithilfe der intersectionsTikZ-Bibliothek. Irgendwelche Vorschläge? Ich hoffe, ich habe den Code ausreichend kommentiert, sodass es keine Geheimnisse gibt … Ich habe ein paar Beispiele beigefügt, was das bisher fiktive \connectMakro tun könnte.

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

Bildbeschreibung hier eingeben

Antwort1

Hier ist ein Vorschlag. Ich denke, ich habe deinen Befehl mehr oder weniger umgesetzt, außer dass ich die zweite absolute Distanz durch den Bruchteil des Pfades ersetzt habe. Mir gefällt auch die Tatsache, dass im Rezept keine Ananas vorkommt.

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

Bildbeschreibung hier eingeben

Das Hauptproblem ist jedoch, dass ich Zwiebeln wirklich nicht mag. (Deshalb habe ich sie mit der hässlichen Farbe in Verbindung gebracht.) Könntest du sie bitte weglassen? (Knoblauch wäre soooo viel besser und gesünder!)

verwandte Informationen