
인터넷을 떠돌다가 우연히 발견한http://graphicalcooking.co. 매력적인 형식이고 저는 "TikZ가 그걸 할 수 있어!"라고 스스로 말했습니다. 그리고 그렇게 할 수 있습니다. 나는 오늘 아침에 이것과 씨름했고 다음과 같은 곳에 도착했습니다. 내 유일한 문제는 레시피 지침에서 육각형을 연결하는 선입니다. 거리를 명시적으로 계산하지 않고는 다양한 선이 원으로 표시된 위치에서 서로 교차하도록 하는 방법을 생각할 수 없습니다. \connect
예를 들어 TikZ 라이브러리를 사용하여 작업을 수행하는 매크로가 있으면 좋을 것입니다 intersections
. 어떤 제안이 있으십니까? 미스터리가 없도록 코드에 충분히 주석을 달았기를 바랍니다. 아직 가상의 \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}
그런데 가장 큰 문제는 제가 양파를 별로 좋아하지 않는다는 것입니다. (그래서 못생긴 색으로 연결했습니다.) 빼주실 수 있나요? (마늘은 훨씬 더 좋고 건강에 좋을 것입니다!)