使用 \hfill 将文本拉伸至节点的边界

使用 \hfill 将文本拉伸至节点的边界

通过使用 ,节点内的文本不会拉伸到节点的右侧\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@widthfont\tikz@textfont\tikz@textfont

  1. 在节点文本被收集之前\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

  2. 收集节点文本并创建框(仍然只有170pt宽度)后,还会进行另一次检查\tikz@fig@continue

    \ifx\tikz@text@width\pgfutil@empty%
    \else%
      \pgfmathsetlength{\pgf@x}{\tikz@text@width}%
      \wd\pgfnodeparttextbox=\pgf@x%
    \fi%
    

    你看,同样的事情再次发生,但现在没有\tinyactive ,导致\pgf@x设置为大约25em = 250pt。然后将构造的框的宽度设置为这些250pt

  3. 您有一个节点,它的宽度有一个盒子,但只有宽度250pt的内容。170pt

(我认为这至少不是一个功能。为什么还要text width再次检查?)

修复

我们可以用各种方法解决这个问题。

不要使用与字体相关的尺寸……

…在text widthtext 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

(与上面输出相同。)

相关内容