自动调整 tikz 中的字体大小以避免重叠

自动调整 tikz 中的字体大小以避免重叠

我有两个节点,一个在左边,随着较长的文本向右增长,第二个节点位于右边,向左增长。

现在,如果节点文本太长,节点就会重叠。在这种情况下,我希望左侧节点减小其字体大小。但是内容是生成的,因此我需要一个解决方案,让 tikz 进行字体缩放,而不是我手动缩放。

\documentclass{article}
\usepackage{tikz}

\newcommand{\card}[2]{
    \begin{tikzpicture}
        \node[anchor=south west] at (1mm,1mm) {#1};
        \node[anchor=south east] at (40mm,1mm) {#2};
    \end{tikzpicture}
}

\begin{document}
    What I have:\\
    \card{short text}{RIGHT}\\
    \card{long long long text}{RIGHT}\\
    What I want:\\
    \card{short text}{RIGHT}\\
    \card{\tiny long long long text}{RIGHT}\\
\end{document}

在此处输入图片描述

答案1

如果文本太长,您可以使用\resizeboxfrom 来graphicx.sty缩放文本。我假设总文本(左侧和右侧)为 40 毫米,并且右侧文本不应缩放。文本之间也有 1 毫米的间隔。我删除了节点中的所有间距。

\documentclass{article}
\usepackage{tikz}
\usepackage{graphicx}
\usepackage{calc}
\newsavebox\MyLeftBox
\newsavebox\MyRightBox
\newlength\MyLeftLength
\newcommand{\card}[2]{
  \sbox\MyLeftBox{#1}
  \sbox\MyRightBox{#2}
  \setlength\MyLeftLength{40mm-\wd\MyRightBox-1mm}
  \begin{tikzpicture}
    %\draw[<->,gray!40](0,0)--(40mm,0);
    \node[anchor=south west,inner sep=0pt,outer sep=0pt] at (0mm,1mm) {%
      \ifdim \MyLeftLength < \wd\MyLeftBox
        \resizebox{\MyLeftLength}{!}{#1}
      \else
        #1
      \fi
    };
    \node[anchor=south east,inner sep=0pt,outer sep=0pt] at (40mm,1mm) {#2};
  \end{tikzpicture}
}
%%%%%%
\begin{document}
\begin{tabular}{l}
  \card{short text}{RIGHT}\\
  \card{long long long long long text}{RIGHT}\\
  \card{long long long long long text}{LONG RIGHT}
\end{tabular}
\end{document}

在此处输入图片描述

答案2

您可能想要采用这种方式。您需要预设长度\maximalCardLength

请注意,像这样缩放字体通常效果不太好。高质量字体有几种尺寸的单独设计,比较一下https://en.wikipedia.org/wiki/File:True_vs_Scaled_Small_Caps.svg

\documentclass{article}
\usepackage{tikz}

\usepackage{ifthen}
\newsavebox{\cardbox}
\newlength{\saveboxLength}
\newlength{\maximalCardLength}\setlength{\maximalCardLength}{22mm}
\newcommand{\card}[2]{
\savebox{\cardbox}{#1}
\settowidth{\saveboxLength}{\usebox{\cardbox}}

\ifdim\saveboxLength<\maximalCardLength
    \setlength{\saveboxLength}{\maximalCardLength}
\fi

\begin{tikzpicture}
    \node[anchor=south west, scale=\maximalCardLength/\saveboxLength] at (1mm,1mm) {\usebox{\cardbox}};
    \node[anchor=south east] at (40mm,1mm) {#2};
\end{tikzpicture}
}

\begin{document}

What I have:\\
\card{short text}{RIGHT}\\
\card{long long long text}{RIGHT}\\
What I want:\\
\card{short text}{RIGHT}\\
\card{\tiny long long long text}{RIGHT}\\
\end{document}

在此处输入图片描述

相关内容