
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}