숲으로 생성된 수평 다이어그램에 딱 맞습니다.

숲으로 생성된 수평 다이어그램에 딱 맞습니다.

저는 포리스트 패키지를 사용하여 아래와 유사한 다이어그램을 만듭니다. B5와 B6 사이의 거리를 줄일 수 있는 기회가 있나요? B6과 그 하위 트리를 위로 이동할 수 있다면 더 좋을 것 같습니다. 나는 지금까지 성공하지 못한 채 , , 및 l옵션 sl sep가지고 놀았습니다 . 사실 기본값이 제 역할을 해야 한다고 생각했는데 그렇지 않네요...s sepfitfit=tight

여기에 이미지 설명을 입력하세요

예제 다이어그램의 소스:

\documentclass{standalone}
\usepackage{forest}

\begin{document}
\begin{forest}
for tree={fit=tight}
[A, grow'=east
[B1,
[B2,
[B3,
[B4,
[B5,
[B6, grow'=east,
[C, grow'=east,
[D1, for tree={grow=north},
[D2,
[D3
]]]
[E1, for tree={grow=south},
[E2
]]]]]]]]]]
\end{forest}
\end{document}

전체 다이어그램 소스:

\documentclass{standalone}
\usepackage{forest}

% Document
\begin{document}
\begin{forest}
for tree={anchor=center}
[FB, grow'=east
[BJ$_X$
[BJ$_Y$
[BJ$_Z$
[BJ$_X$
[BJ$_Y$
[BJ$_Z$, grow'=east
[F, grow'=east
[LLJ$_X$, for tree={grow=north}
[LLJ$_Z$
[F, grow=east
[FT, for tree={grow=south}, [WMJ$_{ABD}$, [WM$_{ABD}$]]]
[ABD, for tree={grow=north}
[ULJ$_X$
[ULJ$_Y$
[ULJ$_Z$
[F, grow=east
[FT, for tree={grow=south}, [WMJ$_{THO}$, [WM$_{THO}$]]]
[THO, for tree={grow=north}
[F, grow'=east
[F, grow'=east
[LNJ$_X$, [LNJ$_Y$, [LNJ$_Z$, [HEA, for tree={grow=north}, [EP]]]]]
[SJ$_{L,X}$, for tree={grow=south}, [SJ$_{L,Y}$, [SJ$_{L,Z}$, [UPA$_L$, [EJ$_{L,Z}$, [LOA$_L$, [EP]]]]]]]
]
[SJ$_{R,X}$, for tree={grow=south}, [SJ$_{R,Y}$, [SJ$_{R,Z}$, [UPA$_R$, [EJ$_{R,Z}$, [LOA$_R$, [EP]]]]]]]
]]]]]]]]]]
[PEL, for tree={grow=south}
[F, grow=south
[HJ$_{L,X}$, [HJ$_{L,Y}$, [HJ$_{L,Z}$, [THI$_L$, [KJ$_{L,Z}$, [SHA$_L$, [AJ$_{L,X}$, [AJ$_{L,X}$, [AJ$_{L,X}$, [F, grow'=east, [COPJ$_{L,X}$, for tree={grow=north}, [COPJ$_{L,Y}$, [COPJ$_{L,Z}$, [COP$_L$]]]], [FOO$_L$, [EP]]]]]]]]]]]]
[HJ$_{R,X}$, [HJ$_{R,Y}$, [HJ$_{R,Z}$,, [THI$_R$, [KJ$_{R,Z}$, [SHA$_R$, [AJ$_{R,X}$, [AJ$_{R,X}$, [AJ$_{R,X}$, [F, grow'=east, [COPJ$_{R,X}$, for tree={grow=north}, [COPJ$_{R,Y}$, [COPJ$_{R,Z}$, [COP$_R$]]]], [FOO$_R$, [EP]]]]]]]]]]]]
]]]]]]]]]]
\end{forest}
\end{document}

답변1

솔직히 말해서 이것이 크게 개선되었는지는 잘 모르겠습니다. 그러나 무슨 일이 일어나고 있는지 훨씬 더 명확하고 코드가 훨씬 덜 복잡해졌습니다. 또한 약간 더 컴팩트합니다(너비와 높이/깊이가 모두 OP 솔루션보다 작습니다). 물론 이것이 중요한지 여부는 또 다른 문제입니다.

\documentclass[border=10pt]{standalone}
\usepackage{forest}
\usetikzlibrary{matrix}
\tikzset{
  fixedBase/.style={draw, circle, fill=black, text=white},
  prismaticJoint/.style={draw},
  revoluteJoint/.style={draw, rounded corners=2mm},
  rigidLink/.style={draw, color=blue, fill=blue, text=white},
  fixedTranslation/.style={draw, fill=gray},
  fixedRotation/.style={draw, fill=gray, rounded corners=2mm},
  springDamperElement/.style={draw, circle, color=blue, fill=blue, text=white},
  fork/.style={draw, circle, color=red, fill=red, text=white},
  endpoint/.style={draw, fill=black, text=white},
}
\newsavebox\treelegend
\setbox0=\hbox{% solution from Steven B. Segletes: https://tex.stackexchange.com/a/366710/
  \begin{tikzpicture}
    \matrix [matrix of nodes, column 2/.style={text height=3.5mm, text depth=3.5mm, text width=40mm}]
    {%
      |[fixedBase]| F8 & Fixed base \\
      |[prismaticJoint]| PJ & Prismatic joint \\
      |[revoluteJoint]| RJ & Revolute joint \\
      |[rigidLink]| RL & Rigid link \\
      |[fixedTranslation]| FT & Fixed translation \\
      |[springDamperElement]| SD & Spring-damper element \\
      |[fork]| F & Fork \\
      |[endpoint]| EP & Endpoint \\
    };
  \end{tikzpicture}%
}
\savebox\treelegend{\copy0}
\begin{document}
\begin{forest} 
  fork/.style={
    /tikz/fork,
    before computing xy={for children={l'+=8mm}},
  },
  for tree={
    anchor=center
  },
  before computing xy={
    for tree={l'=9mm},
  }
  [FB, fixedBase, grow'=east, anchor=east
    [BJ$_X$, prismaticJoint, for tree={grow=north}
    [BJ$_Y$, prismaticJoint
    [BJ$_Z$, prismaticJoint
    [BJ$_X$, revoluteJoint
    [BJ$_Y$, revoluteJoint
    [BJ$_Z$, revoluteJoint, grow'=east
    [F, fork, grow'=east, before computing xy={for children={l'+=5mm}}
    [LLJ$_X$, revoluteJoint, for tree={grow=north}
            [LLJ$_Z$, revoluteJoint
            [F, fork, grow=east
            [FT, fixedTranslation, for tree={grow=south}
              [WMJ$_{ABD}$, prismaticJoint
                [SD, springDamperElement, before computing xy={l'=0pt, s'=15mm}]
                [EP, endpoint, before computing xy={l=10mm, s'=0pt}]
              ]
            ]
            [ABD, rigidLink, for tree={grow=north}
            [ULJ$_X$, revoluteJoint
            [ULJ$_Y$, revoluteJoint
            [ULJ$_Z$, revoluteJoint
            [F, fork, grow=east
            [FT, fixedTranslation, for tree={grow=south}
              [WMJ$_{THO}$, prismaticJoint
                [SD, springDamperElement, before computing xy={l'=0pt, s'=15mm}]
                [EP, endpoint, before computing xy={l=10mm, s'=0pt}]
              ]
            ]
            [THO, rigidLink, for tree={grow=north}
            [F, fork, grow'=east, before computing xy={for children={l'+=10mm}}
            [F, fork, grow'=east
            [LNJ$_X$, revoluteJoint
              [LNJ$_Y$, revoluteJoint
                [LNJ$_Z$, revoluteJoint
                  [HEA, rigidLink, for tree={grow=north}
                    [EP, endpoint]
                  ]
                ]
              ]
            ]
            [SJ$_{L,X}$, revoluteJoint, for tree={grow=south}
              [SJ$_{L,Y}$, revoluteJoint
                [SJ$_{L,Z}$, revoluteJoint
                  [UPA$_L$, rigidLink
                    [EJ$_{L,Z}$, revoluteJoint
                      [LOA$_L$, rigidLink
                        [EP, endpoint]
                      ]
                    ]
                  ]
                ]
              ]
            ]
          ]
          [SJ$_{R,X}$, revoluteJoint, for tree={grow=south}
            [SJ$_{R,Y}$, revoluteJoint
              [SJ$_{R,Z}$, revoluteJoint
                [UPA$_R$, rigidLink
                  [EJ$_{R,Z}$, revoluteJoint
                    [LOA$_R$, rigidLink
                      [EP, endpoint]
                    ]
                   ]
                 ]
               ]
             ]
           ]
    ]]]]]]]]]
    ]
    [PEL, rigidLink, for tree={grow=south}
      [F, fork, grow=south, before packing={s sep'+=5mm}, before computing xy={for children={l'-=5mm}}
        [HJ$_{L,X}$, revoluteJoint
          [HJ$_{L,Y}$, revoluteJoint
            [HJ$_{L,Z}$, revoluteJoint
              [THI$_L$, rigidLink
                [KJ$_{L,Z}$, revoluteJoint
                  [SHA$_L$, rigidLink
                    [AJ$_{L,X}$, revoluteJoint
                      [AJ$_{L,Y}$, revoluteJoint
                        [AJ$_{L,Z}$, revoluteJoint
                          [F, fork, grow'=east
                            [COPJ$_{L,X}$, prismaticJoint, for tree={grow=north}
                              [COPJ$_{L,Y}$, prismaticJoint
                                [COPJ$_{L,Z}$, prismaticJoint
                                  [EP, endpoint]
                                ]
                              ]
                            ]
                            [FOO$_L$, rigidLink
                              [EP, endpoint]
                            ]
                          ]
                        ]
                      ]
                    ]
                  ]
                ]
              ]
            ]
          ]
        ]
        [HJ$_{R,X}$, revoluteJoint
          [HJ$_{R,Y}$, revoluteJoint
            [HJ$_{R,Z}$, revoluteJoint
              [THI$_R$, rigidLink
                [KJ$_{R,Z}$, revoluteJoint
                  [SHA$_R$, rigidLink
                    [AJ$_{R,X}$, revoluteJoint
                      [AJ$_{R,Y}$, revoluteJoint
                        [AJ$_{R,Z}$, revoluteJoint
                          [F, fork, grow'=east
                            [COPJ$_{R,X}$, prismaticJoint, for tree={grow=north}
                              [COPJ$_{R,Y}$, prismaticJoint
                                [COPJ$_{R,Z}$, prismaticJoint
                                  [EP, endpoint]
                                ]
                              ]
                            ]
                            [FOO$_R$, rigidLink
                              [EP, endpoint]
                            ]
                          ]
                        ]
                      ]
                    ]
                  ]
                ]
              ]
            ]
          ]
        ]
      ]
    ]]]]]]]]
  ]
  \node [anchor=north west] at (current bounding box.north west) {\usebox{\treelegend}};
\end{forest}
\end{document}

어느 방향으로 가는 나무

답변2

좋습니다. 초기 힌트를 제공해 주신 Bobyandbob과 Tina에게 감사드립니다. 옵션이 l sep핵심이었습니다. 다음은 제가 마침내 생각해낸 코드와 다이어그램입니다. 일부를 사용해야 했지만 before computing xy결과가 마음에 듭니다.

여기에 이미지 설명을 입력하세요

\documentclass{standalone}
\usepackage{forest}

\begin{document}
\forestset{
fixedBase/.style={draw, circle, fill=black, text=white},
prismaticJoint/.style={draw},
revoluteJoint/.style={draw, rounded corners=2mm},
rigidLink/.style={draw, color=blue, fill=blue, text=white},
fixedTranslation/.style={draw, fill=gray},
fixedRotation/.style={draw, fill=gray, rounded corners=2mm},
springDamperElement/.style={draw, circle, color=blue, fill=blue, text=white},
fork/.style={draw, circle, color=red, fill=red, text=white},
endpoint/.style={draw, fill=black, text=white},
}

\begin{forest}
for tree={anchor=center}
[FB, fixedBase, l sep=-300mm, grow'=east,
[FB, fixedBase, edge'={}, grow'=east, before computing xy={l=5mm, s=160mm}, [Fixed base, edge'={}, anchor=west, before computing xy={l=5mm, s=0}]],
[PJ, prismaticJoint, edge'={}, grow'=east, before computing xy={l=5mm, s=150mm}, [Prismatic joint, edge'={}, anchor=west, before computing xy={l=5mm, s=0}]],
[RJ, revoluteJoint, edge'={}, grow'=east, before computing xy={l=5mm, s=140mm}, [Revolute joint, edge'={}, anchor=west, before computing xy={l=5mm, s=0}]],
[RL, rigidLink, edge'={}, grow'=east, before computing xy={l=5mm, s=130mm}, [Rigid link, edge'={}, anchor=west, before computing xy={l=5mm, s=0}]],
[FT, fixedTranslation, edge'={}, grow'=east, before computing xy={l=5mm, s=120mm}, [Fixed translation, edge'={}, anchor=west, before computing xy={l=5mm, s=0}]],
[SD, springDamperElement, edge'={}, grow'=east, before computing xy={l=5mm, s=110mm}, [Spring-damper element, edge'={}, anchor=west, before computing xy={l=5mm, s=0}]],
[F, fork, edge'={}, grow'=east, before computing xy={l=5mm, s=100mm}, [Fork, edge'={}, anchor=west, before computing xy={l=5mm, s=0}]],
[EP, endpoint, edge'={}, grow'=east, before computing xy={l=5mm, s=90mm}, [Endpoint, edge'={}, anchor=west, before computing xy={l=5mm, s=0}]],
[BJ$_X$, prismaticJoint, l sep=-300mm, for tree={grow=north}, before computing xy={l=12mm, s=0}, 
[BJ$_Y$, prismaticJoint, l sep=-300mm, 
[BJ$_Z$, prismaticJoint, l sep=-300mm, 
[BJ$_X$, revoluteJoint, l sep=-300mm, 
[BJ$_Y$, revoluteJoint, l sep=-300mm, 
[BJ$_Z$, revoluteJoint, l sep=-300mm, grow'=east,
[F, fork, grow'=east,
[LLJ$_X$, revoluteJoint, l sep=-300mm, for tree={grow=north},
[LLJ$_Z$, revoluteJoint, l sep=-300mm,
[F, fork, grow=east,
[FT, fixedTranslation, for tree={grow=south}, [WMJ$_{ABD}$, prismaticJoint, [SD, springDamperElement, before computing xy={l=0, s=15mm}], [EP, endpoint, before computing xy={l=10mm, s=0}]]],
[ABD, rigidLink, l sep=-300mm, for tree={grow=north},
[ULJ$_X$, revoluteJoint, l sep=-300mm,
[ULJ$_Y$, revoluteJoint, l sep=-300mm,
[ULJ$_Z$, revoluteJoint, l sep=-300mm,
[F, fork, grow=east,
[FT, fixedTranslation, for tree={grow=south}, [WMJ$_{THO}$, prismaticJoint, [SD, springDamperElement, before computing xy={l=0, s=15mm}], [EP, endpoint, before computing xy={l=10mm, s=0}]]],
[THO, rigidLink, l sep=-300mm, for tree={grow=north},
[F, fork, l sep+=15mm, grow'=east,
[F, fork, l sep+=5mm, grow'=east,
[LNJ$_X$, revoluteJoint, [LNJ$_Y$, revoluteJoint, [LNJ$_Z$, revoluteJoint, [HEA, rigidLink, for tree={grow=north}, [EP, endpoint]]]]],
[SJ$_{L,X}$, revoluteJoint, for tree={grow=south}, [SJ$_{L,Y}$, revoluteJoint, [SJ$_{L,Z}$, revoluteJoint, [UPA$_L$, rigidLink, [EJ$_{L,Z}$, revoluteJoint, [LOA$_L$, rigidLink, [EP, endpoint]]]]]]],
],
[SJ$_{R,X}$, revoluteJoint, for tree={grow=south}, [SJ$_{R,Y}$, revoluteJoint, [SJ$_{R,Z}$, revoluteJoint, [UPA$_R$, rigidLink, [EJ$_{R,Z}$, revoluteJoint, [LOA$_R$, rigidLink, [EP, endpoint]]]]]]],
]]]]]]]]]],
[PEL, rigidLink, for tree={grow=south},
[F, fork, grow=south,
[HJ$_{L,X}$, revoluteJoint, l sep=-300mm, [HJ$_{L,Y}$, revoluteJoint, l sep=-300mm, [HJ$_{L,Z}$, revoluteJoint, l sep=-300mm, [THI$_L$, rigidLink, l sep=-300mm, [KJ$_{L,Z}$, revoluteJoint, l sep=-300mm, [SHA$_L$, rigidLink, l sep=-300mm, [AJ$_{L,X}$, revoluteJoint, l sep=-300mm, [AJ$_{L,Y}$, revoluteJoint, l sep=-300mm, [AJ$_{L,Z}$, revoluteJoint, l sep=-300mm, [F, fork, grow'=east, [COPJ$_{L,X}$, prismaticJoint, for tree={grow=north}, [COPJ$_{L,Y}$, prismaticJoint, [COPJ$_{L,Z}$, prismaticJoint, [EP, endpoint]]]], [FOO$_L$, rigidLink, [EP, endpoint]]]]]]]]]]]],
[HJ$_{R,X}$, revoluteJoint, l sep=-300mm, [HJ$_{R,Y}$, revoluteJoint, l sep=-300mm, [HJ$_{R,Z}$, revoluteJoint, l sep=-300mm, [THI$_R$, rigidLink, l sep=-300mm, [KJ$_{R,Z}$, revoluteJoint, l sep=-300mm, [SHA$_R$, rigidLink, l sep=-300mm, [AJ$_{R,X}$, revoluteJoint, l sep=-300mm, [AJ$_{R,Y}$, revoluteJoint, l sep=-300mm, [AJ$_{R,Z}$, revoluteJoint, l sep=-300mm, [F, fork, grow'=east, [COPJ$_{R,X}$, prismaticJoint, for tree={grow=north}, [COPJ$_{R,Y}$, prismaticJoint, [COPJ$_{R,Z}$, prismaticJoint, [EP, endpoint]]]], [FOO$_R$, rigidLink, [EP, endpoint]]]]]]]]]]]],
]]]]]]]]]]
\end{forest}
\end{document}

관련 정보