Большинство примеров вывода 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
s, которую вы используете.)
Более того, вы в некотором роде изобретаете велосипед. forest
сам преобразует узлы в tabular
s, если вы используете 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 после
\\
и затем добавляется второй элемент \\
в противном случае добавляется 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}
...