我想将段落的最后一个单词右对齐,例如此示例来自TeXbook。
这对于两端对齐的段落很有效,但对于\raggedright
段落则无效。
如果相关的话,下面 MWE 示例中的具体示例包括一个稍微复杂一些的段落设置,用于根据以下代码排版诗篇:这个答案。
我的当前设置有两个问题。
- 即使上一行还有空间,段落中的倒数第二个单词也会换到最后一行。
- 本段最后一个词(细拉) 未设置为右对齐。
我还想避免使用连字符。
\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
。因此,我选择忽略它。