通过使用 ,节点内的文本不会拉伸到节点的右侧\hfill
。这可能是它无法使用的原因吗font=\tiny
?但我需要那么小的文本,并且我希望解释文本位于节点内的右侧,而简短的术语Frg 1
位于节点内的左侧。
\documentclass{article}
\usepackage{tikz}
\usetikzlibrary{positioning,shadows,arrows,backgrounds,fit,matrix}
\begin{document}
\begin{figure} [H]
\begin{tikzpicture}
[font=\tiny,
pfeil/.style ={draw,->,shorten <=0pt,>=stealth', thick, -latex',shorten >=0pt},
stext/.style ={draw,solid, fill=gray!10, text width=25em,minimum height=1em, drop shadow, rounded corners},
snr/.style ={drop shadow,fill=gray!10,draw,solid,circle,minimum width=4mm,inner sep=0pt},
every matrix/.style ={matrix of nodes, row sep=1mm, column sep=3mm,fill=gray!40,draw=black,dashed,rounded corners,inner sep=2mm}]
\newcommand{\beschr}[1]{\hfill\textit{#1}};
\matrix (einlegen)
{
\node (e11) {}; & \node (e12) [snr] {1.}; & \node (e13) [stext] {Frg 1\beschr{Freigabe Einfahrt Bauteil}}; \\
\node (e21) {}; & \node (e22) [snr] {2.}; & \node (e23) [stext] {MZ 11 V\beschr{Sauger ein}}; \\
\node (e31) {}; & \node (e32) [snr] {3.}; & \node (e33) [stext] {Frg 2\beschr{Freigabe Ausfahrt Bauteil}}; \\
};
\node [fit=(e11)(e31),label={[rotate=90,xshift=1mm]center:\textbf\tiny{Einlegen}}] {};
\matrix (arbeitsstellung) [below=.3cm of einlegen]
{
\node (a11) {}; & \node (a12) [snr] {4.}; & \node (a13) [stext] {MZ 12 V\beschr{Spanner Innenblech vorw\"arts}}; \\
\node (a21) {}; & \node (a22) [snr] {5.}; & \node (a23) [stext] {M1 \& M2 V\beschr{B\"ugel M1 \& M2 vorw\"arts}}; \\
\node (a31) {}; & \node (a32) [snr] {6.}; & \node (a33) [stext] {M3 \& M6 V\beschr{B\"ugel M3 \& M6 vorw\"arts}}; \\
\node (a41) {}; & \node (a42) [snr] {7.}; & \node (a43) [stext] {M4 \& M5 V\beschr{B\"ugel M4 \& M5 vorw\"arts}}; \\
\node (a51) {}; & \node (a52) [snr] {8.}; & \node (a53) [stext] {MZ 13 V\beschr{Klemmeinheit l\"osen}}; \\
\node (a61) {}; & \node (a62) [snr] {9.}; & \node (a63) [stext] {MZ 14 V\beschr{Niederhalteraufnahme vorw\"arts}}; \\
\node (a71) {}; & \node (a72) [snr] {10.};& \node (a73) [stext] {MZ 15-19 V\beschr{Niederhalteraufnahmen vorw\"arts}}; \\
\node (a81) {}; & \node (a82) [snr] {11.};& \node (a83) [stext] {MZ 21-22 V\beschr{Niederhalterzustellungen vorw\"arts}}; \\
\node (a91) {}; & \node (a92) [snr] {12.};& \node (a93) [stext] {MZ 23-24 V\beschr{Niederhalterzustellungen vorw\"arts}}; \\
\node (a101) {}; & \node (a102) [snr] {13.};& \node (a103) [stext] {MZ 20 V\beschr{Sperrventil vorw\"arts}}; \\
};
\node [fit=(a11)(a101),label={[rotate=90]center:\textbf\tiny{Falze in Arbeitsstellung}}] {};
\begin{scope} [every path/.style=pfeil]
\path (e33) -- (a13);
\end{scope}
\end{tikzpicture}
\end{figure}
答案1
这里发生了什么?
这里的问题是,在构建节点时,对 的值text width
(存储在内部宏 中)进行了两次评估。第一次是在键的内容(存储在 中)处于活动状态时,第二次是在收集节点文本但未执行之后:\tikz@text@width
font
\tikz@textfont
\tikz@textfont
在节点文本被收集之前
\tikz@do@fig
:\tikz@textfont% \ifx\tikz@text@width\pgfutil@empty% \else% \begingroup% \pgfmathsetlength{\pgf@x}{\tikz@text@width}% \pgfutil@minipage[t]{\pgf@x}\leavevmode\hbox{}% \tikz@text@action% \fi%
包含
\tikz@textfont
的\tiny
显然会改变与字体相关的大小,如em
和 ,ex
从而导致minipage
宽度为25em = 170.14122pt
。收集节点文本并创建框(仍然只有
170pt
宽度)后,还会进行另一次检查\tikz@fig@continue
:\ifx\tikz@text@width\pgfutil@empty% \else% \pgfmathsetlength{\pgf@x}{\tikz@text@width}% \wd\pgfnodeparttextbox=\pgf@x% \fi%
你看,同样的事情再次发生,但现在没有
\tiny
active ,导致\pgf@x
设置为大约25em = 250pt
。然后将构造的框的宽度设置为这些250pt
。您有一个节点,它的宽度有一个盒子,但只有宽度
250pt
的内容。170pt
(我认为这至少不是一个功能。为什么还要text width
再次检查?)
修复
我们可以用各种方法解决这个问题。
不要使用与字体相关的尺寸……
…在text width
,text height
和中text depth
(后两个不会像宽度那样执行两次,但您仍然会得到与节点内实际字体大小无关的结果)。
我text width=5cm
得到:
不要使用该font
键来切换字体大小。
您可以\tiny
在开始时直接发出tikzpicture
(但随后所有与字体相关的尺寸都会发生变化,在您的示例中似乎只在样式minimum height
的关键中stext
)。在 TikZ 图片中激活text width=25em
并激活后,我得到:\tiny
或者在节点文本本身中手动使用它,但这在大多数情况下不是一个选择,因为它会涉及更多的手动工作,而我们font
首先想避免使用密钥来避免这种工作。
仅评估text width
一次输入。
如果你坚持使用字体相关的大小,你可以text width
在使用时评估其内容(这意味着这些尺寸将始终在字体大小处于活动状态时进行评估外部节点)。修复包括:
\makeatletter
\tikzset{text width/.code=\pgfmathparse{#1}\edef\tikz@text@width{+\pgfmathresult pt}}
\makeatother
通过此修复和text width=15em
,我得到:
不要让 TikZ“纠正”盒子的宽度。
由于无法保证这不会破坏任何东西,我们可以简单地\tikz@text@width
从构造代码中删除第二次检查。etoolbox
这使得这变得非常简单:
\usepackage{etoolbox}
\makeatletter
%\patchcmd\tikz@fig@continue{\wd\pgfnodeparttextbox=\pgf@x}{}{}
\patchcmd\tikz@fig@continue{%
\ifx\tikz@text@width\pgfutil@empty%
\else%
\pgfmathsetlength{\pgf@x}{\tikz@text@width}%
\wd\pgfnodeparttextbox=\pgf@x%
\fi%
}{}{}
\makeatother
(与上面输出相同。)