요약: DR 요약:

요약: DR 요약:

요약: DR 요약:

리프 노드의 너비를 측정하고 이 측정값을 설정에 사용할 트리에 다시 전달할 수 있는 방법이 있습니까 sibling distance? (비슷한 일을 하고 싶을 수도 있습니다 level distance.)

예:

각각의 리프 노드에 동일한 이미지가 포함된 간단한 트리가 있다고 가정해 보겠습니다.

\documentclass{standalone}
\usepackage{tikz}

\pgfdeclareimage{image}{fptp-ballot}

\begin{document}
  \begin{tikzpicture}
    \node {root} [level/.append style={level distance=4cm}]
      child foreach \c in {1,2} {
        node [fill=red!10] {\pgfuseimage{image}}};
  \end{tikzpicture}
\end{document}

의 기본 설정을 사용하면 sibling distance나뭇잎이 겹칩니다.

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

리프의 너비를 측정할 수 있는 한 가지 방법은 보이지 않는 임시 리프를 만들고 경로에 대한 연산 tmp을 사용하여 let너비를 계산하는 것입니다.

\documentclass{standalone}
\usepackage{tikz}
\usetikzlibrary{calc}

\pgfdeclareimage{image}{fptp-ballot}

\begin{document}
  \begin{tikzpicture}
    \node (tmp) [fill=red!10, transparent, overlay] {\pgfuseimage{image}};

    \path let \p{leafwidth} = ($(tmp.east)-(tmp.west)$) in
     node {root} [level/.append style={level distance=4cm, sibling distance=\x{leafwidth}}]
      child foreach \c in {1,2} {
        node [fill=red!10] {\pgfuseimage{image}}};
  \end{tikzpicture}
\end{document}

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

이 접근 방식의 문제점은 다음과 같습니다. tmp실제로 측정하려는 리프가 나중에 코드에 이미 존재하는 경우 임시 리프를 생성해야 하는 것이 서투른 것 같습니다. 이로 인해 작업이 덜 모듈화됩니다. 리프를 변경하는 경우 그에 따라 노드를 변경해야 합니다 tmp(또는 매크로와 스타일을 사용하여 리프 코드를 제외해야 합니다).

즉, 나는 작동하는 솔루션을 원합니다장소 상에서단일 이미지, 임의의 셀 내용이 포함된 행렬 등 나뭇잎 안에 무엇을 넣었는지에 관계없이

질문:

너비를 직접 측정하는 방법이 있습니까?실제리프 노드를 설정하고 이 측정값을 트리에 전달하여 설정에 사용할 수 있도록 sibling distance?

나는 다음과 같은 것을 쓰고 싶습니다 :

\begin{tikzpicture}
  \node {root} [level/.append style={level distance=4cm, sibling distance=\x{leaf1width}}]
    child foreach \c in {1,2} {
      node (leaf\c)
         [fill=red!10] {\pgfuseimage{image}}
      let \p{leaf\c width} = ($(leaf\c.east)-(leaf\c.west)$) in};
\end{tikzpicture}

여기서는 너비를 직접 측정합니다.실제sibling distance나뭇잎을 사용하여 루트 노드에 설정하려고 합니다 . 불행하게도 이는 "정의되지 않은 제어 시퀀스" 오류를 발생시킵니다. 이는 <argument> \x{leaf1width}아마도 \p{leaf\c width}리프에 도달할 때까지 정의되지 않았기 때문일 것입니다. 이 코드를 고칠 수 있는 방법이 있나요?

열쇠 를 사용할까도 생각했지만 late options,TikZ 매뉴얼다음과 같이 말합니다

이미 존재하는 노드가 결정되고 [...] 로컬 범위에서 옵션이 실행됩니다. 이러한 옵션 중 대부분은 다음 이후로 아무런 효과가 없습니다.노드의 모양을 변경할 수 없습니다즉, 늦은 옵션을 사용하여 빨간색 노드를 녹색 노드로 변경할 수 없습니다.

실제로 다음은 오류 없이 컴파일되지만 는 sibling distance영향을 받지 않습니다.

\begin{tikzpicture}
  \node (root) {root} [level/.append style={level distance=4cm}]
    child foreach \c in {1,2} {
      node (leaf\c)
           [fill=red!10] {\pgfuseimage{image}}
      let \p{leaf\c width} = ($(leaf\c.east)-(leaf\c.west)$) in
      (root) [late options={level/.append style={sibling distance=\x{leaf1width}}}]};
\end{tikzpicture}

답변1

댓글에 링크된 것처럼 이미지를 상자에 먼저 넣으면 이미지 크기를 측정하기가 매우 쉽습니다. 복잡성을 이해하고 있는지 잘 모르겠지만 트리에 들어갈 이미지가 거의 없다면 max(x,y)수학 라이브러리를 통해 해당 측정값의 최대값을 얻을 수 있습니다. 여기서는 매크로를 제거하고 자동화 없이 Yiannis의 솔루션을 사용했습니다.

\documentclass{standalone}
\usepackage{tikz}

\newsavebox{\Image}
\savebox{\Image}{\includegraphics[scale=0.05]{DSOTM}}
\newlength{\imageh}
\newlength{\imagew}
\settoheight{\imageh}{\usebox{\Image}}
\settowidth{\imagew}{\usebox{\Image}}


\begin{document}
  \begin{tikzpicture}
    \node {root}  [level/.append style={
                      level distance=1.5\imageh, sibling distance=1.1\imagew
                      }
                  ]
      child foreach \c in {1,2} {
        node [fill=red!10,inner sep=1pt] {\includegraphics[scale=0.05]{DSOTM}}};
  \end{tikzpicture}
\end{document}

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

관련 정보