移动节点形状的绘制但不移动其锚点

移动节点形状的绘制但不移动其锚点

我正在尝试排版一个非常简单的图表来说明 DBMS 交互:两个矩形和一个database形状这个定义

\documentclass{standalone}
\usepackage{tikz}
\usetikzlibrary{shapes}
\tikzstyle{database} = [cylinder,shape border rotate=90, aspect=0.25, draw ]
\begin{document}
\begin{tikzpicture}[every node/.append style={font=\scriptsize}]
\begin{scope}[every node/.append style={minimum height=1.5cm, minimum width=2cm, draw}, node distance=4cm]
\node[rectangle] (app) {Logiciel};
\node[rectangle] (sgbd) [right of=app] {SGBD};
\node[database] (data) [right of=sgbd] {Données};
\end{scope}
\draw[latex-latex] (sgbd.east) --  node[above] {Algorithmes} (data.west);
\draw[-latex] (app.15) -- node[above] {Requête} (sgbd.165);
\draw[latex-] (app.-15) -- node[below] {Réponse} (sgbd.195);
\end{tikzpicture}
\end{document}

但是,旋转的圆柱体没有与矩形对齐: 在此处输入图片描述

我尝试yshift在样式定义中添加一个,但是虽然这确实移动了形状边框,但它也会移动里面的文本和箭头指向的位置,而这并不是我想要的。

我怎样才能移动边框的绘制而不改变节点在 tikz 的放置系统中的行为方式?

没有border yshiftborder shift键。

答案1

您可以将整个节点向下移动,然后使用 将文本向上移动\raisebox{6pt}{Données}

在下面的代码中,我添加了positioning库,并使用right=of <nodename>而不是right of=<nodename>,因为后一种语法被视为已弃用。默认情况下,这意味着 是node distance在节点边界而不是节点中心之间计算的,但我on grid还添加了 ,这意味着使用节点中心。

我使用的最后一个节点的完整代码是

\node[database, right=of sgbd.south, anchor=bottom] (data) {\raisebox{6pt}{Données}};

使用.southanchor=bottom可确保节点底部正确对齐。

在此处输入图片描述

\documentclass[border=5mm]{standalone}
\usepackage{tikz}
\usetikzlibrary{shapes,positioning}
\tikzset{
  database/.style={cylinder,shape border rotate=90, aspect=0.25, draw}
}
\begin{document}
\begin{tikzpicture}[every node/.append style={font=\scriptsize}]
\begin{scope}[
  every node/.append style={
    minimum height=1.5cm,
    minimum width=2cm,
    draw},
    node distance=4cm,
    on grid
]

\node (app) {Logiciel};
\node[right=of app] (sgbd) {SGBD};
\node[database, right=of sgbd.south, anchor=bottom] (data) {\raisebox{6pt}{Données}};
\end{scope}
\draw[latex-latex] (sgbd.east) --  node[above] {Algorithmes} (sgbd.east -| data.west);
\draw[-latex] (app.15) -- node[above] {Requête} (sgbd.165);
\draw[latex-] (app.-15) -- node[below] {Réponse} (sgbd.195);
\end{tikzpicture}
\end{document}

答案2

我确实认为Torbørn T. 的解决方案是可行的方法。这是为了提供一种替代方案,其中一切都由样式完成database。但是,缺点是它没有与形状相同的锚点cylinder(这似乎是您要问的)。

\documentclass{standalone}
\usepackage{tikz}
\usetikzlibrary{calc}
\tikzset{database/.style={path picture={
\draw let \p1=($(path picture bounding box.north east)-(path picture bounding
box.south west)$) in
([xshift=\pgflinewidth/2,yshift=-\pgflinewidth/2-#1*\x1]path picture bounding box.north west)
-- ([xshift=\pgflinewidth/2,yshift=\pgflinewidth/2+#1*\x1]path picture bounding box.south west)
arc[start angle=180,end angle=360,x radius=\x1/2-\pgflinewidth/2,y radius=\x1*#1] --
([xshift=-\pgflinewidth/2,yshift=-\pgflinewidth/2-#1*\x1]path picture bounding
box.north east)
arc[start angle=0,end angle=360,x radius=\x1/2-\pgflinewidth/2,y radius=\x1*#1];
},outer sep=0pt,draw=none},database/.default=0.1}
\begin{document}
\begin{tikzpicture}[every node/.append style={font=\scriptsize}]
\begin{scope}[every node/.append style={minimum height=1.5cm, minimum width=2cm, draw}, node distance=4cm]
\node[rectangle] (app) {Logiciel};
\node[rectangle] (sgbd) [right of=app] {SGBD};
\node[database] (data) [right of=sgbd] {Donn\'ees};
\end{scope}
\draw[latex-latex] (sgbd.east) --  node[above] {Algorithmes} (data.west);
\draw[-latex] (app.15) -- node[above] {Requ\^ete} (sgbd.165);
\draw[latex-] (app.-15) -- node[below] {R\'eponse} (sgbd.195);
\end{tikzpicture}
\end{document}

在此处输入图片描述

相关内容