tikz 화살표를 x 높이 문자와 정렬

tikz 화살표를 x 높이 문자와 정렬

화살표 TeX는 x 문자 높이의 수직 중앙에 있는 것처럼 보입니다. 이 경우 final 은 다음과 같습니다 e.

\documentclass{article}
\begin{document}
Source $\rightarrow$ Target
\end{document}

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

TikZ반면에 화살표는 대문자 높이 문자(이 경우 대문자 및 다음)의 수직 중앙에 있는 것처럼 S보입니다 T.

\documentclass{article}
\usepackage{tikz}
\begin{document}

\begin{tikzpicture}
    \draw [thick, ->] (0,0) -- (1,0);
    \node[left] at (0,0) {Source};
    \node[right] at (1,0) {Target};
\end{tikzpicture}

\end{document} 

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

왼쪽 단어는 x 높이 문자로 끝나고 오른쪽 단어는 대문자 높이 문자로 시작하기 때문에 (적어도 나에게는) 오른쪽 단어가 오른쪽 단어보다 높은 위치에 있다는 착시 현상이 발생합니다. 왼쪽에 있는 단어. TikZx 높이 문자를 사용하여 화살표를 수직으로 중앙에 배치하여 이를 방지하고 싶습니다 . 어떻게 해야 하나요?


편집하다

사실 저는 이것이 착시 현상이 아니라는 것을 방금 알아차렸습니다. 오른쪽에 있는 문구~이다g기준선 아래로 내려가는 문자가 포함되어 있기 때문에 더 높게 배치됩니다 . 지금 이 문제를 피하려면(별도의 질문이어야 할 것 같습니다) 다음 예를 고려하십시오. 화살표는 이전 의 중심에 있지 않으며 e제 눈에는 잘못된 것처럼 보입니다.

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

답변1

TikZ는 hbox를 사용하여 노드 내용을 입력합니다. 명시적인 텍스트 깊이가 지정되지 않은 경우 디센더로 인해 노드 높이가 변경됩니다. 따라서 디센더가 있는 텍스트와 디센더가 없는 텍스트가 있는 경우 높이가 필연적으로 달라집니다. 그게 다야. 놀랄 것도 없고 변경할 것도 많지 않습니다.

디센더가 없는 경우 왜 텍스트 깊이가 필요한지 언급하셨는데, 이는 실제로 모든 문자를 구문 분석하고 문자가 있는지 확인하지 않고 디센더가 있거나 없는 노드가 올바르게 정렬되는지 확인하는 것입니다.

하지만!

노드 주위에 테두리를 그리지 않으려면 텍스트 깊이를 재설정하고 그대로 사용할 수 있습니다.

\documentclass[tikz,border=5mm]{standalone}
\begin{document}
\begin{tikzpicture}[every node/.style={inner sep=0,text depth=0,draw}]
    \node[anchor=east] (s) at (0,0) {Source};
    \node[anchor=west] (t) at (1,0) {Target};
\draw[->] (s) -- (t);
\end{tikzpicture}
\end{document}

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

또는 조금 더 많은 노력을 들여 연결을 그려도 괜찮다면 기준선을 기준으로 노드를 이를 존중하는 디센더와 정렬할 수 있습니다. 그러나 그러면 노드가 수평으로 완벽하게 정렬되지 않으므로 직교 식별자 등을 사용하여 연결을 그려야 합니다.

\documentclass[tikz,border=5mm]{standalone}
\begin{document}
\begin{tikzpicture}[every node/.style={draw,inner sep=0}]
    \node[anchor=mid] (s) at (0,0) {Source};
    \node[anchor=mid] (t) at (1.5,0) {Target};
\draw[->,ultra thick] (s) -- (t);
\draw[-latex,red] (s) -- (t.west|-s);
\end{tikzpicture}
\end{document}

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

left와 를 모두 사용하려면 몇 가지 준비가 필요하다는 점을 명심하세요 mid. 제가 아는 한 바로 지원되지는 않습니다.

답변2

후속 조치타악기'에스답변text depth = 0, 우리는 상자의 바닥이 디센더가 있는 문자가 없는 것처럼 그려지는 것을 나타내기 위해 사용할 수 있고 text height = 1ex, 모든 문자가 x 높이인 것처럼 상자의 상단을 그리는 데 사용할 수 있습니다:

\documentclass[tikz, border = 1mm]{standalone}
\begin{document}
\begin{tikzpicture}[every node/.style = {inner sep = 0, text height = 1ex, text depth = 0, draw}]
    \node[anchor = east] (s) at (0,0) {Sphinx};
    \node[anchor = west] (t) at (1,0) {Sphinx};
    \draw[->] (s) -- (t);
\end{tikzpicture}
\end{document}

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

결과적으로 화살표는 x 높이 문자의 중심에 수직으로 정렬됩니다.

답변3

TikZ/PGF는 어떻게 노드 내부에 텍스트를 배치합니까?

