TikZ 라벨 앵커를 명시적으로 설정하려면 어떻게 해야 합니까?

TikZ 라벨 앵커를 명시적으로 설정하려면 어떻게 해야 합니까?

label노드에 a를 추가하고 싶지만 노드 "내부"에 추가하고 싶습니다. 이 같은:

원하는 출력

실제 키 이름은 없지만 설명서에는 가능할 수도 있다고 나와 있는 것 같습니다.

레이블 노드의 ... 앵커 포인트는 레이블 노드가 기본 노드의 경계에서 "뒤쪽을 향"하는 방식으로 결정됩니다. 선택되는 앵커는 선택한 경계점의 위치, 기본 노드 중심을 기준으로 한 위치, 변형 모양 옵션 설정 여부에 따라 달라집니다.일반적으로 선택은 예상대로 이루어져야 하지만 어려운 상황에서는 스스로 기준점을 설정해야 할 수도 있습니다.(강력하게 추가됨)

하지만 다음과 같은 예를 시도해 보면 다음과 같습니다.

\documentclass{standalone}
\usepackage{tikz}
\begin{document}
\tikz \node [circle,draw,label={[red,anchor=north]above:X}] {my circle};
\end{document}

레이블 노드의 위치는 변경되지 않습니다. 아직은 "바깥"이에요.

실제 출력

어떤 아이디어가 있나요?

답변1

여기서 문제는 TikZ가 \tikz@auto@anchor세트를 덮어쓰는 일부 자동화(즉, 매크로) 를 적용한다는 것입니다 anchor.

.code레이블에 대해 내부적으로 사용되는(예, 자체 설정 이후에도 red, anchor=north) 노드에서 가장 마지막에 적용되고 다음을 호출하는 키를 하이재킹할 수 있습니다 \tikz@auto@anchor.

\tikzset{label anchor/.style={tikz@label@post/.append style={anchor=#1}}}

또는 계산을 수행하는 매크로를 약간 완화하도록 합니다(추가 키가 필요하지 않음).

\tikzset{anchor/.append code=\let\tikz@auto@anchor\relax}

새롭고 개선된 anchor키가 이제 더 전역적으로 사용된다면(예를 들어 \tikz[anchor=<dir>]) 노드에도 영향을 미치게 됩니다(현재는 이를 되돌릴 수 있는 방법이 있습니다).

또한 키도 제공합니다 inside(효과를 반전시키기 위해 두 번 사용할 수도 있음).

암호

\documentclass[tikz]{standalone}
\usepackage{etoolbox}
\makeatletter
\tikzset{anchor/.append code=\let\tikz@auto@anchor\relax}
\tikzset{inside/.code=\preto\tikz@auto@anchor{\pgf@x-\pgf@x\pgf@y-\pgf@y}}
\makeatother
\begin{document}
\tikz\node [anchor=west, circle,draw,label={[red, anchor=north]above:X}] {my circle};
\tikz\node [anchor=west, circle,draw,label={[red, inside]below:X}] {my circle};
\end{document}

산출

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

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

답변2

옵션 을 활용하는 또 다른 접근 방식은 다음과 같습니다 append after command. 요점은 앵커를 참조함으로써 \tikzlastnode.center해당 위치에 상대적으로 레이블을 추가할 수 있다는 것입니다.

이 작업을 수행할 수 있는 새로운 스타일은 다음과 같습니다 my label.

\tikzset{my label/.style args={#1:#2}{
  append after command={
    (\tikzlastnode.center) node [#1] {#2}
    }
  }
}

몇:

\documentclass[tikz,png,border=10pt]{standalone}
\usepackage{tikz}
\tikzset{my label/.style args={#1:#2}{
    append after command={
       (\tikzlastnode.center) node [#1] {#2}
    }
  }
}
\begin{document}
\tikz \node [circle,draw,my label={red,above=0.15cm:X}] {my circle};
\tikz \node [circle,draw,my label={red,below=0.15cm:X}] {my circle};
\end{document}

결과는 다음과 같습니다.

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

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

스타일은 첫 번째 인수에서 모든 TikZ 옵션을 허용하므로 색상과 위치를 쉽게 사용자 정의할 수 있습니다. 실제로 텍스트가 겹치지 않도록 오프셋을 약간 조정하는 것이 좋습니다.

대신에 레이블이 항상 "북쪽 경계선" 아래에 배치되어야 한다는 것을 알고 있다면 가장 좋은 방법은 스타일을 다음 my label과 같이 변경하는 것입니다.

\tikzset{my label/.style args={#1:#2}{
    append after command={
       (\tikzlastnode.north) node [#1] {#2}
    }
  }
}

이런 식으로 다음을 설정하면 됩니다.

\tikz\node [circle,draw,my label={red,below:X}] {my circle};

목표 달성을 가능하게 해줍니다.

몇:

\documentclass[tikz,png,border=10pt]{standalone}
\usepackage{tikz}
\tikzset{my label/.style args={#1:#2}{
    append after command={
       (\tikzlastnode.north) node [#1] {#2}
    }
  }
}
\begin{document}
\begin{tikzpicture}
\node [circle,draw,my label={red,below:X}] {my circle};
\node [circle,draw,my label={red,below=0.15cm:X},xshift=2cm] {my circle};
\end{tikzpicture}
\end{document}

결과:

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

개정

주석에서 언급했듯이 이전 방법은 둘 이상의 레이블을 도입해야 하는 경우 어려움을 겪습니다. 그러나 노드를 도입하는 대신 레이블이 있는 좌표를 도입하면 이는 완벽하게 가능합니다.

코드:

\documentclass[tikz,png,border=10pt]{standalone}
\usepackage{tikz}
\tikzset{my label/.style args={[#1]#2:#3}{
    append after command={
       (\tikzlastnode.center) coordinate[label={[label distance=0.1cm,#1]#2:#3}]
    }
  },
}
\begin{document}
\begin{tikzpicture}
\node [circle,
  draw,
  my label={[red]above:X},
  my label={[green!70!blue]below:Y},
  my label={[blue,yshift=0.3cm]above:Z}] {my circle};
\node [circle,
  draw,
  my label={[blue,yshift=-0.15cm]below:X},
  my label={[green!70!blue]70:Z},
  my label={[orange!80!red]130:Y},
  xshift=2cm] {my circle};
\end{tikzpicture}
\end{document}

결과:

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

주의 사항: 옵션 정의 내에서를 사용하면 label distance다음과 같이 말할 때 레이블 텍스트가 겹치지 않도록 할 수 있습니다.

\tikz\node [circle,draw,my label={[red]below:X}] {my circle};

답변3

레이블을 이동할 수도 있습니다.

\documentclass{standalone}
\usepackage{tikz}
\begin{document}
\tikz \node [circle,draw,label={[red,yshift=-0.5cm]above:X}] {my circle};

\tikz \node [circle,draw,label={[red,label distance=-0.5cm]above:X}] {my circle};
\end{document}

관련 정보