(부자연스럽지 않은) 대부분의 출력 예는 forest
언어 트리에서 흔히 볼 수 있는 피라미드 모양을 따릅니다. 요리 레시피 형식을 실험하기 위해 피라미드를 뒤집어 보았습니다.
\documentclass{article}
\usepackage{xparse,tikz}% xparse for u{<...>}
\usepackage[edges]{forest}
\newlength{\recitemwd}
\setlength{\recitemwd}{1.3in}
\newcounter{stepnum}
\NewDocumentCommand{\ingreds}{ >{\SplitList{;}}m }{\ProcessList{#1}{\fooaux}}
\NewDocumentCommand{\fooaux}{ m } {\expandafter\fooauxa#1|}
%% #1*=\hrulefill?; #2=?; #3=ingredient
\NewDocumentCommand{\fooauxa}{s o u{|}}{%
\hangindent1em\strut#3\strut\par
\IfBooleanT{#1}{%
\nointerlineskip
\vskip1pt
\textcolor{red}{\hrulefill\enskip}%
\par
\nointerlineskip
\vskip1pt
}%
}
\def\ingfill{fill=yellow!80!orange!15}
\NewDocumentCommand{\mking}{m}{%
\parbox{\recitemwd}{\pretolerance10000\bfseries\ingreds{#1}}
}
\NewDocumentCommand{\mkmth}{+m}{%
\begin{minipage}{\recitemwd}
\parskip1ex#1
\end{minipage}
}
\parindent0pt
\begin{document}
\thispagestyle{empty}
\small
\begin{forest}{for tree={grow'=90,edge={semithick,<-},
% forked edges,
node options={draw,text width=1.25in,rounded corners=1.5pt}}}
[\mkmth{Bake in a hot waffle iron}
[\mkmth{Fold beaten egg whites into flour/egg yolk mixture.}
[\mkmth{Mix together flour, BP and salt.\endgraf Add milk, butter and yolks, mix until smooth}
[\mking{2 cups flour;2 teaspoons BP;*¼ teaspoon salt;2 cups milk;
4 tablespoons butter, melted;4 egg yolks},\ingfill]
]
[\mkmth{Beat egg whites and salt until foamy.\endgraf
Continuing to beat, add sugar gradually to stiff peaks.}
[\mking{4 egg whites;*1 pinch salt;2 tablespoons sugar},\ingfill]
]
]
]
\end{forest}
\end{document}
이것은 작동하지만 분명히 제가 간과하고 있는 설정의 몇 가지 측면이 있습니다. forked edges
주석 처리가 해제되면 이것이 결과입니다.
나는 이것이 최선의 사용 사례가 아닐 수도 있다는 것을 알고 forest
있으며 확실히 전문가도 아닙니다. 그래도 나는 대괄호 구문이 마음에 들고 가능하다면 계속해서 사용하고 싶습니다.
무엇을 고쳐야 합니까?
답변1
트리의 프리앰블을 그룹화할 필요는 없습니다. 어쨌든 당신은 이것을하고 싶지 않습니다.
가장 간단한 해결책은 이동하는 것입니다.forked edges
밖의 for tree
, 이미 자체 가 포함되어 있기 때문입니다 for tree
.
\documentclass[border=5pt]{standalone}
\usepackage{xparse,tikz}% xparse for u{<...>}
\usepackage[edges]{forest}
\newlength{\recitemwd}
\setlength{\recitemwd}{1.3in}
\newcounter{stepnum}
\NewDocumentCommand{\ingreds}{ >{\SplitList{;}}m }{\ProcessList{#1}{\fooaux}}
\NewDocumentCommand{\fooaux}{ m } {\expandafter\fooauxa#1|}
%% #1*=\hrulefill?; #2=?; #3=ingredient
\NewDocumentCommand{\fooauxa}{s o u{|}}{%
\hangindent1em\strut#3\strut\par
\IfBooleanT{#1}{%
\nointerlineskip
\vskip1pt
\textcolor{red}{\hrulefill\enskip}%
\par
\nointerlineskip
\vskip1pt
}%
}
\def\ingfill{fill=yellow!80!orange!15}
\NewDocumentCommand{\mking}{m}{%
\parbox{\recitemwd}{\pretolerance10000\bfseries\ingreds{#1}}
}
\NewDocumentCommand{\mkmth}{+m}{%
\begin{minipage}{\recitemwd}
\parskip1ex#1
\end{minipage}
}
\begin{document}
\small
\begin{forest}
forked edges,
for tree={grow'=90,edge={semithick,<-},
node options={draw,text width=1.25in,rounded corners=1.5pt}}
[\mkmth{Bake in a hot waffle iron}
[\mkmth{Fold beaten egg whites into flour/egg yolk mixture.}
[\mkmth{Mix together flour, BP and salt.\endgraf Add milk, butter and yolks, mix until smooth}
[\mking{2 cups flour;2 teaspoons BP;*¼ teaspoon salt;2 cups milk;
4 tablespoons butter, melted;4 egg yolks},\ingfill]
]
[\mkmth{Beat egg whites and salt until foamy.\endgraf
Continuing to beat, add sugar gradually to stiff peaks.}
[\mking{4 egg whites;*1 pinch salt;2 tablespoons sugar},\ingfill]
]
]
]
\end{forest}
\end{document}
편집하다
더 큰 것을 더 작은 것에 집어넣기 때문에 코드에서 불량 상자가 많이 생성된다는 점에 유의하세요. ( 사용하는 text width
너비에 비해 너무 작습니다 .)minipage
게다가 당신은 바퀴를 어느 정도 재창조하고 있습니다. 사용하면 forest
자체적으로 노드를 s로 만들고 콘텐츠 등을 분할할 수 있습니다.tabular
align
더 일반적으로 는 pgf
. 여기서는 작동하지만 상황이 조금 더 복잡해지면 실패하는 경향이 있습니다.forest
\imgfill
나는 forest
요리법에 사용할 것이라고 확신하지 않습니다. (적어도 제가 레시피를 조판할 때 사용하는 것은 아닙니다.) 그러나 제가 귀하의 접근 방식을 채택한다면 다음과 같은 것을 고려하겠습니다.
\documentclass[border=5pt]{standalone}
% ateb: https://tex.stackexchange.com/a/716550/ addaswyd o gwestiwn sgmoye: https://tex.stackexchange.com/q/716537/
\usepackage{array,booktabs}
\usepackage[edges]{forest}
\newlength{\recitemwd}
\setlength{\recitemwd}{1.3in}
\forestset{%
recipe/.style={%
forked edges,
for tree={%
grow'=90,
edge={semithick,<-},
draw,
rounded corners=1.5pt,
inner xsep=2pt,
inner ysep=0pt,
},
/utils/exec={\renewcommand{\arraystretch}{1.5}},
},
mkmth/.style={%
align=R,
},
ingfill/.style={fill=yellow!80!orange!15},
mking/.style={%
font=\bfseries,
align=H,
before typesetting nodes={%
temptoksa={},
split option={content}{;}{temptoksa,mking aux},
content/.register=temptoksa,
},
},
mking aux/.style={%
temptoksc=,
temptoksb=,
split={#1}{*}{temptoksc,temptoksb},
if temptoksc={}{%
temptoksa+={\\\cmidrule(lr){1-1}},
temptoksa+/.register=temptoksb,
}{%
temptoksa+={\\[-1ex]},
temptoksa+/.register=temptoksc,
},
},
}
\newcolumntype{R}{@{}>{\raggedright\arraybackslash}p{\recitemwd}@{}}
\newcolumntype{H}{@{}>{\raggedright\hangindent1em\arraybackslash}p{\recitemwd}@{}}
\begin{document}
\small
\begin{forest}
recipe,
[Bake in a hot waffle iron,mkmth
[Fold beaten egg whites into flour/egg yolk mixture.,mkmth
[{Mix together flour, BP and salt.}\\{Add milk, butter and yolks, mix until smooth},mkmth
[{2 cups flour;2 teaspoons BP;*¼ teaspoon salt;2 cups milk;
4 tablespoons butter, melted;4 egg yolks},mking,ingfill]
]
[Beat egg whites and salt until foamy.\\
{Continuing to beat, add sugar gradually to stiff peaks.},mkmth
[4 egg whites;*1 pinch salt;2 tablespoons sugar,mking,ingfill]
]
]
]
\end{forest}
\end{document}
설명:
recipe
기본forest
스타일입니다.array
는 에 대한 몇 가지 사용자 정의 열 사양을 정의할 수 있도록 사용되며tabular
둘 다minipage
너비 를 생성합니다\recipemwd
.imgfill
일부 노드에 사용되는 채우기를 생성하는 스타일입니다.mking
성분 목록을 작성하는 스타일입니다.;
줄을 구분하고;*
규칙이 필요할 때 사용합니다 .
mkmth
명령을 생성하는 스타일입니다.- 줄을 구분하는 데 사용합니다
\\
.
- 줄을 구분하는 데 사용합니다
- 내용에 쉼표가 있는 경우 중괄호(중괄호)가 필요하지만 그 외에는 필요하지 않습니다.
성분 목록은 두 번 나뉩니다.
- 언제든지
;
:
forest
첫 번째 항목은 toks 레지스터 에 저장됩니다.- 추가 항목은 추가로 처리됩니다.
- 언제든지
*
:
- 첫 번째 항목이 비어 있으면 규칙이 toks 레지스터에 추가되고
\\
두 번째 항목이 추가됩니다. - 그렇지 않으면 a가
\\
추가되고 그 뒤에 첫 번째 항목이 옵니다.
이것의 효과는 노드의 내용을 분할하고 재구성하여 각 세미콜론을 행 나누기로 대체하고 바로 뒤에 별표가 오면 규칙을 추가하는 것입니다.
두 번째 이미지가 부족한 점 사과드립니다. 최신 Okular-on-X의 버그는 내 이미지가 쓸모없다는 것을 의미합니다. 첫 번째 항목을 제공해 주신 egreg에게 많은 감사를 드립니다.
답변2
제안대로여기, forked edge
대신 사용하십시오 forked edges
.
...
\begin{forest}{for tree={grow'=90,edge={semithick,<-},
forked edge, % <---- changed here
node options={draw,text width=1.25in,rounded corners=1.5pt}}}
[\mkmth{Bake in a hot waffle iron}
[\mkmth{Fold beaten egg whites into flour/egg yolk mixture.}
[\mkmth{Mix together flour, BP and salt.\endgraf Add milk, butter and yolks, mix until smooth}
[\mking{2 cups flour;2 teaspoons BP;*¼ teaspoon salt;2 cups milk;
4 tablespoons butter, melted;4 egg yolks},\ingfill]
]
[\mkmth{Beat egg whites and salt until foamy.\endgraf
Continuing to beat, add sugar gradually to stiff peaks.}
[\mking{4 egg whites;*1 pinch salt;2 tablespoons sugar},\ingfill]
]
]
]
\end{forest}
...