我正在尝试创建一种时间线图片,其中我设置了“宽度” 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 被解释为230pt
。x
和y
维度分别存储在\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}
但是,这可能被认为是一种“黑客行为”。如果您想要调整到start
和end
,则可以使用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
,它们被解释为230pt
和230
乘以 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}