在 tikzpicture 环境中使用 tikz 命令(对齐问题)

在 tikzpicture 环境中使用 tikz 命令(对齐问题)

这是使用 TikZ 扩展嵌套框

\tikz在环境中使用该命令时tikzpicture,内容的定位会改变。

以下是两个例子:

在此处输入图片描述

负责的代码如下:

\documentclass{article}

\usepackage{tikz}
\usetikzlibrary{backgrounds,shapes.multipart}

\begin{document}

Here we have a
\begin{tikzpicture}[show background rectangle]
  \node[draw, rectangle split, rectangle split parts=2] at (0,0)
    { foo%
      \nodepart{two}
        bar
    };
\end{tikzpicture} picture.

Here we have a
\begin{tikzpicture}[show background rectangle]
  \tikz{
    \node[draw, rectangle split, rectangle split parts=2] at (0,0)
      { foo%
        \nodepart{two}
          bar
      };
  }
\end{tikzpicture}
picture.

\end{document}

第二个例子中节点的左下角正好位于图片的中间,所以它出现在那里一定有很好的理由。:-) 哪一个?

答案1

您无法\tikztikzpicture这样的环境中使用。我不知道您想做什么,也不知道是什么让您认为您可以这样做。

命令\tikz是环境的简写tikzpicture。在环境中直接使用它与在环境中tikzpicture使用环境一样有意义!tikzpicturetikzpicture

所以你的第二张图片基本上是:

\begin{tikzpicture}[show background rectangle]
\begin{tikzpicture}
    \node[draw, rectangle split, rectangle split parts=2] at (0,0)
      { foo%
        \nodepart{two}
          bar
      };
\end{tikzpicture}
\end{tikzpicture}

仍然想知道为什么这不能给你带来好的结果吗?

唯一令人惊讶的是,两者都没有引发错误消息!(这应该作为错误报告发送给开发人员。)

您无法在 内安全地使用任意常规排版命令tikzpicture。它的所有内容都放置在一个虚拟 TeX 框中,该框随后会被丢弃,而绘图命令会将其材料添加到第二个框中,然后进行排版。尝试在图片中添加一些文本而不添加任何其他内容。TikZ 会忽略它。但是,您可以安全地在节点内容内使用\tikztikzpicture。TikZ 会在处理节点内容时小心地中断当前图片。

我现在可以推测为什么你会得到与你完全相同的输出,但这很重要。显然,大小/边界框仍然存在,但位置是。


如果您希望能够在节点内部和外部使用绘图代码,您可以tikzpicture通过测试例如是否\path具有其正常的 TikZ 定义来查看您当前是否在节点内部。请注意,在排版节点内容时,TikZ 会将其自己的命令恢复为先前的定义。

\documentclass{article}

\usepackage{tikz}
\usetikzlibrary{backgrounds,shapes.multipart}

\makeatletter
% Ensures processing of content inside a `tikzpicture` (using the short version `\tikz`)
\newcommand{\ensuretikz}{%
  \ifx\path\tikz@command@path
    \expandafter\@firstofone
  \else
    \expandafter\tikz
  \fi
}
\makeatother

\begin{document}

Here we have a
\begin{tikzpicture}[show background rectangle]
  \node {
  \ensuretikz{%
  \node[draw, rectangle split, rectangle split parts=2] at (0,0)
    { foo%
      \nodepart{two}
        bar
    };
 }
 };
\end{tikzpicture} picture.

Here we have a
\begin{tikzpicture}[show background rectangle]
  \ensuretikz{
    \node[draw, rectangle split, rectangle split parts=2] at (0,0)
      { foo%
        \nodepart{two}
          bar
      };
  }
\end{tikzpicture}
picture.

\end{document}

答案2

我在提问之前找到了这个问题 这个

我不明白为什么 tikzpicture 里面有一个 tikzpicture 是错误的,我明白这可能很奇怪或者非常奇怪但有一些链接环境的例子。

我意识到使用 pgfornament 包是可能的,但我们需要小心。Till Tantau 想到了这一点\tikzifinpicture(参见问题 如何检查... 好吧,这可能是一个错误的想法,但它确实有效,尽管有 Tantau 的评论

% TT:这是一个错误的测试!谁会用这个?...

现在问题很简单:你在 tikz 的图片中,然后你创建了一个新图片(tikz 或非 tikz)。此图片放置在当前点,这里是矩形的中心,默认情况下,图片放置在西南锚点处,如下例所示:

在此处输入图片描述

    \documentclass{article}    
    \usepackage{tikz}
    \usetikzlibrary{backgrounds,shapes.multipart}
    \begin{document}

Here we have \tikz{%
    \node[draw, rectangle split, rectangle split parts=2]  at (0,0)
      { foo%
        \nodepart{two}
          bar
      }; 
        } and  \tikz[baseline=(current bounding box.center)]{
    \node[anchor=west,draw, rectangle split, rectangle split parts=2]  at (0,0)
      { foo%
        \nodepart{two}
          bar
      }; 
        } picture.  

    \end{document}

对于你的情况,你需要做同样的事情:

在此处输入图片描述

\documentclass{article}
\usepackage{tikz}
\usetikzlibrary{backgrounds,shapes.multipart}

\begin{document}

Here we have a   
\begin{tikzpicture}[show background rectangle]
    \tikz[baseline=(x.center)]{
    \node[anchor=west,draw, rectangle split, rectangle split parts=2] (x) at (0,0)
      { foo%
        \nodepart{two}
          bar
      };
  }% 
\end{tikzpicture}
picture.  

\end{document} 

相关内容