如果他们要扩大节点,如何通过缩小其内容来防止节点超出最小尺寸?

如果他们要扩大节点,如何通过缩小其内容来防止节点超出最小尺寸?

有没有办法将文本放入节点内,而无需调整节点大小,而不是将节点放在某些文本周围(这当然会调整节点大小)?

输出(第一个三角形为空,且恰好是最小尺寸;第二个三角形仍然与第一个三角形大小相同):

代码:

\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\box25LaTeX 内核用于特定内容。

第一次尝试时我有点懒,使用了框 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\MyBox0\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 命令,用于打印任何存储了值的东西。它可以用于盒子注册,也可以用于例如尺寸(如\wdetc 命令)和其他参数。例如\the\baselineskip打印出行距。

答案2

此方法将节点内容放置在 中tcolorboxfitting库用于将文本调整为 的大小tcolorbox。框的宽度使用 固定width=2cm,并传递给tcboxfittcolorbox拟合库有几种用于将文本调整为框的算法。此示例使用了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}

相关内容