Problem mit gegabelten Kanten in atypischem Wald.sty

Problem mit gegabelten Kanten in atypischem Wald.sty

Die meisten Beispiele für die Ausgabe von forestfolgen (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:

Pyramidenrezept 1

\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 edgesnicht kommentiert ist, ist dies das Ergebnis;

Pyramidenrezept, ups

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}

Ausgabe

BEARBEITEN

Beachten Sie, dass Ihr Code zahlreiche fehlerhafte Boxen erzeugt, weil Sie größere Dinge in kleinere Dinge packen. ( text widthist zu klein für die Breite des von minipageIhnen verwendeten s.)

Darüber hinaus erfinden Sie das Rad gewissermaßen neu. forestEs macht selbst Knoten zu tabularS, 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 forestfü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:

  • recipeist der Grundstil forest;
  • arraywird verwendet, damit wir einige benutzerdefinierte Spaltenspezifikationen für definieren können tabular, die beide minipages der Breite erstellen \recipemwd;
  • imgfillist ein Stil zum Erstellen der Füllung, die für einige Knoten verwendet wird;
  • mkingist ein Stil zum Erstellen einer Zutatenliste:
    • verwenden Sie es ;, um Zeilen zu trennen und ;*wenn eine Regel gewünscht wird;
  • mkmthist ein Stil zum Erstellen von Anweisungen:
    • 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:

  1. jederzeit ;:
  • Das erste Element wird in einem forestToken-Register gespeichert.
  • alle weiteren Artikel werden weiterverarbeitet;
  1. 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 edgeanstelle 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}
...

Ergebnis

verwandte Informationen