Die meisten Beispiele für die Ausgabe von forest
folgen (nicht unnatürlicherweise) einer Pyramidenform, die häufig in linguistischen Bäumen vorkommt. Als Experiment zur Formatierung von Kochrezepten habe ich versucht, die Pyramide umzukehren:
\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}
Das funktioniert, aber es gibt offensichtlich einige Aspekte des Setups, die ich übersehe: Wenn forked edges
nicht kommentiert ist, ist dies das Ergebnis;
Mir ist klar, dass dies vielleicht nicht der beste Anwendungsfall ist forest
, und ich bin sicherlich kein Experte. Trotzdem gefällt mir die Klammersyntax und ich würde, wenn möglich, gerne damit weitermachen.
Was muss ich reparieren?
Antwort1
Sie müssen die Präambel des Baums nicht gruppieren. Wenn überhaupt, möchten Sie das nicht tun.
Die einfachste Lösung ist der Umzugforked edges
draußen for tree
, da es bereits ein eigenes enthält 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}
BEARBEITEN
Beachten Sie, dass Ihr Code zahlreiche fehlerhafte Boxen erzeugt, weil Sie größere Dinge in kleinere Dinge packen. ( text width
ist zu klein für die Breite des von minipage
Ihnen verwendeten s.)
Darüber hinaus erfinden Sie das Rad gewissermaßen neu. forest
Es macht selbst Knoten zu tabular
S, wenn Sie es verwenden align
, und kann selbst Inhalte aufteilen usw.
Generell ist es einfacher, pgf
/ forest
-Stile zu verwenden, als benutzerdefinierte Makros wie einzufügen \imgfill
. Obwohl das hier funktioniert, schlägt es in der Regel fehl, wenn die Dinge auch nur ein wenig komplizierter werden.
Ich bin nicht überzeugt, dass ich es forest
für Rezepte verwenden würde. (Zumindest verwende ich es nicht, wenn ich Rezepte setze.) Aber wenn ich Ihren Ansatz übernehmen würde, würde ich so etwas in Betracht ziehen:
\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}
Erläuterung:
recipe
ist der Grundstilforest
;array
wird verwendet, damit wir einige benutzerdefinierte Spaltenspezifikationen für definieren könnentabular
, die beideminipage
s der Breite erstellen\recipemwd
;imgfill
ist ein Stil zum Erstellen der Füllung, die für einige Knoten verwendet wird;mking
ist ein Stil zum Erstellen einer Zutatenliste:- verwenden Sie es
;
, um Zeilen zu trennen und;*
wenn eine Regel gewünscht wird;
- verwenden Sie es
mkmth
ist ein Stil zum Erstellen von Anweisungen:- zum Trennen von Zeilen verwenden
\\
;
- zum Trennen von Zeilen verwenden
- Wo im Inhalt ein Komma vorkommt, sind Klammern (geschwungene Klammern) erforderlich, ansonsten sind diese nicht notwendig.
Die Zutatenliste ist zweigeteilt:
- jederzeit
;
:
- Das erste Element wird in einem
forest
Token-Register gespeichert. - alle weiteren Artikel werden weiterverarbeitet;
- jederzeit
*
:
- Wenn das erste Element leer ist, wird eine Regel zum Token-Register hinzugefügt
\\
und das zweite Element wird dann hinzugefügt. - andernfalls
\\
wird ein hinzugefügt, gefolgt vom ersten Element.
Dies hat zur Folge, dass der Inhalt des Knotens aufgeteilt und neu zusammengesetzt wird, wobei jedes Semikolon durch einen Zeilenumbruch ersetzt wird und eine Regel hinzugefügt wird, wenn unmittelbar darauf ein Sternchen folgt.
Entschuldigen Sie, dass kein zweites Bild vorhanden ist. Ein Fehler im neuesten Okular-on-X bedeutet, dass meine Bilder nutzlos sind. Vielen Dank an egreg für die Bereitstellung des ersten Bildes.
Antwort2
Wie vorgeschlagenHier, verwenden Sie forked edge
anstelle von 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}
...