我想使用 TikZ 框住文本并调整框的宽度,以便文本适当地放在框内的不同行上。我还希望每行上的文本在框内居中。由于这是我第一次使用 TikZ,我有点不知道什么可以做,什么不能做。这是我到目前为止尝试过的:
\documentclass{book}
\usepackage{tikz}
\begin{document}
\newlength{\myboxwidth}
\newcommand{\MyBox}[3][XXX]{
\settowidth{\myboxwidth}{#1} % THIS DOESN'T WORK
%\setlength{\myboxwidth}{20mm} % THIS WORKS
\draw (#2)
%\pgfextra{\setlength{\myboxwidth}{20mm}} % THIS WORKS
%\pgfextra{\settowidth{\myboxwidth}{#1}} % THIS DOESN'T WORK
node
[rectangle,draw,minimum width=2em,minimum height=2em,
text width=\myboxwidth,
text centered, inner sep=1ex] {#3};
}
\begin{tikzpicture}
\MyBox[animals]{0,0}{animals cats \& dogs}
\MyBox[trees]{3,0}{trees oak aspen}
\end{tikzpicture}
\end{document}
在左侧框中,我希望“动物”在第一行,“猫和狗”在下一行,而在右侧框中,每个单词都必须单独一行。为什么使用 20mm 这样的明确长度指定有效,但要求我正在使用的 LaTeX 评估单词长度却失败了?我一次尝试了\myboxwidth
一行后面带有THIS WORKS
或注释的行。THIS DOESN'T WORK
除了上述方法之外,我还尝试过使用{\parbox{\myboxwidth}{#3}}
而不是 just {#3}
,还尝试过使用 进行明显的分行,但\\
没有成功。有人能帮忙吗?
哦,把\settowidth
命令放在前面\begin{tikzpicture}
也是可以的。
答案1
PGF 数学有一个width
函数可以测量其参数的宽度。可以使用\pgfmathparse{width("some text")}
或访问它\pgfmathwidth{"some text"}
。然后将结果存储在 中\pgfmathresult
。
我认为text centered
这是一个被贬低的选项。改用它align=center
可按\\
预期工作。
\documentclass{book}
\usepackage{tikz}
\begin{document}
\newcommand{\MyBox}[3][XXX]{
\pgfmathwidth{"#1"}
% store the result before it gets overwritten by some internal call to `\pgfmath...`.
\let\myboxwidth\pgfmathresult
\draw (#2)
node
[rectangle,draw,minimum width=2em,minimum height=2em,
text width=\myboxwidth,
text centered, inner sep=1ex] {#3};
}
\begin{tikzpicture}
\MyBox[animals]{0,0}{animals cats \& dogs}
\MyBox[trees]{3,0}{trees oak aspen}
\draw (0,-2) node
[rectangle, draw, align=center, inner sep=1ex] {animals\\ cats \& dogs};
\draw (3,-2) node
[rectangle, draw, align=center, inner sep=1ex] {trees\\ oak aspen};
\end{tikzpicture}
\end{document}
这两种解决方案仅适用于 TikZ/PGF 版本 2.10(及更高版本)。
答案2
只需对 Caramdir 的解决方案进行一点改动。使用text width=\widthof{#1}
。结果是一样的。
\documentclass{book}
\usepackage{tikz}
\begin{document}
\newcommand{\MyBox}[3][XXX]{
\draw (#2)
node
[rectangle,draw,minimum width=2em,minimum height=2em,
text width=\widthof{#1}, %<---- Change here
text centered, inner sep=1ex] {#3};
}
\begin{tikzpicture}
\MyBox[animals]{0,0}{animals cats \& dogs}
\MyBox[trees]{3,0}{trees oak aspen}
\draw (0,-2) node
[rectangle, draw, align=center, inner sep=1ex] {animals\\ cats \& dogs};
\draw (3,-2) node
[rectangle, draw, align=center, inner sep=1ex] {trees\\ oak aspen};
\end{tikzpicture}
\end{document}
答案3
\documentclass{book}
\usepackage{calc,array}
\newcolumntype{C}[1]{>{\centering}b{\widthof{#1}}}
\newcommand\MyBox[2][XXX]{%
\fbox{\tabular[b]{C{#1}} #2 \endtabular}}
\begin{document}
foo
\MyBox[animals]{animals cats \& dogs}\quad
\MyBox[trees]{trees oak aspen}
bar
\end{document}