非定型 forest.sty の分岐エッジの問題

非定型 forest.sty の分岐エッジの問題

出力例の大半は、forest(不自然ではないが)言語ツリーでよく見られるピラミッド型の形状をたどります。料理レシピのフォーマットの実験として、ピラミッドを反転してみました。

ピラミッドレシピ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}

これは機能しますが、明らかに、私が見落としている設定の側面がいくつかあります。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。)

さらに、これはある意味車輪の再発明です。を使用すると、forestそれ自体がノードを に変換し、それ自体がコンテンツを分割するなどできます。tabularalign

より一般的には、などのカスタム マクロを挿入するよりも、pgf/スタイルを使用する方が簡単です。ここではうまく機能しますが、状況が少しでも複雑になると失敗する傾向があります。forest\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幅 の を作成します\recipemwd
  • imgfillいくつかのノードに使用される塗りつぶしを生成するスタイルです。
  • mking原材料リストを作成するためのスタイルです。
    • ;行を区切るときや、;*ルールが必要な場合に使用します。
  • mkmth指示書を作成するためのスタイルです。
    • \\行を区切るために使用します。
  • コンテンツ内にカンマがある場合は中括弧が必要ですが、それ以外では必要ありません。

材料のリストは2つに分かれています:

  1. いずれにおいても;
  • 最初の項目はforesttoksレジスタに格納されます
  • 追加の項目はさらに処理されます。
  1. いずれにおいても*
  • 最初の項目が空の場合、ルールがtoksレジスタに追加され\\、その後2番目の項目が追加されます。
  • それ以外の場合は、\\最初の項目の後に a が追加されます。

これにより、ノードのコンテンツが分割されて再構成され、各セミコロンが行区切りに置き換えられ、その直後にアスタリスクが続く場合はルールが追加されます。

2 枚目の画像がなくて申し訳ありません。最新の 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}
...

結果

関連情報