出力例の大半は、forest
(不自然ではないが)言語ツリーでよく見られるピラミッド型の形状をたどります。料理レシピのフォーマットの実験として、ピラミッドを反転してみました。
\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
それ自体がノードを に変換し、それ自体がコンテンツを分割するなどできます。tabular
align
より一般的には、などのカスタム マクロを挿入するよりも、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つに分かれています:
- いずれにおいても
;
:
- 最初の項目は
forest
toksレジスタに格納されます - 追加の項目はさらに処理されます。
- いずれにおいても
*
:
- 最初の項目が空の場合、ルールが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}
...