将 ConTeXt 中不规则的右侧文本块居中吗?

将 ConTeXt 中不规则的右侧文本块居中吗?

我正在尝试排版我在 ConTeXt 中写的一本诗集。

考虑以下:

\definehead[PoemTitle][section]
\setuphead[PoemTitle][number=no, page=yes, style=\sc]

\starttext

\PoemTitle{A Silly Whimsy}
\startlines
Some really 
poetic lines
are here
and here, these are 
deeply moving
\stoplines

\stoptext

这对于断行很有效,但是由于行数较短,页面上的整体定位较差。

我正在尝试将此文本块(不是行)置于页面中央,包括页眉\PoemTitle。居中的文本块需要能够跨页显示。

我一直在尝试较窄的环境(不会\PoemTitle随文本块移动标题)、命令\hbox(似乎无法实现任何有用的功能)以及\defineblock\setupblock命令。我还没有找到有用的功能。

有任何想法吗?

编辑:

@Will In LaTeX 这给了我想要的结果:

\documentclass{memoir}

\renewcommand{\PoemTitlefont}{%
\normalfont\scshape\flushleft% Remove centering from poem title
\hspace*{0.5\linewidth}\hspace*{-0.5\versewidth}}% Makes poem title flush left with body block.

\begin{document}

\settowidth{\versewidth}{Some really deep moving} 
\PlainPoemTitle
\PoemTitle{willy nilly}
\begin{verse}[\versewidth]

Some really deep moving\\
lines of poetry\\
here.\\
It is all\\
so moving\\
\end{verse}


\end{document}

@Aditya:我想计算最长行的宽度,并选择一个偏移量,以便最长行位于文本区域的中间,如上面的 LaTeX 代码所示。如果最长行的计算是自动的,那就太好了。

答案1

一个可能的解决方案:

  1. 捕获环境内容(我使用缓冲区)
  2. w计算最大线的宽度(我使用 framedtext 和 autowidth=force)
  3. 设置较窄的环境,左间距等于(hsize-w)/2

此外,我使用线条,这样您就不必手动输入\\

\defineframedtext[诗歌框架]
  [宽度=\textwidth,自动宽度=force,对齐=flushleft,
   之前=,之后=,帧=关闭]

\definenarrower[诗歌缩小]

\definelines[诗行]
  [之前={\startpoemnarrower[left]},
   之后=\stoppoemnarrower,
  ]

\definebuffer[诗]

\def\stoppoem{\setups{诗歌:缓冲区}}

\startsetups 诗歌:缓冲区
  \setupnarrower[poemnarrower][left=0pt]
  \setbox\scratchbox\vbox
    {\诗框
    {\startpoemlines
       \获取诗句
      \停止诗行
  \edef\poemhsize{\the\dimexpr(\hsize-\wd\scratchbox)/2\relax}
  \setupnarrower[poemnarrower][left=\poemhsize]
  \开始诗行
    \获取诗句
  \停止诗行
\停止设置

这可以用作

\开始文本
\开始诗歌
一些非常深刻的感动
诗句
这里。
这就是全部
很感人
\停止诗


\开始诗歌
一些非常深刻的感动,非常非常深刻的感动
诗句
这里。
这就是全部
很感人
\停止诗
\停止文本

如果您愿意,您可以使用线条的其他功能(自动缩进替代线条等)。

编辑忘记了你还希望章节标题居中对齐。为此,添加

\definehead[诗歌标题][章节]

\setuphead[诗歌标题]
  [number=no,page=yes,style=\sc,alternative=command,command=\donothing]

并更改poem:buffer

\startsetups 诗歌:缓冲区
  \setupnarrower[poemnarrower][left=0pt]
  \setuphead[诗歌标题][margin=0pt]
  \setbox\scratchbox\vbox
    {\poemframed[align=normal,autowidth=force]
    {\startpoemlines
       \获取诗句
      \停止诗行
  \edef\poemhsize{\the\dimexpr(\hsize-\wd\scratchbox)/2\relax}
  \setuphead[诗歌标题][margin=\poemhsize]
  \setupnarrower[poemnarrower][left=\poemhsize]
  \开始诗行
    \获取诗句
  \停止诗行
\停止设置

答案2

强制性的 LaTeX 示例:)我知道问题指定了 ConTeXt 解决方案,但交叉传播想法是件好事。

由于 Aditya 在评论中查询了预期的输出,因此我这样解释这个问题正在寻找什么:(虽然我还没有尝试复制用于创建诗歌标题或任何其他内容的正确标记)

\documentclass{article}
\usepackage{varwidth,lipsum}
\begin{document}
\lipsum[1]
\begin{center}
\begin{varwidth}{\linewidth}
\obeylines
\textsc{A Silly Whimsy}
Some really 
poetic lines
are here
and here, these are 
deeply moving
\end{varwidth}
\end{center}
\lipsum[2]
\end{document}

答案3

根据 Will 的回答,您可以在 ConTeXt 中执行相同操作。这使用框架文本,因此不会跨页中断。

首先,要将头部居中对齐,只需添加alternative=middle\setuphead

要使内容居中,首先定义

\defineframedtext[诗歌框架]
                 [宽度=\文本宽度,
                  自动宽度=力,
                  对齐=左对齐,
                  之前=,
                  之后=,
                  帧=关闭]

这相当于varwidthLaTeX 中的环境。基本上,autowidth=force强制框的宽度等于最大行的长度。

接下来,我们将这个框架文本插入到遵循线条的诗歌环境中。

\definelines[诗]
            [之前={\startpoemframed[中间]},
             之后=\stoppoemframed]

确保框居中对齐。现在你可以middle使用\startpoemframed[middle]

\开始诗歌
...
\停止诗

使行居中对齐,左对齐。如前所述,这不会跨页。我不知道有什么简单的方法可以确保内容跨页。

答案4

要添加另一个 latex 解决方案(可能会引发上下文用户的想法):使用 longtable

\documentclass{article}
\usepackage{lipsum,longtable}
\begin{document}

\lipsum[1]

\begin{longtable}{l}
\large\bfseries Title \\*[1ex]
 line 1\\
 line 2\\
 line 3 a bit longer
\end{longtable}
\end{document}

相关内容