![如何在 Tikz 中的矩形角落附近制作标签?](https://linux22.com/image/452880/%E5%A6%82%E4%BD%95%E5%9C%A8%20Tikz%20%E4%B8%AD%E7%9A%84%E7%9F%A9%E5%BD%A2%E8%A7%92%E8%90%BD%E9%99%84%E8%BF%91%E5%88%B6%E4%BD%9C%E6%A0%87%E7%AD%BE%EF%BC%9F.png)
如何在 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
上一个解决方案中的任一选项或通过left
、right
、above
、below
组合(相当于锚点组合)来完成此操作。最后,这是添加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}