从段落最后一行应用 \parshape

从段落最后一行应用 \parshape

我想按照下图所示格式化段落,即最后一段n段落的各行居中且宽度呈线性减小。(n各个段落之间都是一致的。

段落形状

该段落没有预定义的总行数,并且可能预先延伸到几页。

\documentclass{article}

\begin{document}

\parshape=9
0.40\linewidth  0.2\linewidth
0.35\linewidth  0.3\linewidth
0.30\linewidth  0.4\linewidth
0.25\linewidth  0.5\linewidth
0.2\linewidth   0.6\linewidth
0.15\linewidth  0.7\linewidth
0.1\linewidth   0.8\linewidth
0.05\linewidth  0.9\linewidth
0\linewidth     1\linewidth
\noindent
Lorem ipsum dolor sit amet, consectetur adipiscing elit. Etiam mollis fermentum nisi vitae luctus. Vestibulum libero tellus, facilisis et ultricies sed, pretium quis eros. Nunc hendrerit lacinia augue, eu placerat nisi efficitur quis. Sed sed auctor sapien. Donec mattis fermentum mauris, vel maximus orci porta eu. Pellentesque ornare odio at massa facilisis, quis consectetur massa volutpat. Morbi tempus hendrerit lorem id luctus. Nulla id tellus cursus, sagittis neque et, sagittis ipsum. Donec gravida lorem velit, at congue odio tristique condimentum. Nulla sed semper arcu, id fringilla erat. Fusce eleifend, risus vel molestie fermentum, mi mi rhoncus leo, finibus sollicitudin augue lorem et ex. Nam pellentesque massa et mauris consectetur, sed aliquet metus pretium. Nam sed urna id mi fermentum consectetur ut in lacus. Donec laoreet nunc ac diam ornare, sit amet interdum nulla porta. Curabitur lectus sem, rhoncus sit amet mattis ac, lobortis vel dolor. Donec dignissim vitae mauris et iaculis. Sed porta lectus eu eros convallis, ut vulputate mauris vestibulum. Nunc quis pretium ante. Nam dapibus leo et felis molestie, quis posuere purus aliquam. Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. Proin tristique ut ipsum ac facilisis. Etiam suscipit magna tellus. In ornare quam id accumsan tincidunt. Vivamus cursus quam vitae neque tempus tempor. Mauris scelerisque lacinia nisl a mollis. Quisque vestibulum, mauris non semper volutpat, ante quam ultrices ligula, id vulputate mi felis eu leo. Integer commodo iaculis nulla. Etiam ut luctus ipsum, nec feugiat lectus. Mauris erat sapien, eleifend viverra ante sed, efficitur porta enim. Nam nec arcu ante. Mauris auctor tincidunt molestie. Praesent non sem blandit, pretium metus a, condimentum felis. Nunc rutrum volutpat mi nec pharetra. Duis ultricies sollicitudin sagittis. Curabitur vitae dui tempor, egestas enim eu, eleifend libero. Aliquam ac congue felis. Curabitur tristique ex sed augue imperdiet. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Etiam mollis fermentum nisi vitae luctus. Vestibulum libero tellus, facilisis et ultricies sed, pretium quis eros. Nunc hendrerit lacinia augue, eu placerat nisi efficitur quis. Sed sed auctor sapien. Donec mattis fermentum mauris, vel maximus orci porta eu. Pellentesque ornare odio at massa facilisis, quis consectetur massa volutpat. Morbi tempus hendrerit lorem id luctus. Nulla id tellus cursus, sagittis neque et, sagittis ipsum. Donec gravida lorem velit, at congue odio tristique condimentum. Nulla sed semper arcu, id fringilla erat. Fusce eleifend, risus vel molestie fermentum, mi mi rhoncus leo, finibus sollicitudin augue lorem et ex. Nam pellentesque massa et mauris consectetur, sed aliquet metus pretium. Nam sed urna id mi fermentum consectetur ut in lacus. Donec laoreet nunc ac diam ornare, sit amet interdum nulla porta. Curabitur lectus sem, rhoncus sit amet mattis ac, lobortis vel dolor. Donec dignissim vitae mauris et iaculis. Sed porta lectus eu eros convallis, ut vulputate mauris vestibulum. Nunc quis pretium ante. Nam dapibus leo et felis molestie, quis posuere purus aliquam. Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. Proin tristique ut ipsum ac facilisis. Etiam suscipit magna tellus. In ornare quam id accumsan tincidunt. Vivamus cursus quam vitae neque tempus tempor. Mauris scelerisque lacinia nisl a mollis. Quisque vestibulum, mauris non semper volutpat, ante quam ultrices ligula, id vulputate mi felis eu leo. Integer commodo iaculis nulla. Etiam ut luctus ipsum, nec feugiat lectus. Mauris erat sapien, eleifend viverra ante sed, efficitur porta enim. Nam nec arcu ante. Mauris auctor tincidunt molestie. Praesent non sem blandit, pretium metus a, condimentum felis. Nunc rutrum volutpat mi nec pharetra. Duis ultricies sollicitudin sagittis. Curabitur vitae dui tempor, egestas enim eu, eleifend libero. Aliquam ac congue felis. Curabitur tristique ex sed augue imperdiet.

\end{document}

该命令\parshape很好,但是,它适用于段落的第一行和(n-1) 以下几行(如 MWE 中)。理想情况下,\parshape应应用于最后一行以及(n-1) 前几行。

在研究了这个问题之后,我没有看到任何地方可以做到这一点。我发现了这个shapepar包,但这个包不太合适。

你知道该怎么做吗?

答案1

现在,如果您希望最后一行在最后完美结束,那就是另一个问题了。

\documentclass{article}
\usepackage{showframe}
\usepackage{lipsum}

\newcommand{\weirdpar}[1]% #1 = a single paragraph
{\bgroup% use local definitions
  \def\parshapeargs{9
  0.40\columnwidth 0.2\columnwidth 
  0.35\columnwidth 0.3\columnwidth 
  0.30\columnwidth 0.4\columnwidth 
  0.25\columnwidth 0.5\columnwidth 
  0.2\columnwidth  0.6\columnwidth 
  0.15\columnwidth 0.7\columnwidth 
  0.1\columnwidth  0.8\columnwidth 
  0.05\columnwidth 0.9\columnwidth
  0pt \columnwidth}%
  \setbox0=\vbox{\parshape\parshapeargs #1}% get approximate height
  \dimen0=\dimexpr \ht0+\dp0\relax
  \count1=\numexpr \dimen0 / \baselineskip\relax
  %\unvbox0
  %\the\count1
  \dimen0=0pt
  \dimen1=\columnwidth
  \dimen2=0.05\columnwidth
  \edef\parshapeargs{\the\count1}%
  \loop
    \ifnum\count1<9
      \advance\dimen0 by \dimen2
      \advance\dimen1 by -2\dimen2
    \fi
    \edef\parshapeargs{\parshapeargs\space\the\dimen0\space\the\dimen1}%
    \advance\count1 by -1
  \ifnum\count1>0 \repeat
  \parshape\parshapeargs #1\par
\egroup}

\begin{document}
\weirdpar{\LipsumPar{1}}
\end{document}

演示

相关内容