Tikz 라벨은 글자 크기에 따라 이동됩니다.

Tikz 라벨은 글자 크기에 따라 이동됩니다.

본질적인 행동에 대한 일반적인 설명

tikz 그림의 레이블은 레이블에 있는 문자의 맨 끝으로 정확히 이동됩니다(예: 위). 즉, 디센더를 사용합니다(참조디센더에 대한 Wikipedia 항목) 문자 "g"(또는 스핑크스의 "p")와 같이 문자를 고려합니다.

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

다른 측면(왜 그런 질문을 하는가)

그러나 다음 예는 더 이상 대칭으로 보이지 않습니다.

\documentclass{standalone}
\usepackage{tikz}
\begin{document}
\begin{tikzpicture}
\coordinate (leadl) at (1,0);
\coordinate (leadr) at (2,0);
\fill (leadl)  circle[radius=2pt];
\fill (leadr)  circle[radius=2pt];
\node[above] at (leadl) {left};
\node[above] at (leadr) {right};
\end{tikzpicture}
\end{document}

위 라벨의 예

\documentclass[tikz]{standalone}
\begin{document}
\begin{tikzpicture}
\coordinate (leadl) at (1,0);
\coordinate (leadr) at (2,0);
\fill (leadl)  circle[radius=2pt];
\fill (leadr)  circle[radius=2pt];
\node[below] at (leadl) {lelele};
\node[below] at (leadr) {rerere};
\end{tikzpicture}
\end{document}

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

해결해야 할 문제

이(경우에 따라 원하는) 기능을 해결하는 가장 쉬운 방법은 무엇입니까? 입력 중인 모든 노드 레이블의 모든 문자를 분석하고 싶지는 않습니다.

답변1

TikZ는 이미 이 문제를 이해하고 있으며 text depth길이를 제공합니다. 이를 0으로 설정하거나 모든 노드에 고정된 양의 깊이를 추가할 수 있습니다. 예(어쩐지 비좁은 디자인이 마음에 든다)

\documentclass[tikz]{standalone}
\begin{document}
\begin{tikzpicture}[scale=1.5]
\coordinate (leadl) at (3,0);
\coordinate (leadr) at (5,0);
\fill (leadr)  circle[radius=2pt];
\fill (leadl)  circle[radius=2pt];
\node[above] at (leadl) {left circle};
\node[above,text depth=0pt] at (leadr) {right circle};
\end{tikzpicture}
\end{document}

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

답변2

\strut다음 은 두 가지 변형이 있는 일반적인 솔루션입니다 \vphantom. 이 솔루션은 여러 줄 노드 또는 다른 글꼴 크기와 함께 사용할 수 있습니다.

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

\documentclass{standalone}
\usepackage{tikz}
\tikzset{
  fix node via strut/.style={
    execute at begin node={\strut},
    execute at end node={\strut},
  },
  fix node via vphantom/.style={
    execute at begin node={\vphantom{Ag}},
    execute at end node={\vphantom{Ag}},
  },
}
\begin{document}
\begin{tikzpicture}
  \coordinate (leadl) at (1,0);
  \coordinate (leadr) at (2,0);
  \fill (leadl)  circle[radius=2pt];
  \fill (leadr)  circle[radius=2pt];
  \node[fix node via strut,above,align=center] at (leadl) {left\\left};
  \node[fix node via strut,above,align=center] at (leadr) {right\\right};
  \node[fix node via strut,below,font=\large] at (leadl) {lelele};
  \node[fix node via strut,below,font=\large] at (leadr) {rerere};
  \node[blue,above] at (current bounding box.north){via strut};
\end{tikzpicture}
\begin{tikzpicture}
  \coordinate (leadl) at (1,0);
  \coordinate (leadr) at (2,0);
  \fill (leadl)  circle[radius=2pt];
  \fill (leadr)  circle[radius=2pt];
  \node[fix node via vphantom,above,align=center] at (leadl) {left\\left};
  \node[fix node via vphantom,above,align=center] at (leadr) {right\\right};
  \node[fix node via vphantom,below,font=\large] at (leadl) {lelele};
  \node[fix node via vphantom,below,font=\large] at (leadr) {rerere};
  \node[red,above] at (current bounding box.north){via vphantom};
