有没有办法将文本放入节点内,而无需调整节点大小,而不是将节点放在某些文本周围(这当然会调整节点大小)?
输出(第一个三角形为空,且恰好是最小尺寸;第二个三角形仍然与第一个三角形大小相同):
代码:
\documentclass[border=5mm]{standalone}
\usepackage{tikz}
\usetikzlibrary{shapes.geometric,positioning}
\begin{document}
\begin{tikzpicture}
% ORIGINAL SIZE (NO CONTENT)
\path node
[%
isosceles triangle,
shape border rotate=90,
isosceles triangle apex angle=60,
inner sep=0mm,
outer sep=0mm,
minimum size=20mm,
draw=green,fill=green!40
](T1){};
% CONTENT FITS (NO EFFECT ON SIZE)
\path node
[%
isosceles triangle,
shape border rotate=90,
isosceles triangle apex angle=60,
inner sep=0mm,
outer sep=0mm,
minimum size=20mm,
draw=green,fill=green!40,text=red,
right=0mm of T1.right corner,
anchor=left corner
](T2){within};
% TOO MUCH CONTENT (SIZE AFFECTED)
\path node
[%
isosceles triangle,
shape border rotate=90,
isosceles triangle apex angle=60,
inner sep=0mm,
outer sep=0mm,
minimum size=20mm,
draw=red,fill=red!40,text=red,
right=0mm of T2.right corner,
anchor=left corner
](T3){OUTSIDE OF MINIMUM SIZE};
% QUESTION
\path node
[%
align=left,
below=2mm of T3
]
{How to make contents\\
of last triangle scale-down\\
so they don't enlarge the triangle?
};
\end{tikzpicture}
\end{document}
答案1
我会制作一个单独的命令来缩小过大的输入。
\documentclass[border=5mm]{standalone}
\usepackage{tikz}
\usetikzlibrary{shapes.geometric,positioning}
\newcommand\MyTextScale[2][20mm]{%
\sbox0{#2}%
\ifdim\wd0>#1
\resizebox{#1}{!}{#2}%
\else
#2%
\fi}
\begin{document}
\begin{tikzpicture}[
MyTriangle/.style={%
isosceles triangle,
shape border rotate=90,
isosceles triangle apex angle=60,
inner sep=0mm,
outer sep=0mm,
minimum size=20mm,
draw=green,fill=green!40,
text=red
}]
% ORIGINAL SIZE (NO CONTENT)
\path node[MyTriangle](T1){\MyTextScale{}};
% CONTENT FITS (NO EFFECT ON SIZE)
\path node[MyTriangle,
right=0mm of T1.right corner,
anchor=left corner
](T2){\MyTextScale{within}};
% TOO MUCH CONTENT (SIZE AFFECTED)
\path node[MyTriangle,
fill=red!40,
right=0mm of T2.right corner,
anchor=left corner
](T3){\MyTextScale{OUTSIDE OF MINIMUM SIZE}};
\end{tikzpicture}
\end{document}
代码的一些解释
该命令\MyTextScale
定义了一个可选参数和一个强制参数,即最大宽度设置为默认的 20mm 和输入文本。因此,如果你写
\MyTextScale[10mm]{OUTSIDE OF MINIMUM SIZE}
文本宽度将为 10mm,而不是默认的 20mm。
接下来是框声明\sbox0{#2}
。框不仅有趣,它们也是 TeX(因此也是 LaTeX)的中心主题。从一开始,在 TeX 中,就有 256 个框,命名\box0
为\box255
。前 10 个框被不同的命令用作临时框,这是我采用的其中一个。框 到\box10
由\box25
LaTeX 内核用于特定内容。
第一次尝试时我有点懒,使用了框 0。相反,我应该用
\newsavebox\MyBox
然后 TeX 会将其中一个盒子,或者实际上是一个盒子的编号(寄存器)分配给\MyBox
。执行此操作时,命令将如下所示:
\newsavebox\MyBox
\newcommand\MyTextScale[2][20mm]{%
\sbox\MyBox{#2}%
\ifdim\wd\MyBox>#1
\resizebox{#1}{!}{#2}%
\else
#2%
\fi}
\MyBox
您可以通过 获得分配给的寄存器\the\MyBox
。如果您不加载任何包,它应该是 26,但在这里我们加载了tikz
它,它还分配了一些框,因此它会更高。可以使用
\documentclass{article}
\begin{document}
\newsavebox\MyBox
What is \verb|\MyBox|: \the\MyBox
\end{document}
应该是 26。如果相加的话,\usepackage{tikz}
可能就是 38。
命令\sbox{#2}
将参数的内容存储(并扩展)#2
在名为 的框中\MyBox
。然后有(在 TeX 中)命令,以便您可以获取框的宽度、高度和深度;和\wd\MyBox
。同样,我使用代替 的第一个代码。所以\ht\MyBox
\dp\MyBox
0
\MyBox
\sbox\MyBox{Test my box}
\noindent
Width: \the\wd\MyBox\newline
Height: \the\ht\MyBox\newline
Depth: \the\dp\MyBox
应该给出类似
现在,\wd\MyBox
有了框的宽度。然后我们要将其与可选参数进行比较#1
,如果小于,则打印,否则缩小到指定的宽度。比较长度或 TeX 命名中的尺寸,可以使用 来完成\ifdim
。
\resizebox
最后,我使用在包中定义的比例graphicx
。由于我没有加载该包,我猜它是通过加载的tikz
。
还有一点需要注意。上面我使用了命令\the
来打印盒子编号。这是一个 TeX 命令,用于打印任何存储了值的东西。它可以用于盒子注册,也可以用于例如尺寸(如\wd
etc 命令)和其他参数。例如\the\baselineskip
打印出行距。
答案2
此方法将节点内容放置在 中tcolorbox
。fitting
库用于将文本调整为 的大小tcolorbox
。框的宽度使用 固定width=2cm
,并传递给tcboxfit
。tcolorbox
拟合库有几种用于将文本调整为框的算法。此示例使用了fit algorithm=hybrid*
。
MWE 比较了在节点中插入 10 个单词与插入 20 个单词。每种方法都有两种变体。一种使用典型的 tcolorbox 矩形配置。第二种使用parshape
将文本设置在与节点形状一致的三角形中。结果如下:
这是 MWE:
\documentclass[tikz,border=5mm]{standalone}
\usepackage[most]{tcolorbox}
\usetikzlibrary{shapes.geometric,positioning}
% https://tex.stackexchange.com/a/310410
\usepackage{shapepar}
\newcommand*{\triangleshape}{%
{0}%
{0}b{0}\\%
{8.66}t{-5}{10}\\%
{17.32}t{-10}{20}\\%
{17.32}e{0}%
}
\tcbset{tile, % Hide the tcolorbox frame
boxsep=0pt,top=0mm,bottom=0mm,left=0mm,right=0mm, % set margins
valign=top,
halign=justify, % ragged right
colback=red!40, % blend tcolorbox into node background
fit algorithm=hybrid*
}
\tikzset{
inner sep=1mm,
outer sep=0mm,
isosceles triangle,
shape border rotate=90,
isosceles triangle apex angle=60,
}
\begin{document}
\begin{tikzpicture}
\path node [%
draw=red,
fill=red!40,
anchor=left corner
](T3){\tcboxfit[width=2cm]{\textbf{10 words --} Lorem ipsum dolor sit amet, consectetur adipiscing elit. Donec eleifend.}};
%
\path node [%
draw=red,
fill=red!40,
right=0mm of T3.right corner,
anchor=left corner
](T4){\tcboxfit[width=2cm]{\textbf{20 words --} Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nulla sit amet ipsum ac purus porttitor tempor. Donec et luctus est.}};
%
\path node [%
draw=red,
fill=red!40,
right=0mm of T4.right corner,
anchor=left corner
](T5){\tcboxfit[width=2cm]{\shapepar\triangleshape\textbf{10 words --} Lorem ipsum dolor sit amet, consectetur adipiscing elit. Donec eleifend.}};
%
\path node [%
draw=red,
fill=red!40,
right=0mm of T5.right corner,
anchor=left corner
](T6){\tcboxfit[width=2cm]{\shapepar\triangleshape{\textbf{20 words --} Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nulla sit amet ipsum ac purus porttitor tempor. Donec et luctus est. }}};
\end{tikzpicture}
\end{document}