大多數輸出範例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}
編輯
請注意,您的程式碼會產生大量壞框,因為您將較大的東西放入較小的東西中。 (對於您使用的 stext width
的寬度來說太小。)minipage
此外,您在某種程度上是在重新發明輪子。如果您使用的話,forest
它本身會將節點變成s ,並且它本身可以分割內容等。tabular
align
更一般地說,使用pgf
/ forest
styles 通常比插入自訂巨集(例如\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
寬度為 的 s\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}
...