如何在tikz中将节点放置在绝对坐标系中

如何在tikz中将节点放置在绝对坐标系中

编辑:我最初给出的例子相当有缺陷——我就不说了,但第二部分是我真正挣扎的部分。

原始问题 类似的问题此主题但我没有使用 pgfplotsset,所以该解决方案对我来说不起作用。

我正在开发一个工具来帮助我生成图表。出于某种原因,要绘制下面的图表:

在此处输入图片描述

我必须生成 tikz:

\documentclass{article}
\usepackage[utf8]{inputenc}
\usepackage{textcomp}
\usepackage{tikz}
\usetikzlibrary{shapes,arrows}

\title{Diagram Practice}
%\author{Jack Turner}
\date{}

\begin{document}

\tikzstyle{box}=[minimum size = 1.25cm,right=10mm, rectangle, draw=black, fill=white, thick]

\begin{tikzpicture}
    \draw[black]    (1.,0.) -- (2.,0.);
    \node[box] (f)  at (1.,0.)      {$f$};

    \draw[black]    (3.25,-0.208333333333) -- (3.5,-0.208333333333);
    \draw[black]    (3.25,0.208333333333) -- (3.5,0.208333333333);
\end{tikzpicture}
\end{document}

当盒子放置在 (1,0) 时,我必须为从左侧进入的电线设置一条从 (1,0) -- (2,0) 的路径,这对我来说似乎很愚蠢。为什么不是从 (0,0) -- (1,0) 的路径?编辑:这是因为right = 10mm我的造型

此外,为什么盒子没有被放置在原点?为什么路径会碰到盒子的中心而不是与底部对齐?

随着图表变得更大,缩放似乎变得更加复杂 - 所以如果我把三个盒子放在一起并尝试将它们连接起来,那么几乎不可能让连接它们的电线真正接触到盒子的边缘。

有没有办法阻止 tikz 进行这些相对调整?

问题2

如果我做:

\documentclass{article}
\usepackage[utf8]{inputenc}
\usepackage{textcomp}
\usepackage{tikz}
\usetikzlibrary{shapes,arrows}

\title{Diagram Practice}
%\author{Jack Turner}
\date{}

\begin{document}

\tikzstyle{box}=[minimum size = 1.25cm,right=10mm, rectangle, draw=black, fill=white, thick]

\begin{tikzpicture}
    \node[box] (f)  at (1.,0.)      {$f$};
    \node[box] (h)  at (7.,0)       {$h$};
\end{tikzpicture}
\end{document}

节点绘制得很好:

在此处输入图片描述

但如果我删除左边的节点:

\documentclass{article}
\usepackage[utf8]{inputenc}
\usepackage{textcomp}
\usepackage{tikz}
\usetikzlibrary{shapes,arrows}

\title{Diagram Practice}
%\author{Jack Turner}
\date{}

\begin{document}

\tikzstyle{box}=[minimum size = 1.25cm,right=10mm, rectangle, draw=black, fill=white, thick]

\begin{tikzpicture}
    \node[box] (h)  at (7.,0)       {$h$};
\end{tikzpicture}
\end{document}

节点移到了原来f所在的位置。我怎样才能h让它停留在完全相同的位置?这是 LaTeX 对图表所做的操作,还是 tikz 的问题?

答案1

tikz自动调整图像的边界框以适应图片中的所有元素。如果您的图片tikzpicture仅包含一个元素(无论其坐标如何),边界框都会缩小到该元素。请参阅以下示例 - 文档结构如下:

\documentclass[tikz, border=5mm]{standalone}
\usetikzlibrary{backgrounds}
\tikzset{
  box/.style={draw, minimum size=1.25cm},
  background rectangle/.style={draw, red}
}

\begin{docment}
  \begin{tikzpicture}[show background rectangle]
    <code here>
  \end{tikzpicture}
\end{document}

用于background rectangle显示 的边界框tikzpicture

这里是两个节点及其结果边界框的示例:

\node [box] at (0,0) {a};
\node [box] at (7,0) {b};

第一个例子

如果您只有一个元素,tikzpicture则会获得以下边界框:

\node [box] at (7,0) {b};

第二个例子

如果您确实需要自定义边界框 - 我真的不认为有这个必要 - 您可以使用以下示例之一。但要使其正常工作,您必须自己做一些工作,例如计算边界框的大小以及节点在其中的正确位置。

为了扩展边界框,您可以添加其他元素(如矩形)并将它们设置opacity0

\draw [opacity=0] (0,0) rectangle (7,1.25);
\node [box, anchor=south west] at (7,0) {b};

第三个例子

另一种可能性是使用命令\useasboundingbox,它允许您使用tikz-element 作为自定义边界框:

\useasboundingbox (0,0) rectangle (8.25,1.25);
\node [box, anchor=south west] at (7,0) {b};

第四个例子

编辑: 绘制图表的一些额外想法

当您使用节点绘制图像时,您可以使用它们将图像与路径连接起来。如果您已经获得了节点的坐标,则无需手动指定路径的每个坐标。请参阅以下示例:

\documentclass[tikz, border=5mm]{standalone}

\tikzset{
  box/.style={draw, minimum size=1.25cm},
  double distance=12pt,
}

\begin{document}
  \begin{tikzpicture}
    \node (a) [box] at (0,0) {$a$};
    \node (b) [box] at (3,0) {$b$};
    \node (c) [box] at (3,3) {$c$};

    \draw [double] (a) -- (b);
    \draw [double] (a) |- (c);
    \draw [-<] (a) -- ++(-1,0);
    \draw (b) -- (c);
    \draw [->] (c) -- ++(1,0);
  \end{tikzpicture}
\end{document}

第五个例子

编辑链中节点的示例

\documentclass[tikz, border=5mm]{standalone}

\tikzset{
  box/.style={draw, minimum size=1.25cm},
  double distance=12pt,
}

\begin{document}
  \begin{tikzpicture}
    \node (a) [box] at (0,0) {$a$};
    \node (b) [box] at (3,0) {$b$};
    \node (c) [box] at (6,0) {$c$};

    \draw [double] (a) -- (b);
    \draw [double] (a) |- +(2,2) -| (c);
    \draw [-<] (a) -- ++(-1,0);
    \draw (b) -- (c);
    \draw [->] (c) -- ++(1,0);
  \end{tikzpicture}
\end{document}

第六个例子

相关内容