我想要一个宏来计算文本块中的行数。我能够根据以下问题的答案创建一个宏“计算标题中的换行符“,但我更希望宏直接返回行数,而不是通过检索它\numlines
。如果有人知道如何做到这一点,我将非常感激。
\documentclass{article}
\newcommand\countlines[1]{
{\setbox0\vbox{\noindent{#1}\par
\count@\z@
\loop
\unskip\unpenalty\unskip\unpenalty\unskip
\setbox0\lastbox
\ifvoid0
\xdef\numlines{\the\count@}
\else
\advance\count@\@ne
\repeat}}
}
\title{aaa\\b\\bb}
\begin{document}
\makeatletter
\countlines{\@title}
\typeout{Number of lines is \numlines}
\end{document}
我特别希望的是 \countlines 直接返回行数,如下所示。
\typeout{Number of lines is \countlines{\@title}}
答案1
您可以在宏中进行计算\title
,然后在宏中使用结果\numlines
:
\documentclass{article}
\newcount\numli \def\numlines{\the\numli}
\let\titleB=\title
\def\title#1{\numli=0 \titleA#1\\\\{#1}}
\def\titleA#1\\{\ifx\\#1\\\expandafter\titleB\else
\advance\numli by1 \expandafter\titleA\fi}
\title{aaa\\b\\bb}
\begin{document}
\typeout{Number of lines is \numlines}
\end{document}
答案2
这是我使用高度长度的方法。我认为它可以更好,也许有人可以提出一些改进建议,但对于示例来说有效。我的目的不是改进您的代码,而是向您展示另一种计算文本块中行数的方法。
代码
\documentclass{article}
\usepackage{calc}
\usepackage{pgf}
\newlength{\parline}
\newlength{\paroutindent}
\newlength{\lineheight}
\setlength{\lineheight}{\heightof{abcdefghijklmnoprstuvwxyz}}
\newcommand{\countlines}[1]{%
\setlength{\paroutindent}{\expandafter\parindent}
\setlength{\parline}{\heightof{\noindent\begin{minipage}{\linewidth}%
\setlength{\parindent}{\paroutindent}#1\end{minipage}}}%
\pgfmathparse{round(\parline / (0.9*\lineheight))}
#1\par \noindent \texttt{line count: (\pgfmathresult)}
}
\usepackage{lipsum}
\begin{document}
\countlines{\lipsum[1]}
\countlines{\lipsum[2]}
\countlines{Just one line}
\countlines{Just two \\ lines}
\end{document}