한 부분으로 구성된 간단한 노드(이 예에서는 모양을 사용함 rectangle)의 경우 TikZ는 모든 노드 내용을 하나의 TeX 상자(평소와 같이 너비, 높이 및 깊이 포함)에 넣고 패딩 /pgf/inner xsep/pgf/inner ysep.

노드의 중심은 TeX 상자의 중심이 됩니다. 높이와 깊이가 다른 상자의 경우 상자 전체에서 수직 높이(기준선 기준)가 동일하지 않습니다.

TikZ는 노드를 어떻게 배치합니까?

귀하의 예에서는 left및 기본적으로 및 각각 right동일합니다 . 이러한 앵커는 정의에 따라 앵커와 동일한 수직 높이 및 노드의 각 경계에 있습니다.anchor=eastanchor=westcenter

다음 이미지(PGF 매뉴얼, 섹션 66.2 사전 정의된 모양에서 가져온)에서 볼 수 있듯이 터무니없이 높은 선 덕분에 효과가 훨씬 더 명확하게 표시됩니다.
여기에 이미지 설명을 입력하세요

또한 모든 모양은 실제 텍스트의 기준선을 기반으로 하는 앵커( text, 및 base, 및 ) 를 제공합니다 . 이렇게 하면 이미 사용할 수 있습니다.base westbase eastmidmid westmid east

\documentclass[tikz]{standalone}
\begin{document}
\begin{tikzpicture}
  \draw [thick, ->] (0,0) -- node[at start, anchor=mid east] {Source}
                             node[at end,   anchor=mid west] {Target} (1,0);
\end{tikzpicture}
\end{document} 

(물론 테두리가 drawn이면 다시 다른 수직 높이의 테두리가 생기지만 text depthand text height/or를 \strut사용할 수 있습니다 text depth=+.3\baselineskip, text height=+.7\baselineskip.

미드 앵커의 어리석은 문제

중간 앵커는 기준선(및 해당 앵커)보다 0.5ex 위에 있습니다. 하지만 조심하세요! 글꼴 크기에 따라 달라지는 길이 단위임에도 불구하고 TikZ는 이를 약간 어리석게 구현합니다. 위 예제의 환경 [nodes={font=\Huge}]에 추가하면 어떤 일이 발생하는지 관찰하세요 .tikzpicture
여기에 이미지 설명을 입력하세요

[nodes={/utils/exec=\Huge}](또는 \Huge시작 후에 사용 하면 tikzpicture) 예상했던 결과를 얻을 수 있습니다.

TikZ는 노드 사이에 경로를 어떻게 그리나요?

미드 앵커가 좋은 해결책인 것 같죠?

기준선(또는 "중간선")이 동일한 수직 높이에 위치하도록 노드를 배치하더라도 다음과 같이 연결됩니다.

\documentclass[tikz]{standalone}
\usetikzlibrary{positioning}
\begin{document}
\begin{tikzpicture}
  \node (s) {Source}; \node (t) [mid right=of s] {Target};
  \draw [thick, ->] (s) -- (t);
\end{tikzpicture}
\end{document} 

우리의 소망에 끌려가지 않을 것입니다.

TikZ에 두 개의 노드를 모양(예: coordinates를 제외한 모든 노드)으로 연결하도록 요청하면 노드 모양의 경계에 있는 점을 사용합니다. line-to( --)의 경우 한 노드의 중심에서 다른 노드의 중심으로 "슛"됩니다. 이 광선이 노드의 경계에 닿는 곳에서 선의 실제 시작이 설정됩니다. 이는 실제로 각도 앵커와 다르지 않으므로 위의 예는 다음과 같은 결과를 가져올 수 있습니다.

\draw [thick, ->] (s.359) -- (t.179);

이 모든 것에 대한 해결책은 분명합니다.

\draw [thick, ->] (s.mid east) -- (t.mid west);

그러나 이를 위해서는 앵커를 선택적으로 선택해야 합니다(A에 숨겨질 수 있지만 to path시작 및 대상뿐만 아니라 노드 배치의 가능한 모든 조합을 포괄하려는 경우 앵커도 빠르게 복잡해집니다).

그럼 그냥 닻을 옮기는 게 어때요 center?

그만큼tikz-cd일반적인 앵커와 유사하게 정의된 앵커(및 및 )를 asymmetrical rectangle제공하는 이름이 지정된 모양을 제공합니다 . 고정 대신 키 값이 사용됩니다. 불행하게도 이는 중간 앵커와 마찬가지로 글꼴 크기와 관련하여 동일한 문제를 겪습니다.centereastwestmid.5ex/tikz/commutative diagrams/center yshift

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

암호

\documentclass[tikz]{standalone}
\usepackage{tikz-cd}\tikzset{nodes={shape=asymmetrical rectangle}}
\usetikzlibrary{positioning}
\begin{document}
\begin{tikzpicture}
  \draw [thick, ->] (0,0) -- node[at start, left] {Source}
                             node[at end,  right] {Target} (1,0);
\end{tikzpicture}
\begin{tikzpicture}
  \node (s) {Source}; \node (t) [right=of s] {Target};
  \draw [thick, ->] (s) -- (t);
\end{tikzpicture}
\end{document} 

관련 정보