![歌词在一页上分为两栏,标题居中?](https://linux22.com/image/437166/%E6%AD%8C%E8%AF%8D%E5%9C%A8%E4%B8%80%E9%A1%B5%E4%B8%8A%E5%88%86%E4%B8%BA%E4%B8%A4%E6%A0%8F%EF%BC%8C%E6%A0%87%E9%A2%98%E5%B1%85%E4%B8%AD%EF%BC%9F.png)
\documentclass{article}
\usepackage{lmodern}
\usepackage{parallel}
\textwidth=6in
\begin{document}
\begin{center}
He Rescued Me\\
\end{center}
\begin{Parallel}[c]{}{}
\ParallelLText{
\noindent
Grey coat gold eyes\\
\noindent
Maybe I'm craze\\
\noindent\\
Muki bear where are you?\\
\ParallelRText{
\noindent
We’ve been through\\
\noindent\\
I held him close\\
}
\end{Parallel}
\end{document}
我想将歌词排版为一页上的两列,标题位于文本上方的中央,各列在页面上保持平衡。使用当前代码,文本在页面上不平衡,而是向左倾斜。标题不在文本上方居中,而是在页面上居中,由于歌词不在页面上居中,因此存在错位。我正在使用并行包,但显然还有其他各种可能性可以实现我想要的结果。有没有更好的选择?
答案1
该解决方案使用 varwidth 来确定所需的宽度,然后结合 minipage 和 multicols 将文本放置在靠近中心的位置。
\documentclass{article}
\usepackage[width=6in, left=1.25in,showframe]{geometry}
\usepackage{lmodern}
\usepackage{environ}
\usepackage{varwidth}
\usepackage{multicol}
\setlength{\parindent}{0pt}
\NewEnviron{balanced}{\sbox0{\begin{varwidth}{\dimexpr 0.5\textwidth-0.5\columnsep}
\let\columnbreak=\relax
\BODY
\end{varwidth}}% measure width of column
\par\noindent\hfil
\begin{minipage}{\dimexpr 2\wd0 + \columnsep}
\begin{multicols}{2}
\BODY
\end{multicols}
\end{minipage}\par}
\begin{document}
\begin{center}
He Rescued Me
\end{center}
\begin{balanced}
Grey coat gold eyes
Maybe I'm craze
Muki bear where are you?
We’ve been through
I held him close
\end{balanced}
\end{document}
只是为了好玩,这个版本使用了\raggedleft
左栏和\raggedright
右栏。
\documentclass{article}
\usepackage[width=6in, left=1.25in,showframe]{geometry}
\usepackage{lmodern}
\usepackage{paracol}
\begin{document}
\begin{center}
He Rescued Me
\end{center}
\begin{paracol}{2}
\raggedleft
Grey coat gold eyes
Maybe I'm craze
Muki bear where are you?
\switchcolumn\raggedright
We’ve been through
I held him close
\end{paracol}
\end{document}
答案2
实现相同目标的另一种方法是使用 blindtext 和 multicol 包。例如,以下代码:
\documentclass{article}
\usepackage{blindtext}
\usepackage{multicol}
\setlength{\columnsep}{1cm} %set the gap between the columns
\title{Test}
\author{}
\date{}
\begin{document}
\maketitle
\begin{multicols}{2} %begin 2 columns
The song lyrics and so on... %1st column
\vfill\null
\columnbreak %move on to the 2nd column
The song lyrics keep on going... %the 2nd column
\end{multicols}
\end{document}
如您所见,文本居中。希望对您有所帮助!
答案3
这里有几件事:首先,parallel
可能不是适合这项工作的工具。我会看看multicol
提供multicols
环境的包。这将使列平衡/划分变得不那么痛苦。
但另一个问题是,正如你所注意到的,存在视觉不平衡。这是因为诗行²的行数往往会更短,从而产生一切都不平衡的错觉。此外,我建议使用verse
允许你编写以下内容的环境:
\begin{verse}
...
he's warm\\
he rescued me
Maybe I'm craze\\
...
\end{verse}
但这仍然会将内容移到左侧。一个简单的解决方案是手动调整 verse 环境的左边距,直到看起来更好。我们不想只是增加,\leftmargin
因为这也会导致右边距增加,并可能导致不必要的换行。³ 不幸的是,verse
实现的方式并没有真正提供一种很好的方法来覆盖它⁴ 所以我们必须自己重新定义列表。幸运的是,情况还不算太糟。这是当前的定义:
\newenvironment{verse}
{%
\let\\\@centercr
\list{}{\itemsep \z@
\itemindent -1.5em%
\listparindent\itemindent
\rightmargin \leftmargin
\advance\leftmargin 1.5em}%
\item\relax}
{\endlist}
我们可以这样修改它:
\makeatletter
\RenewDocumentEnvironment{verse}{ O{1.5em} }
{%
\let\\\@centercr
\list{}{\itemsep \z@
\itemindent -1.5em%
\listparindent\itemindent
\rightmargin \leftmargin
\advance\leftmargin #1}%
\item\relax}
{\endlist}
\makeatother
这会将verse
环境更改为具有一个可选参数,即应用于每行的额外缩进量。默认值为 1.5em(这是使用 的正常定义得到的值verse
)。将其增加到某个更大的值5em
(您必须看看什么对您来说最好),将使您的内容看起来更居中。
- 自从 Frank 首次创建该包以来,包名和环境名之间的不匹配在过去 30 年里一直带来无尽的痛苦。当然,当时,DOS 和 VM/CMS 都将文件名限制为仅 8 个字符。
\noindent
像你在这里所做的那样,进行整个手动换行等操作确实让我的大脑很痛。- 乍一看,这似乎没问题,因为一旦左右边距相等且达到其最大可能值,最长线就会居中,但实际上,您真正希望的是事物稍微偏离中心到右侧,因为心理中心线与数学中心线并不对应。
- 内部机制设置了线宽和缩进等内容,使 LaTeX 钩子机制无法影响它。我们需要一个
\AddToHook{env/verse/list}
尚不存在的机制。