비정형 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자체적으로 노드를 s로 만들고 콘텐츠 등을 분할할 수 있습니다.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명령을 생성하는 스타일입니다.
    • 줄을 구분하는 데 사용합니다 \\.
  • 내용에 쉼표가 있는 경우 중괄호(중괄호)가 필요하지만 그 외에는 필요하지 않습니다.

성분 목록은 두 번 나뉩니다.

  1. 언제든지 ;:
  • forest첫 번째 항목은 toks 레지스터 에 저장됩니다.
  • 추가 항목은 추가로 처리됩니다.
  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}
...

결과

관련 정보