为什么 tikz 节点的最小宽度不受 x 比例的影响?

为什么 tikz 节点的最小宽度不受 x 比例的影响?

我正在尝试创建一种时间线图片,其中我设置了“宽度” 230,所有内容都根据该宽度进行渲染。例如,如果我说一个节点的宽度为,115那么它应该是时间线宽度的一半。

但是,它并没有像预期的那样工作。这是我的 MWE:

\documentclass[11pt,a4paper]{letter}

\usepackage{tikz}
\usetikzlibrary{positioning}

\begin{document}

\begin{tikzpicture}[x=0.5mm]%
    \coordinate(start) at (0,0);
    \coordinate(end) at (230, 0);

    \node(start label)[below=1mm of start]{Start};
    \node(end label)[below=1mm of end]{End};

    \draw[thick,->] (start) -- (end);

    \node(test)[draw,thick,above=1mm of start,minimum width=230,anchor=south west]{};
\end{tikzpicture}

\end{document}

x=0.5mm请注意,我在中指定了,tikzpicture以便我可以控制图片的整体宽度,即使它始终是 230 个单位宽。说到这,因为测试节点有一个minimum width=230,我预计它会占据时间线的整个宽度。然而,它呈现如下:

在此处输入图片描述

为什么是这样?

答案1

更改形状声明的默认单位并不那么简单,并且可能会导致意外的副作用。 您想要实现的目标可以通过为节点定义(通用)样式来部分解决,例如:

    box/.style = {draw, thick, minimum width=#1*\unit}]%

您在带有with 的unit环境中声明(请参阅下面的 MWE)。然后您在图像中使用的单位定义中使用。上述考虑的一个例子是您的 MWE :\tikzpicture\def\unit{0.5mm}unit

\documentclass[11pt,a4paper]{article}

\usepackage{tikz}
\usetikzlibrary{calc, 
                positioning}

\begin{document}
\begin{figure}[htb]
\def\unit{0.5mm}  % here you set units used in image
\begin{tikzpicture}[x=\unit,
    box/.style = {draw, thick, minimum width=#1*\unit}
                    ]
    \coordinate[label=below:Start]  (start) at (0,0);
    \coordinate[label=below:End]    (end)   at (230,0);
%
    \draw[thick,->] (start) -- (end);
    \node (test) [box=230, 
                  above right=2mm and 0mm of start] {};
\end{tikzpicture}
\end{figure}

\end{document}

在此处输入图片描述

如果您希望将单位分配给其他节点形状度量,则需要将它们添加到“框”样式定义中。例如:

box/.style args = {#1/#2}draw, thick, minimum width=#1*\unit, minimum height=#2*\unit}

然后使用它作为示例:

\node (test) [box=230/12, 
                  above right=2mm and 0mm of start] {};

答案2

原因是 230 被解释为230ptxy维度分别存储在\pgf@xx和中\pgf@yy。 您可以按如下方式使用它们。

\documentclass[11pt,a4paper]{letter}

\usepackage{tikz}
\usetikzlibrary{positioning}
\newlength{\xunit}
\newlength{\yunit}
\makeatletter
\tikzset{get units/.code={\xunit=\pgf@xx%
\yunit=\pgf@yy}}
\makeatother
\begin{document}

\begin{tikzpicture}[x=0.5mm,get units]%
    \coordinate(start) at (0,0);
    \coordinate(end) at (230, 0);

    \node(start label)[below=1mm of start]{Start};
    \node(end label)[below=1mm of end]{End};

    \draw[thick,->] (start) -- (end);

    \node(test)[draw,thick,above=1mm of start,minimum width=230\xunit,anchor=south west]{};
\end{tikzpicture}

\end{document}

在此处输入图片描述

但是,这可能被认为是一种“黑客行为”。如果您想要调整到startend,则可以使用calc(或fit)。

\documentclass[11pt,a4paper]{letter}

\usepackage{tikz}
\usetikzlibrary{positioning,calc}

\begin{document}

\begin{tikzpicture}[x=0.5mm]%
    \coordinate(start) at (0,0);
    \coordinate(end) at (230, 0);

    \node(start label)[below=1mm of start]{Start};
    \node(end label)[below=1mm of end]{End};

    \draw[thick,->] (start) -- (end);

    \path let \p1=($(end)-(start)$) in node (test)
    [draw,thick,above=1mm of start,minimum width=\x1,anchor=south west]{};
\end{tikzpicture}
\end{document}

在此处输入图片描述

或者通过比较来说明230,它们被解释为230pt230乘以 x 单位。

\documentclass[11pt,a4paper]{letter}

\usepackage{tikz}
\usetikzlibrary{positioning,decorations.pathreplacing}

\begin{document}

\begin{tikzpicture}[x=0.5mm]%
    \coordinate(start) at (0,0);
    \coordinate(end) at (230, 0);

    \node(start label)[below=1mm of start]{Start};
    \node(end label)[below=1mm of end]{End};

    \draw[thick,->] (start) -- (end);

    \node(test)[draw,thick,above=8mm of start,minimum width=230*0.5mm,anchor=south west]{};
    \draw[thick,decorate,decoration={brace,mirror}] (test.south west) -- (test.south east)
    node[midway,below]{230*0.5mm (x unit is 0.5mm)};
    \node(calc)[draw,thick,above=5mm of test.north west,minimum
    width=230,anchor=south west]{};
    \draw[thick,decorate,decoration={brace}] (calc.north west) --
    (calc.north east)   node[midway,above]{230 gets interpreted as 230pt};
\end{tikzpicture}
\end{document}

在此处输入图片描述

相关内容