非典型森林中的分叉邊緣問題。

非典型森林中的分叉邊緣問題。

大多數輸出範例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}

輸出

編輯

請注意,您的程式碼會產生大量壞框,因為您將較大的東西放入較小的東西中。 (對於您使用的 stext width的寬度來說太小。)minipage

此外,您在某種程度上是在重新發明輪子。如果您使用的話,forest它本身會將節點變成s ,並且它本身可以分割內容等。tabularalign

更一般地說,使用pgf/ foreststyles 通常比插入自訂巨集(例如\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是一種產生指令的樣式:
    • 用於\\分隔線;
  • 如果內容中出現逗號,則需要大括號(大括號),但在其他情況下則不需要。

成分列表分為兩次:

  1. 在任何;
  • 第一項儲存在foresttoks 暫存器中
  • 進一步處理任何其他項目;
  1. 在任何*
  • 如果第一項為空,則在之後新增一條規則到 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}
...

結果

相關內容