绘制分布在整个线宽上的节点,中间节点填充剩余空间

绘制分布在整个线宽上的节点,中间节点填充剩余空间

我正在尝试实现以下结果: 目标

即:

  • 填满tikzpicture整个textwidth
  • 文本Node A左对齐​4cmleft
  • 文本Node B右对齐​5cmright
  • a用居中文本Node C填充剩余的整个水平空间A,并在每边B保留一个边距1cm

现在,我能取得的成就很小,而且我确信有更好的方法可以实现它:

\documentclass[a4paper, 11pt]{article}
\usepackage{xcolor}
\usepackage{lipsum}
\usepackage{tikz}
\usetikzlibrary{calc}


\begin{document}
\lipsum[1]

\noindent
\begin{tikzpicture}[every node/.style = {rectangle, fill = red!30, text = red}]
\path (0, 0) -- (\textwidth, 0);
\node[minimum width = 4cm, anchor = north west, align = left] (a) at (current bounding box.north west) {Node A};
\node[minimum width = 5cm, anchor = north east, align = right] (b) at (current bounding box.north east) {Node B};
\node[anchor = center, align = center] (c) at ($(a)!0.5!(b)$) {Node C};
\end{tikzpicture}

\lipsum[1]
\end{document}

这导致:

输出

  • 我目前使用一个path来填充tikzpicture整个textwidth,但我不确定这是正确的方法
  • 文本在left和上没有正确对齐right
  • 我不知道如何获得我想要的中间节点的结果

如果根本无法继续下去,则可以从头重写整个示例。


问题:我怎样才能达到我想要的结果tikzpicture

答案1

贾斯珀并没有错,但他把事情变得比实际更复杂了。

4cm这显然对和5cm(以及1cm节点之间的)具有硬编码值,但它inner xsep考虑了而不必明确说明。(但您仍然可以将其更改为参数以

\tikzMe[inner xsep=5pt]{Node A}{Node C}{Node B}

我已经选择align=flush leftalign=flush right抑制一些关于水平盒子未满的警告 – 除非你想要在那里有多行节点。

代码

\documentclass[a4paper,11pt]{article}
\usepackage{lipsum}
\usepackage{tikz}
\newcommand*\tikzMe[4][]{%
  \par\noindent\tikz[baseline=+0pt,#1]
    \node[
      align=flush left,
      anchor=base west,
      text width={4cm-2*(\pgfkeysvalueof{/pgf/inner xsep}}]{#2}
     node at(\textwidth,0) [
       align=flush right,
       anchor=base east,
       text width={5cm-2*(\pgfkeysvalueof{/pgf/inner xsep}}]{#4}
     node at(5cm,0) [
       align=center,
       anchor=base west,
       text width={\textwidth-11cm-2*(\pgfkeysvalueof{/pgf/inner xsep})}]{#3}
       ;\par}
\begin{document}
\lipsum[1]
\tikzMe[nodes={rectangle, fill = red!30, text = red}]
  {Node A}{Node C}{Node B}
\lipsum[1]
\end{document}

输出

在此处输入图片描述

答案2

此方法使用标准 LaTeX 长度来计算中心节点的宽度。要将节点精确对齐到两个外部节点的中间,请使用锚点eastwest作为参考,而不是两个外部节点的中心:

\documentclass[a4paper, 11pt]{article}
\usepackage{lipsum}
\usepackage{tikz}
\usetikzlibrary{calc}

\begin{document}
\lipsum[1]

\noindent
\begin{tikzpicture}[every node/.style = {rectangle, fill = red!30, text = red}]
\path (0, 0) -- (\textwidth, 0);

\node[minimum width = 4cm, anchor = north west, align = left] (a) at (current bounding box.north west) {Node A};
\node[minimum width = 5cm, anchor = north east, align = right] (b) at (current bounding box.north east) {Node B};

\newlength{\midnodelength}
\setlength{\midnodelength}{\textwidth}
\addtolength{\midnodelength}{-11cm} % = -(4cm + 5cm + 2 * 1cm)

%%% alternatively you can use \pgfmathsetlength:
% \pgfmathsetlength{\midnodelength}{\textwidth - 4cm - 5cm - 2 * 1cm}
%%%

\node[minimum width=\midnodelength, anchor = center, align = center] (c) at ($(a.east)!0.5!(b.west)$) {Node C};

\end{tikzpicture}

\lipsum[1]
\end{document}

在此处输入图片描述

这样三个节点的宽度就正确了。但是,从您发布的图片来看,您似乎想要获得文本左对齐、右对齐或居中对齐的节点。此外,这些节点可能应该有一些内部填充,这样文本就不会粘在边框上。

为了实现这一点,你需要做一些计算。TiZ 提供了一个选项text width,您可以使用它来设置包含文本的节点内框的宽度。然后对齐将按预期工作,但默认情况下,节点将有一些inner sep添加到节点宽度中。因此,如果您想保留这个inner sep,您需要从中减去这个text width

\documentclass[a4paper, 11pt]{article}

\usepackage{lipsum}
\usepackage{tikz}
\usetikzlibrary{calc}

\begin{document}
\lipsum[1]

\noindent
\begin{tikzpicture}[every node/.style = {rectangle, fill = red!30, text = red}]
\path (0, 0) -- (\textwidth, 0);

\node[inner sep=5pt, text width={4cm - 10pt}, anchor = north west, align = left] (a) at (current bounding box.north west) {Node A};
\node[inner sep=5pt, text width={5cm - 10pt}, anchor = north east, align = right] (b) at (current bounding box.north east) {Node B};

\newlength{\midnodelength}
\pgfmathsetlength{\midnodelength}{\textwidth - 5cm - 4cm - 2 * 1cm}
\node[inner sep=5pt, text width={\midnodelength - 10pt}, anchor = center, align = center] (c) at ($(a.east)!0.5!(b.west)$) {Node C};

\end{tikzpicture}

\lipsum[1]
\end{document}

在此处输入图片描述

如果在下方添加以下行tikzpicture,您会发现节点(和间隙)的宽度现在是正确的:

\noindent\rule{4cm}{3pt}\rule{1cm}{1pt}\hfill\rule{1cm}{1pt}\rule{5cm}{3pt}

在此处输入图片描述

相关内容