如何在 Tikz 中的矩形角落附近制作标签?

如何在 Tikz 中的矩形角落附近制作标签?

如何在 Tikz 中在矩形内角附近制作标签?我想在小矩形的每个角添加一个字母。字母必须仍然在矩形内。

\documentclass{beamer}
\usepackage{tikz}    

\begin{document}
   \begin{frame}
      \begin{center}
      \begin{tikzpicture}
       \fill [orange] (-2,-1) rectangle (2,2);
       \draw (-2, -1) rectangle (2,2);
       \fill [white] (0,0) rectangle (1,1);
       \draw (0,0) rectangle (1,1);
       \draw[->, thick] (0.5, 0.5) -- (2.3, 1);
       \fill [orange] (2.5,0.5) rectangle (1+2.5,1.5);
       \draw (2.5,0.5) rectangle (1+2.5,1.5);
      \end{tikzpicture}
      \end{center}
   \end{frame}
\end{document}

答案1

我建议一种更通用的方法,不像宫濑使用绝对坐标的解决方案。

您可以node在之后插入路径运算符rectangle,并通过调整anchor选项在内部创建节点。

这样,节点就不依赖任何绝对坐标,通过改变矩形尺寸,标签将留在正确的位置。

\documentclass{beamer}
\usepackage{tikz}

\begin{document}
   \begin{frame}
      \begin{center}
      \begin{tikzpicture}
       \fill [orange] (-2,-1) rectangle (2,2);
       \draw (-2, -1) rectangle (2,2);
       \fill [white] (0,0) rectangle (1,1);
       \draw (0,0) rectangle (1,1);
       \draw[->, thick] (0.5, 0.5) -- (2.3, 1);
       
       \draw[font=\tiny, outer sep=5pt, fill=orange] (2.5,0.5) rectangle node[anchor=north west]{1} node[anchor=north east]{2} node[anchor=south west]{3} node[anchor=south east]{4} (1+2.5,1.5);
       
       \draw (2.5,0.5) rectangle (1+2.5,1.5);
      \end{tikzpicture}
      \end{center}
   \end{frame}
\end{document}

在此处输入图片描述


编辑:

作为奎伯比尔贝尔指出,我对任意矩形的自动放置是错误的。只要您愿意调整outer sep选项,以前的解决方案仍然有效。

然而,为了我追求的多功能性,这里采用略有不同的方法:

除了使用rectangle路径运算符之外,您还可以使用

(2.5,0.5) |- (2+2.5,1.5) |- cycle

绘制相同的矩形

(2.5,0.5) rectangle (2+2.5,1.5)

但是该方法的优点是,您现在可以在运算符node之前和之后明确指定|-,并且节点将已经放置在角落中。

在此处输入图片描述

\draw[font=\tiny, fill=orange] (2.5,0.5) node{1} |- node{2} (2+2.5,1.5) node{3} |- node{4} cycle;

现在只需对齐标签,以便它们出现在矩形内。您可以通过anchor上一个解决方案中的任一选项或通过leftrightabovebelow组合(相当于锚点组合)来完成此操作。最后,这是添加inner sep一些填充

\documentclass{beamer}
\usepackage{tikz}

\begin{document}
   \begin{frame}
      \begin{center}
      \begin{tikzpicture}
       \fill [orange] (-2,-1) rectangle (2,2);
       \draw (-2, -1) rectangle (2,2);
       \fill [white] (0,0) rectangle (1,1);
       \draw (0,0) rectangle (1,1);
       \draw[->, thick] (0.5, 0.5) -- (2.3, 1);
       
       \draw[font=\tiny, inner sep=2pt, fill=orange] (2.5,0.5) node[above right]{1} |- node[below right]{2} (2+2.5,1.5) node[below left]{3} |- node[above left]{4} cycle;
       
      \end{tikzpicture}
      \end{center}
   \end{frame}
\end{document}

在此处输入图片描述

答案2

您可以组合

\fill [orange] (-2, -1) rectangle (2,2);
\draw          (-2, -1) rectangle (2,2);

\filldraw[fill=orange] (-2, -1) rectangle (2,2);

这可以节省您两次指定坐标的时间。

如果你想在矩形内切出一个矩形,你可以用even odd rule在一个路径中:

\filldraw[fill=orange] (-2, -1) rectangle (2,2) (0,0) rectangle (1,1);

为了将字母放置在角落内,我将为您提供一个自定义to path名称rectangle mark corners inside

\tikzset{
  rectangle mark corners inside/.style n args={4}{%
    to path={
      rectangle (\tikztotarget)
      node[anchor=north east, corner label/.try] at (\tikztotarget) {#1}
      node[anchor=north west, corner label/.try] at (\tikztostart|-\tikztotarget) {#2}
      node[anchor=south west, corner label/.try] at (\tikztostart) {#3}
      node[anchor=south east, corner label/.try] at (\tikztostart-|\tikztotarget) {#4}}}}

这基本上仍然有效,(<start>) rectangle (<target>)但它使用您给出的坐标将节点放置在角落。

这仍然允许您使用even odd rule而不必提供两次坐标:

\filldraw [fill=orange, even odd rule]
  (-2, -1)    rectangle                           (2, 2)
   (0,  0) to[rectangle mark corners inside=ABCD] (1, 1);

我已将样式添加corner label到角落节点,以便您可以在中心位置设置这些节点的样式。

代码

\documentclass[tikz,convert]{standalone}
\tikzset{
  rectangle mark corners inside/.style n args={4}{%
    to path={
      rectangle (\tikztotarget)
      node[anchor=north east, corner label/.try] at (\tikztotarget) {#1}
      node[anchor=north west, corner label/.try] at (\tikztostart|-\tikztotarget) {#2}
      node[anchor=south west, corner label/.try] at (\tikztostart) {#3}
      node[anchor=south east, corner label/.try] at (\tikztostart-|\tikztotarget) {#4}}}}
\begin{document}
\begin{tikzpicture}[corner label/.style={font=\tiny}]
  \filldraw [fill=orange, even odd rule]
    (-2, -1)    rectangle                           (2, 2)
     (0,  0) to[rectangle mark corners inside=ABCD] (1, 1);
  \draw[->, thick] (0.5, 0.5) -- (2.3, 1);
  \filldraw [fill=orange!50]
    (2.5, 0.5) to[rectangle mark corners inside={1}{foo}{bar}{4}] (1+2.5,1.5);
\end{tikzpicture}
\end{document}

输出

在此处输入图片描述

答案3

可能有更优雅的方法来实现它,但是简单的\node命令应该可以达到目的:

\documentclass{beamer}

\usepackage{tikz}

\begin{document}
   \begin{frame}
      \begin{center}
      \begin{tikzpicture}
       \fill [orange] (-2,-1) rectangle (2,2);
       \draw (-2, -1) rectangle (2,2);
       \fill [white] (0,0) rectangle (1,1);
       % Position nodes in the corners
       \node at (0,0)[above right]{\small $A$};
       \node at (1,0)[above left]{\small $B$};
       \node at (1,1)[below left]{\small $C$};
       \node at (0,1)[below right]{\small $D$};
       %
       \draw (0,0) rectangle (1,1);
       \draw[->, thick] (0.5, 0.5) -- (2.3, 1);
       \fill [orange] (2.5,0.5) rectangle (1+2.5,1.5);
       \draw (2.5,0.5) rectangle (1+2.5,1.5);
      \end{tikzpicture}
      \end{center}
   \end{frame}
\end{document}

结果

相关内容