使用 TikZ,如何绘制一个宽度可调的框?

使用 TikZ,如何绘制一个宽度可调的框?

我想使用 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}

在此处输入图片描述

相关内容