도형과 텍스트 콘텐츠를 가로질러 선을 그립니다.

도형과 텍스트 콘텐츠를 가로질러 선을 그립니다.

기존 모양과 텍스트 콘텐츠를 가로질러 날아갈 수 있는 두 노드 사이에 선을 그리고 싶습니다. 아래 예에서는 노드 라벨을 연결 a하고 교차하는 선이 있습니다 . tikz 결과에서 사실을 확인한 후 수동으로 "라인 플라이"를 수행할 수 있습니다. 그런데 이런 상황을 판단하고 실행 중에 자동으로 처리할 수 있는 장치가 있을까요? 같은 것binit\draw [flyline, ->] (a) to (b)

\documentclass[convert]{standalone}
\usepackage{tikz}
\usetikzlibrary{shapes, positioning}

\begin{document}
    \begin{tikzpicture}[auto]
        \node[rectangle, draw=black, label={right:this is a test}] (init) {hello};
        \node[rectangle, draw=black, above right=of init] (a) {a};
        \node[rectangle, draw=black, below right=of init] (b) {b};
        \draw [->] (a) to (b);
        % I can change to use this after I find the intersect fact from the result
        %\draw (a) to (a|-init.north);
        %\draw [->] (b|-init.south) to (b);
    \end{tikzpicture}
\end{document}

업데이트: @Rmano의 의견에 대한 응답: 답변해 주셔서 감사합니다. 예, 레이어를 사용하면 문제가 부분적으로 해결될 수 있습니다. 저는 미리 정의된 5개의 레이어를 제공하는 `tikz-layers` 패키지를 사용했습니다. 코드 조각은 다음과 같습니다.
\documentclass[convert]{standalone}
\usepackage{tikz}
\usetikzlibrary{shapes, positioning, fit}
\usepackage{tikz-layers}

\begin{document}
    \begin{tikzpicture}[auto]
        \node[rectangle, draw=black, label={[fill=white, inner sep=2pt, name=lbl]right:this is a test}] (init) {hello};
        \node[rectangle, draw=black, above right=of init] (a) {a};
        \node[rectangle, draw=black, below right=of init] (b) {b};
        \begin{scope}[on behind layer]
            \draw [->] (a) to (b);
        \end{scope}
        \begin{scope}[on background layer]
            \node [fit=(init)(a)(b)(lbl), fill=cyan] () {};
        \end{scope}
    \end{tikzpicture}
\end{document}

다음과 같은 결과를 제공합니다

제가 완벽하지 않다고 생각하는 한 가지는 이것이 배경을 덮는 라벨을 채우게 한다는 것입니다. 원래 label는 텍스트였지만 이제는 배경 채우기에 투명하지 않은 모양을 갖게 됩니다. 배경 채우기와 동일하게 레이블 채우기를 변경할 수 있지만 cyan이로 인해 또 다른 종속성이 생성됩니다.

밑줄만 가리고 밑줄은 가리지 않는 label가상 경계를 가질 수 있습니까 ?drawfill


업데이트 : `contour`를 사용하라는 @Rmano의 제안에 따라 MWE를 다음과 같이 업데이트하세요.
\documentclass[convert]{standalone}
\usepackage{tikz}
\usetikzlibrary{shapes, positioning, fit}
\usepackage{tikz-layers}
\usepackage{bidicontour}
\usepackage{bidi}
\bidicontourlength{2pt}

\begin{document}
    \begin{tikzpicture}[auto]
        \node[rectangle, draw=black, label={[inner sep=2pt, name=lbl]right:{\bidicontour{cyan}{this is a test}}}] (init) {hello};
        \node[rectangle, draw=black, above right=of init] (a) {a};
        \node[rectangle, draw=black, below right=of init] (b) {b};
        \begin{scope}[on behind layer]
            \draw [->] (a) to (b);
        \end{scope}
        \begin{scope}[on background layer]
            \node [fit=(init)(a)(b)(lbl), fill=cyan] () {};
        \end{scope}
        %\draw (a) to (a|-init.north);
        %\draw [->] (b|-init.south) to (b);
    \end{tikzpicture}
\end{document}

거의 완벽한 결과를 얻습니다.

도와 주셔서 감사합니다!

답변1

밑줄만 가리고 밑줄은 가리지 않는 label가상 경계를 가질 수 있습니까 ?drawfill

나는 아닌 것 같아요.

그리고 제 생각에는 글쓰기 label={[fill=cyan]text}label={[...]\bidicontour{cyan}{text}}. 항상 배경색을 명시적으로 작성해야 합니다 label={...}.

다음 예제에서는 배경색을 한 번만 쓰려는 시도를 보여줍니다. 정의pgfonlayerreversed 내에서 복사되었습니다.이전 답변.

\documentclass[tikz]{standalone}
\usetikzlibrary{backgrounds, shapes, positioning, fit}

\usepackage{xpatch}

\makeatletter
% copied from my previous answer https://tex.stackexchange.com/a/562606
\let\pgfonlayerreversed\pgfonlayer
\let\endpgfonlayerreversed\endpgfonlayer

\xpatchcmd\pgfonlayerreversed
  {\expandafter\box\csname pgf@layerbox@#1\endcsname\begingroup}
  {\begingroup}
  {}{\fail}

\xpatchcmd\endpgfonlayerreversed
  {\endgroup}
  {\endgroup\expandafter\box\csname pgf@layerbox@\pgfonlayer@name\endcsname}
  {}{\fail}

% similar to \tikz@background@framed, but using "pgfonlayerreversed" envi
\def\tikz@background@framed@reversed{%
  \tikz@background@save%
  \pgfonlayerreversed{background}
    \path[style=background rectangle] (\tikz@bg@minx,\tikz@bg@miny) rectangle (\tikz@bg@maxx,\tikz@bg@maxy);
  \endpgfonlayerreversed
}%

% similar to option "show background rectangle"
\tikzset{
  show background rectangle reversed/.style={
    execute at end picture=\tikz@background@framed@reversed
  }
}
\makeatother

% user interface
\tikzset{
  background color/.style={
    show background rectangle reversed,
    inner frame sep=2pt,
    background rectangle/.append style={draw=none, #1},
    every node/.append style={#1},
    every label/.append style={#1}
  }
}

\begin{document}
    \begin{tikzpicture}[background color={fill=cyan}]
        \node[draw, label={[inner sep=2pt, name=lbl]right:this is a test}] (init) {hello};
        \node[draw, above right=of init] (a) {a};
        \node[draw, below right=of init] (b) {b};
        
        \begin{scope}[on background layer]
            \draw [->] (a) to (b);
        \end{scope}
    \end{tikzpicture}
\end{document}

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

관련 정보