如何根据行数自动减小字体大小

如何根据行数自动减小字体大小

现在,默认的标题字体大小是 17 点。但如果标题行数超过三行,我会尝试自动减小字体大小。

我需要的是\titlefont命令自动运行超过三行。否则,应该遵循默认的标题字体大小。现在,我在\title命令中手动给出。

请告知如何通过宏实现逻辑LaTeX

梅威瑟:

\documentclass{article}

\date{}

\def\titlefont{\fontsize{15}{17}\selectfont}

\begin{document}

\title{\titlefont Sample text exceed three lines reduce the font size: Sample text exceed three lines reduce the font size:Sample text exceed three lines reduce the font size:Sample text exceed three lines reduce the font size}

\maketitle 

\end{document}

答案1

尽管我同意 Mico 关于标题长度的意见,但这里有一个解决您问题的方法。

它使用普通字体大小命令(\large\Large\LARGE\huge)来避免字体替换,这在您的示例中会发生。这可以轻松更改(请参阅代码中的注释)。如果您使用可缩放字体(例如 Latin Modern),则可以设置任何大小而不会出现此问题。

这里使用\titlenew 命令\autotitle。它有一个可选参数,指定要缩放的行数(默认为 3)。如果使用最小字体 ( \large) 无法达到行数,则会发出警告。

它的工作原理是将标题放在一个框中以获取高度,然后将其与\baselineskip所用字体大小进行比较。如果行数过多,则重复此操作以使用下一个较小的字体大小。如果达到最小值,则使用此值并发出警告。

如果您想对标题使用不同的格式,例如\bfseries,则必须将其添加到\test@lines(请参阅代码中的注释以了解确切位置)。

\documentclass{article}

\date{2017-11-28}
\author{Me}

% there is no 15pt font in the cm fonts, so it is substituted (stated in the log file)
%\def\titlefont{\fontsize{15}{17}\selectfont}

\makeatletter
\newbox\test@box
\newdimen\test@blskip
\newcommand*{\test@lines}[1]{%
    \setbox\test@box\hbox to\textwidth{\vbox{\centering\test@fontsize #1\global\test@blskip\baselineskip\par}}%
    % add formating commands for the title here ---------------------^
}
\newcommand*{\autotitle}[2][3]{%
% \huge
    \let\test@fontsize\huge\test@lines{#2}%
    % or you can write
    %\def\test@fontsize{\fontsize{20.74}{25}\selectfont}\test@lines{#2}%
    \ifdim\ht\test@box>#1\test@blskip
% \LARGE
        \let\test@fontsize\LARGE\test@lines{#2}%
        \ifdim\ht\test@box>#1\test@blskip
% \Large
            \let\test@fontsize\Large\test@lines{#2}%
            \ifdim\ht\test@box>#1\test@blskip
% \large
                \let\test@fontsize\large\test@lines{#2}%
                \ifdim\ht\test@box>#1\test@blskip
                    \PackageWarning{preamble}{could not reduce title to three lines (using \string\large\space for title).}
                \else
                    \PackageInfo{preamble}{using \string\large\space for title}%
                \fi
% \Large
            \else
                \PackageInfo{preamble}{using \string\Large\space for title}%
            \fi
% \LARGE
        \else
            \PackageInfo{preamble}{using \string\LARGE\space for title}%
        \fi
% \huge
    \else
        \PackageInfo{preamble}{using \string\huge\space for title}%
    \fi
% always
    \title{\test@fontsize #2}%
}
\makeatother

\begin{document}

\autotitle{Sample text exceed three lines reduce the font size:
Sample text exceed three lines reduce the font size:
Sample text exceed three lines reduce the font size:
Sample text exceed three lines reduce the font size%
}

\maketitle 

\end{document}

答案2

只是为了好玩:这会尝试从 11pt 开始排版标题,每次以 1pt 为步长,直到标题的长度超过三行。

\RequirePackage{fix-cm} % if you don't use a scalable font

\documentclass{article}

\makeatletter
\newcommand{\TITLE}[1]{%
  \count@=10
  \loop
  \advance\count@\@ne
  \setbox0=\vbox{
    \fontsize{\count@}{0}\selectfont
    \centering #1\par
    \xdef\vetri@len{\the\prevgraf}
  }%
  \ifnum\vetri@len<4
  \repeat
  \advance\count@\m@ne
  \ifnum\count@>17 \count@=17 \fi % maximum size is 17pt
  \title{\fontsize{\count@}{1.2\dimexpr\count@ pt}\selectfont #1}
}
\makeatother

\begin{document}

\author{Me}

\TITLE{Sample text exceeds three lines reduce the font size:
  Sample text exceeds three lines reduce the font size:
  Sample text exceeds three lines reduce the font size and stop}

\maketitle 

\end{document}

在此处输入图片描述

在此示例中,所选尺寸为 13pt,您可以检查

\begin{center}\fontsize{14}{16.8}\selectfont
Sample text exceeds three lines reduce the font size:
Sample text exceeds three lines reduce the font size:
Sample text exceeds three lines reduce the font size and stop
\end{center}

占用四行。

相关内容