即:
- 填满
tikzpicture
整个textwidth
- 文本
Node A
左对齐4cm
left
- 文本
Node B
右对齐5cm
right
- 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 left
并align=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 长度来计算中心节点的宽度。要将节点精确对齐到两个外部节点的中间,请使用锚点east
和west
作为参考,而不是两个外部节点的中心:
\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}
这样三个节点的宽度就正确了。但是,从您发布的图片来看,您似乎想要获得文本左对齐、右对齐或居中对齐的节点。此外,这些节点可能应该有一些内部填充,这样文本就不会粘在边框上。
为了实现这一点,你需要做一些计算。Ti钾Z 提供了一个选项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}