以诗句为中心的巧妙方法

以诗句为中心的巧妙方法

该包的文档verse为开始排版一块诗歌提供了以下建议:

\settowidth{\versewidth}{This is the average line,}
\begin{verse}[\versewidth]

width 选项的意义在于它使环境verse能够生成一个内部左对齐、放置在文本区域中心且大部分从左到右填充的块。诗句不必完全对齐,但最好在文本和任一边距之间保持平衡的空间。

作家已经完成的诗歌可以交给排字员,排字员可以为每首诗选择一个“平均行距”,并用它来计算宽度。但如果 LaTeX 是从具有更多限制性格式功能的文本源自动生成的,则此选项不可用。

理想情况下,这项工作可以通过 LaTeX 测量每条线的宽度,然后取平均值,或使用其他一些简单的统计评估来实现自动化。我想知道如何通过 LaTeX 命令序列来处理这样的操作。


既然有人要求我提供示例,我提供了下面的最小文档,该文档基于将verse文档中的示例包装到一个简单的article文档中。正如所见,除了是否可以在没有手动将诗歌中的一行(在本例中是第一行)复制到通话中的情况下实现类似的效果的问题之外,几乎没有什么值得考虑的\settowidth

\documentclass{article}

\usepackage{verse}

\begin{document}

\poemtitle{Fleas}
\settowidth{\versewidth}{What a funny thing is a flea}
\begin{verse}[\versewidth]
What a funny thing is a flea. \\
You can’t tell a he from a she. \\
But he can. And she can. \\
Whoopee! \\
\end{verse}

\end{document}

答案1

我将提出我的评论作为答案以及一些额外的材料。

luatex我猜用编程最容易做到lua。然而这涉及到美学问题——算法看起来居中的东西不一定在读者看来居中。我对\versewidth宏的描述是为了指出一种可能有用的设置方法;它不一定产生准确的结果,但希望是足够接近的结果。人们总是可以最后一步摆弄源代码来获得令人满意的结果。

下面我提供了一些代码来探讨自动居中诗句的各种可能性。

% verseprob4.tex SE 511886 Smart way to center verse

\documentclass{article}
\usepackage{verse}
\begin{document}

\newcommand{\myverse}{
What a funny thing is a flea. \\
You can’t tell a he from a she. \\
But he can. And she can. \\
Whoopee! \\
}

Per the MWE and the manual.
\settowidth{\versewidth}{What a funny thing is a flea}
versewidth = \the\versewidth

\poemtitle{Fleas}
\begin{verse}[\versewidth]
What a funny thing is a flea. \\
You can’t tell a he from a she. \\
But he can. And she can. \\
Whoopee! \\
\end{verse}

% Average of the longest and shortest lines.
\newlength{\lline} % long line
\newlength{\sline} % short line

\settowidth{\lline}{You can't tell a he from a she.}
\settowidth{\sline}{Whoopee!}
\addtolength{\lline}{\sline}
\setlength{\lline}{0.5\lline} % average of longest and shortest line

lline = \the\lline (average of longest and shortest line)
\begin{verse}[\lline]
\myverse
\end{verse}

% total width of verse lines
\settowidth{\lline}{\myverse}
lline = \the\lline (total width of verse lines)

\begin{verse}[\lline]
\myverse
\end{verse}

Set at 1/4 of total width of the 4 verse lines
\begin{verse}[0.25\lline]
\myverse
\end{verse}

\settowidth{\lline}{\mbox{\myverse}}
lline = \the\lline (width of boxed verse lines)

\begin{verse}[\lline]
\myverse
\end{verse}

Set with a versewidth of 200pt
\begin{verse}[200pt]
\myverse
\end{verse}
\end{document}

结果如下所示。

我认为最重要的是必须决定什么看起来是正确的;我不认为算法会帮你做这件事。如果有些行缩进怎么办?如果有些行翻转怎么办?如果……怎么办?

编辑

据我估计,顺序如下:

\newcommand{\myverse}{
< the verse text, all N lines >
}  

\settowidth{\versewidth}{\myverse}
% divide \versewidth by number of lines for average line width
\setlength{\versewidth}{<1/N \versewidth>}
\begin{verse}[\versewidth]
  \myverse
\end{verse}

将生成以平均线宽为中心的诗句。稍后可以对其进行调整,以生成视觉上居中的诗句。

如果还有其他多首诗,则相应修改上述内容。如果有多首诗,则对每首诗都进行修改,\renewcommand{\myverse}{<text of next poem's verse>}并继续执行上述操作。

相关内容