\end{tikzpicture}
\end{document}

답변3

당신이 해야 할 일은 anchor=base두 노드의 옵션을 추가하는 것입니다. 기준선을 기준으로 두 레이블을 정렬합니다. 아마도 당신은 다음과 같이 쓰려고 했을 것입니다:

\node[above of=leadl, anchor=base] {left circle};

상승 또는 하강에 고정하려면 예를 들어 를 사용합니다 anchor=north. 이렇게 하면 노드의 위쪽 가장자리 중앙에 노드가 고정됩니다. 그러나 노드 내부에는 보이지 않는 패딩이 있습니다(예: fill=blue패딩을 보려면 추가해 보세요). 패딩을 제거하려면 를 사용하십시오 inner sep=0pt. 앵커 위치에 대한 다른 선택 사항으로는 north east, north west, south east등이 있습니다.

답변4

저도 비슷한 목적으로 이런 글을 썼습니다. 아마도 이 기능이 수행하는 작업에 비해 약간 부피가 크지만 아마도 유용할 것입니다.

\usepackage{xparse}
\makeatletter
\newcommand{\standardisebox}[1]{%
    \smash{#1}\vphantom{\strpeters@box@determining@symbol}%
}
\let\standardizebox\standardisebox
\NewDocumentCommand{\setboxdeterminingsymbol}{sm}{%
    \IfBooleanTF {#1}%
                 {\gdef\strpeters@box@determining@symbol{#2}}%
                 {\def\strpeters@box@determining@symbol{#2}}%
}
\NewDocumentCommand{\resetboxdeterminingsymbol}{s}{%
    \IfBooleanTF {#1}%
                 {\setboxdeterminingsymbol*{0}}%
                 {\setboxdeterminingsymbol{0}}%
}
\resetboxdeterminingsymbol
\makeatother

이것이 작동하는 방식은 노드 텍스트를 감싸서 \standardisebox실제 높이와 깊이 대신 숫자 0의 높이와 깊이를 가진 것처럼 조판하는 것입니다. 매크로를 사용하여 높이와 깊이를 결정하는 데 사용되는 문자를 변경할 수 있으며 \setboxdeterminingsymbol, 를 사용하여 일반으로 재설정할 수 있습니다 \resetboxdeterminingsymbol. 전역 변경 사항에는 별표 양식을 사용하세요.

\documentclass{standalone}
\usepackage{tikz}
\usepackage{xparse}
\makeatletter
\newcommand{\standardisebox}[1]{%
    \smash{#1}\vphantom{\strpeters@box@determining@symbol}%
}
\let\standardizebox\standardisebox
\NewDocumentCommand{\setboxdeterminingsymbol}{sm}{%
    \IfBooleanTF {#1}%
                 {\gdef\strpeters@box@determining@symbol{#2}}%
                 {\def\strpeters@box@determining@symbol{#2}}%
}
\NewDocumentCommand{\resetboxdeterminingsymbol}{s}{%
    \IfBooleanTF {#1}%
                 {\setboxdeterminingsymbol*{0}}%
                 {\setboxdeterminingsymbol{0}}%
}
\resetboxdeterminingsymbol
\makeatother
\begin{document}
\begin{tikzpicture}
\coordinate (leadl) at (1,0);
\coordinate (leadr) at (2,0);
\fill (leadr)  circle[radius=2pt];
\fill (leadl)  circle[radius=2pt];
\node[above] at (leadl) {\standardisebox{left}};
\node[above] at (leadr) {\standardisebox{right}};
\end{tikzpicture}
\end{document}

내 경우에는 다른 매크로 내에 체계적으로 노드(실제로는 노드 레이블)를 배치했기 때문에 매크로를 사용하여 모든 상자를 재설정하는 것은 어려운 작업이 아니었습니다. 많은 노드를 수동으로 설정하는 경우 각 노드를 매크로로 래핑하는 것이 어려울 수 있습니다.

관련 정보