在一个典型的段落中,第一行会缩进一定量(比如说 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修复连续\indentlastlinepar
s 之间的空格(不幸的是,这需要另一个盒子寄存器,如果仅使用寄存器 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}