使用 \raggedright 将段落最后一个单词右对齐

使用 \raggedright 将段落最后一个单词右对齐

我想将段落的最后一个单词右对齐,例如此示例来自TeXbook

这对于两端对齐的段落很有效,但对于\raggedright段落则无效。

如果相关的话,下面 MWE 示例中的具体示例包括一个稍微复杂一些的段落设置,用于根据以下代码排版诗篇:这个答案

我的当前设置有两个问题。

  1. 即使上一行还有空间,段落中的倒数第二个单词也会换到最后一行。
  2. 本段最后一个词(细拉) 未设置为右对齐。

我还想避免使用连字符。

\documentclass{article}

\usepackage{xparse}
\usepackage[showframe,textwidth=5.6cm,textheight=10cm]{geometry}
\parindent 0em

\ExplSyntaxOn

\dim_new:N \l__scripture_indent_dim

\dim_set:Nn \l__scripture_indent_dim { 1em }

\cs_new:Nn \scripture_vs:n
  {
    \textsuperscript {#1}
  }

\cs_new:Nn \scripture_vs_overlap_left:n
  {
    \hbox_overlap_left:n
      {
        \scripture_vs:n {#1}
      }
  }

\cs_new:Nn \scripture_format_selah:n
  {
    \emph {#1}
  }

\cs_new:Nn \scripture_selah:
  {
    {
      \unskip
      \nobreak
      \hfil
      \penalty 50
      \skip_horizontal:N 2em
      \hbox:n {}
      \nobreak
      \hfil
      \scripture_format_selah:n { Selah }
      \parfillskip = 0pt
      \finalhyphendemerits = 0
      \endgraf
      \skip_vertical:n { -\baselineskip }
      \leavevmode
    }
  }

\cs_new:Nn \scripture_vs_outdent_overlap_left:n
  {
    \skip_horizontal:N -\l__scripture_indent_dim
    \scripture_vs_overlap_left:n {#1}
    \skip_horizontal:N \l__scripture_indent_dim
  }

\cs_new_protected:Nn \scripture_psalm_par:
  {
    \mode_if_vertical:TF
      {
        \cs_set_eq:NN \vs \scripture_vs_overlap_left:n
        \noindent
      }
      {
        \cs_set_eq:NN \vs \scripture_vs_outdent_overlap_left:n
        \endgraf
      }
    \dim_set:Nn \hangindent { 4 \l__scripture_indent_dim }
  }

\NewDocumentCommand \selah { }
  {
    \scripture_selah:
  }

\NewDocumentEnvironment {psalm} { }
  {
    \raggedright
    \cs_set_eq:NN \vs \scripture_vs_overlap_left:n
    \cs_set_eq:NN \par \scripture_psalm_par:
    \dim_set_eq:NN \leftskip \l__scripture_indent_dim
    \dim_set_eq:NN \parindent \l__scripture_indent_dim
    \obeylines
  }
  { }

\ExplSyntaxOff

\begin{document}

\section*{What I get}

\begin{psalm}
  \vs{1}\textsc{Lord}, how many are my foes!
  How many rise up against me!

  \vs{2}Many are saying of me,
  ‘God will not deliver him.’\selah\medskip

  \vs{3}But you, \textsc{Lord}, are a shield around me,
  my glory, the One who lifts my head high.

  \vs{4}I call out to the Lord,
  and he answers me from his holy mountain.\selah
\end{psalm}

\section*{What I'd like}

\hspace*{2em}`God will not deliver him.'\selah

\medskip

\hspace*{2em}and he answers me from his \\
\hspace*{5em}holy mountain.\selah

\end{document}

输出

答案1

看起来您可以稍微修改一下\scripture_selah定义。我添加了\hspace*{0.025\textwidth}只是为了确保有一些额外的空间,这样就Selah可以填充 而不是立即刷新(如果有足够的空间,例如him.')。

(仅使用原语的版本)

\cs_new:Nn \scripture_selah:
{
    \hfill\null%
    \penalty -5%
    \null\hfill%
    \kern 1em\scripture_format_selah:n {Selah}%
    \skip_vertical:n { -\baselineskip }
    \leavevmode
}

(最小改动版本)

\cs_new:Nn \scripture_selah:
  {
    {
      \unskip
      \hfil
      \penalty 50
      \hbox:n {}
      \nobreak
      \hspace*{\fill}
      \scripture_format_selah:n { \hspace*{0.025\textwidth}Selah }
      \parfillskip = 0pt
      \finalhyphendemerits = 0
      \endgraf
      \skip_vertical:n { -\baselineskip }
      \leavevmode
    }
  }

(代码最少的版本)

\cs_new:Nn \scripture_selah:
  {
    {
      \hfil
      \penalty 50
      \hspace*{\fill}
      \scripture_format_selah:n { \hspace*{0.025\textwidth}Selah }
      \skip_vertical:n { -\baselineskip }
      \leavevmode
    }
  }

修改了水平格式

这在您提供的特定示例中有效。我不确定这是否在您使用它的每种情况下都能稳定地发挥作用。

编辑:

我进一步研究了一下\hbox:n,但我真的不认为你想在这里使用它(请参阅我的“代码最少的版本”)。它大致相当于 之前的钩子\par。如果你将它包裹\scripture_format_selah:n在 中\hbox:n(即\hbox:n {\scripture_format_selah:n ...},在这种情况下,你将获得与不使用相同的结果\hbox:n。因此,我选择忽略它。

相关内容