现在,默认的标题字体大小是 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),则可以设置任何大小而不会出现此问题。
这里使用\title
new 命令\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}
占用四行。