缩进段落的最后一行

缩进段落的最后一行

在一个典型的段落中,第一行会缩进一定量(比如说 1em)。

为了达到某种视觉效果,我希望每段的最后一行也缩进,比如说 1em。最后一行的其余部分应左对齐,第一行和最后一行之间的行应照常对齐。

一个光学示例如下:

  This paragraph is indented by 1em    <- this line is indented 1em
at the first line. After that some     <-\
text and some more to give you the     <-|
impression that all lines are justi-   <-+- all these lines justified 
fied and left aligned and then the     <-|
last line is indented by the same      <-/
  amount as the first.                 <- this line indented and left aligned
^
This small amount of space is what I am after!

我尝试了以下各种值leftskip,但是rightskip这些值会影响所有行,而不仅仅是最后一行。

\documentclass{article}
\usepackage{lipsum} 
\begin{document}
 
\setlength{\parindent}{1em}
\setlength{\leftskip}{1em plus -1fil}
\setlength{\rightskip}{0pt plus 1fil}
\par
\lipsum[1-20]

\end{document}

答案1

借助一些介绍的方法这里通过使用,grabbox我们至少可以按段落手动引入这一点(grabbox以便段落仍然可以包含逐字材料)。

我不认为在 LaTeX 中可以自动将这个功能应用到每一个普通文本段落。

它的工作原理是首先将段落作为 收集到盒子寄存器 0 中\vbox。这样做是为了\parfillskip=\parindent plus 1fil让 TeX 尝试\parindent在最后一行至少有一个空格。下一步是再次将其存储到盒子寄存器中(再次作为\vbox),这样做是为了我们可以进行一些修改。首先将原始内容放回原处,然后移除最后一个框(即最后一行的水平框)并将其存储在盒子寄存器中。接下来再次输出该盒子寄存器,但在\hskip\parindent其前面加上 ,以便它能够正确缩进。

我们可以用一个盒子寄存器 0 完成所有这些工作,因为分配是在本地完成的,并且在每个盒子的嵌套使用范围内。

我们还使用了一些代码https://tex.stackexchange.com/a/463739/117050修复连续\indentlastlinepars 之间的空格(不幸的是,这需要另一个盒子寄存器,如果仅使用寄存器 0,代码会更加混乱)。

谨防:当前实现创建的段落是不可分页的。

\documentclass[]{article}

\usepackage{grabbox}

\newcount\myprevgraf

\newcommand\indentlastlinepar
  {%
    \par
    \begingroup
    \parfillskip\parindent plus 1fil\relax
    % save the number of lines of the paragraph typeset in the box
    \grabbox0\vbox[\par\global\myprevgraf\prevgraf]
      {%
        % measurement as in https://tex.stackexchange.com/a/463739/117050
        \setbox0\vtop{\unvcopy0}%
        \setbox2\vbox{\unvcopy0}%
        \dimen0\dimexpr\dp0-\dp2\relax
        % only make changes if the paragraph had more than one line
        \ifnum\myprevgraf>1
          % changing the last line as in
          % https://tex.stackexchange.com/a/280035/117050
          \setbox0\vtop
            {%
              \unvbox0
              \setbox0\lastbox
              \hbox to \linewidth{\hskip\parindent\unhbox0\uskip\unskip\hfill}%
            }%
        \fi
        % introducing additional space and setting the correct depth as in
        % https://tex.stackexchange.com/a/463739/117050
        \dp0=\dp2
        \box0
        \vskip\dimen0
        \endgroup
      }%
  }

\usepackage{duckuments}

\begin{document}
\indentlastlinepar{\blindduck[1]}
\indentlastlinepar{\blindduck[2]}
\indentlastlinepar{\blindduck[3]}
\indentlastlinepar{\blindduck[4]}
\indentlastlinepar{\blindduck[5]}
\indentlastlinepar{This is a paragraph containing \verb|\verbatim| material.}
\end{document}

如果\indentlastlinepar使用多个连续的即可分页。您可以使用带星号的变体来抑制段落上方添加的额外空间\indentlastlinepar*

\documentclass[]{article}

\usepackage{grabbox}

\newcount\myprevgraf

\NewDocumentCommand\indentlastlinepar{s}
  {%
    \par
    \begingroup
    \parfillskip\parindent plus 1fil\relax
    % save the number of lines of the paragraph typeset in the box
    \grabbox0\vtop[\par\global\myprevgraf\prevgraf]
      {%
        % only make changes if the paragraph had more than one line
        \ifnum\myprevgraf>1
          % changing the last line as in
          % https://tex.stackexchange.com/a/280035/117050
          \setbox0\vtop
            {%
              \unvbox0
              \setbox0\lastbox
              \hbox to \linewidth{\hskip\parindent\unhbox0\unskip\unskip\hfill}%
            }%
        \fi
        % introducing additional space dependent on the current vtops height
        \IfBooleanF{#1}
          {%
            \ifdim\ht0<\baselineskip
              \vskip\dimexpr\baselineskip-\ht0\relax
            \fi
          }%
        % unbox the contents
        \unvbox0
        \endgroup
      }%
  }

\usepackage{duckuments}

\begin{document}

\indentlastlinepar{\blindduck[-]}
\indentlastlinepar{This is a paragraph containing \verb|\verbatim| material.}
\indentlastlinepar{\blindduck[-]}
\indentlastlinepar{\blindduck[-]}
\indentlastlinepar{\blindduck[-]}
\indentlastlinepar{\blindduck[-]}
\indentlastlinepar{\blindduck[-]}
\indentlastlinepar{\blindduck[-]}

\end{document}

在此处输入图片描述

答案2

这需要运行两次乳胶,第一次运行计算以 为前缀的任何段落的行数\zz,第二次运行使用该信息构建\parshape 如果 parshape 改变行数,则可能需要额外运行。

在此处输入图片描述

\documentclass[twocolumn]{article}

\newcount\zzpar

\makeatletter
\def\zz{%
\global\advance\zzpar\@ne
\expandafter\let\expandafter\zzn\csname zzcnt\the\zzpar\endcsname
\ifx\zzn\relax
\else
\parshape \zzn
\zzloop\zzn
\parindent \dimexpr\linewidth-\parindent\relax
\fi
\def\par{\endgraf
\edef\tmp{\immediate\write\@auxout{%
\global\string\@namedef{zzcnt\the\zzpar}{\the\prevgraf}}}%
\tmp
\let\par\endgraf
}%
}

\def\zzloop#1{%
\ifnum#1>\@ne
\z@\linewidth
\zzloop{\numexpr#1-1\relax}\fi}


\makeatother

\begin{document}



\zz
This paragraph is indented by 1em
at the first line. After that some
text and some more to give you the
impression that all lines are justi-
fied and left aligned and then the
last line is indented by the same
amount as the first.



\end{document}

相关内容