我正在研究一种效果,可以自动将任意长的标题调整为具有特定行宽的多行。标题没有明确的换行符,只是一个常规字符串。目前,我有以下代码来计算行数:
\newcounter{numbertitlelines}
% Define a macro to calculate the number of title lines
% #1: The length of title line (set by paper)
% #2: The text of title (set by user)
\newlength{\titlelength}
\def\cuz@macro@numbertitlelines#1#2{
\settowidth{\titlelength}{#2}
\setcounter{numbertitlelines}{0}
\loop{
\stepcounter{numbertitlelines}
}\ifdim\titlelength>\value{numbertitlelines}#1\repeat
}
但有时它对英语效果不太好,因为大多数情况下不同行上的文本长度不同(而中文标题由于文本宽度相同而效果很好):
上图中,中文、英文标题下划线的个数均由 count 决定numbertitlelines
。
有没有方法可以检查每行文本的宽度,或者也许有一些不同的想法来解决这个问题?
顺便说一句:它应该与pdflatex
、xelatex
和 一起工作lualatex
。
答案1
lineno
正如您所说,您想这样做是为了添加下划线,让我指出两种无需亲自计算行数即可做到这一点的方法。首先,您可以使用该包的“意外用途”之一。
\documentclass{article}
\usepackage{lineno}
\begin{document}
\begin{minipage}{5cm}
\centering\internallinenumbers
\renewcommand{\makeLineNumber}{\rule[-2pt]{\textwidth}{0.4pt}\hss}%
A VERY COMMON \LaTeX\ THESIS TEMPLATE OF COMMUNICATION UNIVERSITY OF
ZHEJIANG
\end{minipage}
\end{document}
其次,如果您不希望线条跨越框的宽度,而只是给定的文本,那么您可以使用该ulem
包:
\documentclass{article}
\usepackage{ulem}
\begin{document}
\begin{minipage}{5cm}
\centering
\uline{A VERY COMMON \LaTeX\ THESIS TEMPLATE OF COMMUNICATION UNIVERSITY OF
ZHEJIANG}
\end{minipage}
\end{document}
答案2
为了计算行数,\prevgraf
可以使用内部 TeX 计数器,它包含当前形成或刚刚关闭的段落的行数(参见TeXbook,第 14 章)。因此,此代码:
\documentclass{article}
\newcounter{numbertitlelines}
\newlength{\titlelength}
\newbox\titlebox % auxiliary box
\newcount\titlelines % auxiliary counter
\newcommand{\titleformat}{\bfseries\centering} % format of title output
\newcommand*{\titlelinescount}[2]{%
\setbox\titlebox=\vbox{\hsize=#1 \titleformat
#2\par
\global\titlelines=\the\prevgraf
}
\setcounter{numbertitlelines}{\the\titlelines}
}
\begin{document}
% -- Test --
\newcommand{\Title}{ A VARY COMMON \LaTeX\ THESIS TEMPLATE OF COMMUNICATION UNIVERSITY OF ZHEJIANG}
\newlength{\parlength}
\setlength{\parlength}{0.35\textwidth}
\titlelinescount{\parlength}{\Title}
The title \parbox{\parlength}{\titleformat\Title} contains \thenumbertitlelines\ lines
\end{document}
得出这样的结果:
宏\titleformat
包含标题输出的设置,提供与计数命令中的标题格式的对应关系。我设置了\bfseries\centering
示例。
辅助 TeX 计数器\titlelines
用于全局保存\prevgraf
中的值\vbox
。当然,如果你愿意,你可以直接使用这个计数器,而不需要 numbertitlelines
计数器。