我在网上闲逛时偶然发现了http://graphicalcooking.co。这是一种有吸引力的格式,我对自己说:“TikZ 可以做到这一点!”它确实可以做到。我今天早上一直在努力解决这个问题,并得出了以下结论。我唯一的问题是食谱说明中连接六边形的线条。我想不出一种方法来让各种线条相互交叉(在圆圈位置),而无需明确计算距离。如果有一个宏\connect
可以完成这项工作,那就太好了,比如说,通过使用intersections
TikZ 库。有什么建议吗?我希望我已经对代码进行了充分的注释,这样就不会出现任何谜团了……我提供了几个示例,说明目前虚构的\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}
答案1
这是一项建议。我认为或多或少地实现了您的命令,只是我用路径的分数替换了第二个绝对距离。我也喜欢食谱中没有菠萝的事实。
\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}
但主要的问题是我真的不喜欢洋葱。(这就是我把它们和丑陋的颜色联系起来的原因。)你能把它们去掉吗?(大蒜会更好更健康!)