我正在尝试在节点内插入一些垂直空间(因此它将被稍后填充)。
\node [draw,rounded corners,minimum height=5cm] (node1) {\underline{Case 1}};
这是给出的:
然而,我想要情况1位于节点的顶部。
有谁能帮忙吗?提前致谢。
答案1
anchor
您可以通过使用和第二个节点来实现想要的效果:
\documentclass{article}
\usepackage{tikz}
%%\usetikzlibrary{calc}%% not necessary, but potentially useful
\pagestyle{empty}
\begin{document}
\begin{tikzpicture}
\node [draw,rounded corners,minimum height=5cm,minimum width=2cm] (node1) {};
\node [anchor=north west] at (node1.north west) {\underline{Case 1}};
\end{tikzpicture}
\end{document}
这里发生的事情是node1.north west
告诉\node
您想要将内容放置在何处。anchor=north west
告诉\node
使用文本的左上角作为锚所要放置的位置。
如果我们做的一些事情与你实际想要的完全不同,那么会更容易看到发生了什么(但也许这会清楚地说明这两个north west
指令的含义):
\documentclass{article}
\usepackage{tikz}
\begin{document}
\begin{tikzpicture}
\node [draw,rounded corners,minimum height=5cm,minimum width=4cm] (node1) {};
\node [anchor=north west] at (node1.north west) {\fbox{Case: anchor is NW}};
\node [anchor=south west] at (node1.north west) {\fbox{Case: anchor is SW}};
\node [anchor=south east] at (node1.north west) {\fbox{Case: anchor is SE}};
\node [anchor=north east] at (node1.north west) {\fbox{Case: anchor is NE}};
\foreach \myanchor in {north west,south west,north east,south east}
{
\node[fill,circle,inner sep=1pt,outer sep=1ex,anchor=\myanchor] at (node1.north west){};
}
\end{tikzpicture}
\end{document}
请注意,anchor
ing 是关于文本的角相对于正在使用的节点的位置(在本例中是)node1.north west
。
此外,使用 TikZ 库,calc
您可以更好地控制定位:
\node [anchor=north west] at ($(node1.north west)+(1ex,-2ex)$) {\underline{Case 1}};
这里的定位更加极端一些,有助于说明正在发生的事情。
更新
如果您经常这样做,那么(按照@Qrrbrbirlbel 的建议),您可以定义一种样式并在一个节点内完成所有操作:
\documentclass{article}
\usepackage{tikz}
\begin{document}
\begin{tikzpicture}[my case/.style={draw,
rounded corners,
minimum height=5cm,
minimum width=4cm,
append after command={node[anchor=north west]
at (\tikzlastnode.north west)
{#1}}}]
\node [my case={\textbf{Case A:}}] (node1) {};
\end{tikzpicture}
\end{document}
是的,您可以为此定义一个命令:
\documentclass{article}
\usepackage{tikz}
\def\mycasenode(#1)#2;{\node[my case={#2}] (#1) {};}
\begin{document}
\begin{tikzpicture}[my case/.style={draw,
rounded corners,
minimum height=5cm,
minimum width=4cm,
append after command={node[anchor=north west]
at (\tikzlastnode.north west)
{#1}}}]
%\node [my case={\textbf{Case A:}}] (node1) {};
\mycasenode (node1) {\textbf{Case A:}};
\end{tikzpicture}
\end{document}
注意我是如何创建定义来模仿 TikZ 命令和节点样式的。
答案2
我通常会有另一个专门用于显示的节点。我发现这更容易。
\node [draw,rounded corners,minimum height=5cm] (node1) {};
\node [below=0cm of node1.north]{\underline{Case 1}};
答案3
当 TikZ 收集某个节点的文本时,它会将其直接放入一个框(\hbox
)中,这个框(除了选项text width
、text height
和text depth
)的大小与其内容完全相同。
然后,这个框及其尺寸用于计算其周围的形状(在我们的例子中是rectangle
)。这个框总是放置在形状的一个特定位置(大多数情况下,这是中心)。如果不重写形状,我们就无法更改此位置。
在这个答案中,采用了不同的方法。在收集了节点内容并创建了框之后,将重新设置框。
键的值valign height
用于将节点放入更大(更高)的框中。可以使用valign
接受以下值的键更改垂直对齐方式:
top
,center
(默认)和bottom
。
我不是拳击专家,因此可能有更好的方法来重新使用\pgfnodeparttextbox
并将其装入新盒子中。
应该注意的是,这种方法最适合矩形,因为框的垂直高度会改变形状尺寸的计算。解决
这个问题的另一种方法可能是 \pgfnodeparttextbox
直接改变框的高度和深度(即从高度中减去一个长度,然后加上深度,会将框的内容推到顶部,但不会改变框本身的大小)。这可能会导致文本突出形状。
本主题与以下主题类似:关于将节点内容提升到某个值的相关问题(我主要指的是答案中的图像)。
我认为这只对矩形才真正可行。
代码
\documentclass[tikz]{standalone}
\usepackage{etoolbox}
\makeatletter
\def\tikz@valign{c}
\tikzset{
enforce alignment/.code={% even without text width
\csname if#1\endcsname
\def\tikz@text@width
{\pgfkeysvalueof{/pgf/minimum width}-2*(\pgfkeysvalueof{/pgf/inner xsep})}%
\else
\let\tikz@text@width\pgfutil@empty
\fi},
enforce alignment/.default=true,
valign/.is choice,
valign/top/.code=\def\tikz@valign{t},
valign/center/.code=\def\tikz@valign{c},
valign/bottom/.code=\def\tikz@valign{b},
valign height/.initial=%
\pgfkeysvalueof{/pgf/minimum height}-2*(\pgfkeysvalueof{/pgf/inner ysep})}
\patchcmd\tikz@fig@continue{\tikz@node@transformations}{%
\pgfmathsetlength\pgf@x{\pgfkeysvalueof{/tikz/valign height}}%
\pgf@y\ht\pgfnodeparttextbox
\advance\pgf@y\dp\pgfnodeparttextbox
\ifdim\pgf@y<\pgf@x
\if\tikz@valign b%
\advance\pgf@x-\dp\pgfnodeparttextbox
\setbox\pgfnodeparttextbox\vbox to \pgf@x{\vfill\hbox{\unhbox\pgfnodeparttextbox}}%
\else\if\tikz@valign t%
\setbox\pgfnodeparttextbox\vbox to \pgf@x{\hbox{\unhbox\pgfnodeparttextbox}\vfill}%
\fi\fi\fi
%
\tikz@node@transformations}{}{}
\makeatother
\tikzset{nodes={draw,rounded corners},minimum height=1.5cm,minimum width=2cm}
\begin{document}
\begin{tikzpicture}
\node [text=red, valign=top] {Case t};
\node {Case c};
\node [text=blue, valign=bottom] {Case b};
\end{tikzpicture}
\begin{tikzpicture}[enforce alignment]
\node [text=red, valign=top, align=left ] {Case t};
\node [ align=center] {Case c};% or "enforce alignment=false"
\node [text=blue, valign=bottom, align=right] {Case b};
\end{tikzpicture}
\begin{tikzpicture}[enforce alignment, align=center, minimum height=3cm]
\node [text=red, valign=top] {Case t Case t Case t Case t};
\node at (right:2) {Case c Case c Case c Case c};
\node [text=blue, valign=bottom] at (right:4) {Case b Case b Case b Case b};
\end{tikzpicture}
\end{document}