Problema con bordes bifurcados en bosques atípicos.sty

Problema con bordes bifurcados en bosques atípicos.sty

La mayoría de los ejemplos de salida de forest(como es natural) siguen una forma piramidal que se encuentra comúnmente en los árboles lingüísticos. Como experimento en el formato de recetas culinarias, intenté invertir la pirámide:

receta piramidal 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}

Esto funciona, pero, claramente, hay algunos aspectos de la configuración que estoy pasando por alto: cuando forked edgesno se comenta, este es el resultado;

receta piramidal ups

Me doy cuenta de que este puede no ser el mejor caso de uso foresty ciertamente no soy un experto. Aún así, me gusta la sintaxis de los corchetes y me gustaría continuar con esto si es posible.

¿Qué necesito arreglar?

Respuesta1

No es necesario agrupar el preámbulo del árbol. En todo caso, no quieres hacer esto.

La solución más sencilla es moverse.forked edges afuera for tree, ya que ya incluye el suyo propio 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}

producción

EDITAR

Tenga en cuenta que su código produce numerosos cuadros defectuosos porque está poniendo cosas más grandes en cosas más pequeñas. ( text widthes demasiado pequeño para el ancho de minipages que usa).

Además, en cierto modo estás reinventando la rueda. forestél mismo convierte los nodos en tabulars si los usa aligny puede dividir el contenido, etc.

De manera más general, generalmente es más fácil usar pgf/ foreststyles que insertar macros personalizadas como \imgfill. Aunque eso funciona aquí, tiende a fallar si las cosas se complican un poco más.

No estoy convencido de que lo usaría forestpara recetas. (Al menos, no es lo que uso cuando compongo recetas). Pero, si adoptara su enfoque, consideraría algo como esto:

\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}

Explicación:

  • recipees el forestestilo básico;
  • arrayse utiliza para que podamos definir un par de especificaciones de columna personalizadas tabular, las cuales crean minipages de ancho \recipemwd;
  • imgfilles un estilo para producir el relleno utilizado para algunos nodos;
  • mkinges un estilo para producir una lista de ingredientes:
    • úselo ;para separar líneas y ;*cuando desee una regla;
  • mkmthes un estilo para producir instrucciones:
    • utilizar \\para separar líneas;
  • cuando aparece una coma en el contenido, se requieren llaves (llaves), pero por lo demás no son necesarias.

La lista de ingredientes se divide dos veces:

  1. a cualquiera ;:
  • el primer elemento se almacena en un forestregistro toks
  • cualquier artículo adicional se procesa más;
  1. a cualquiera *:
  • si el primer elemento está vacío, se agrega una regla al registro de toks después \\y luego se agrega el segundo elemento
  • de lo contrario, \\se agrega a seguido del primer elemento.

El efecto de esto es dividir y reconstituir el contenido del nodo, sustituyendo saltos de fila por cada punto y coma y agregando una regla si va seguida inmediatamente de un asterisco.

Disculpas por la falta de una segunda imagen. Un error en la última versión de Okular-on-X significa que mis imágenes son inútiles. Muchas gracias a egreg por proporcionar el primero.

Respuesta2

Como se sugiereaquí, utilice forked edgeen lugar de 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}
...

resultado

información relacionada