![移动节点形状的绘制但不移动其锚点](https://linux22.com/image/408864/%E7%A7%BB%E5%8A%A8%E8%8A%82%E7%82%B9%E5%BD%A2%E7%8A%B6%E7%9A%84%E7%BB%98%E5%88%B6%E4%BD%86%E4%B8%8D%E7%A7%BB%E5%8A%A8%E5%85%B6%E9%94%9A%E7%82%B9.png)
我正在尝试排版一个非常简单的图表来说明 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 yshift
或border 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}};
使用.south
和anchor=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}