歌词在一页上分为两栏,标题居中?

歌词在一页上分为两栏,标题居中?
\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(您必须看看什么对您来说最好),将使您的内容看起来更居中。


  1. 自从 Frank 首次创建该包以来,包名和环境名之间的不匹配在过去 30 年里一直带来无尽的痛苦。当然,当时,DOS 和 VM/CMS 都将文件名限制为仅 8 个字符。
  2. \noindent像你在这里所做的那样,进行整个手动换行等操作确实让我的大脑很痛。
  3. 乍一看,这似乎没问题,因为一旦左右边距相等且达到其最大可能值,最长线就会居中,但实际上,您真正希望的是事物稍微偏离中心到右侧,因为心理中心线与数学中心线并不对应。
  4. 内部机制设置了线宽和缩进等内容,使 LaTeX 钩子机制无法影响它。我们需要一个\AddToHook{env/verse/list}尚不存在的机制。

相关内容