\parshape 的更精简版本

\parshape 的更精简版本

\parshape可以处理任意的段落形状。一个极端包含在如何布局不规则段落形状,它可以处理如下段落设置:

在此处输入图片描述

然而,简化版(也是最常用的)的版本\parshape通常在多行的长度。例如,

在此处输入图片描述

\documentclass{article}
\usepackage{lipsum}% http://ctan.org/pkg/lipsum
\begin{document}

\parshape 5
  0pt 0.5\textwidth
  0pt 0.5\textwidth
  0pt 0.5\textwidth
  0pt 0.5\textwidth
  0.5\textwidth 0.5\textwidth
\noindent\lipsum[1]

\end{document}

但是,使用重复的显式行长度会导致输入繁琐 - 行数越多,重复越多。是否可以创建一个宏\newparshape(比如说),提供与上述相同的功能,但允许输入以下形式

\newparshape{<num>}{<ind> <wd>}[<indL> <wdL>]

它将设置<num>行的缩进<ind>和宽度<wd>,而后续行(<num>+1 及以上)将设置缩进<indL>和宽度<wdL>。上面的示例(默认)用法将被替换为

\newparshape{4}{0pt 0.5\textwidth}[0.5\textwidth 0.5\textwidth]
\noindent\lipsum[1]

在更一般的设置中,扩大设置的限制长度更多将生成\newparshape接受表单的输入

\newparshape
  {3}{0pt 0.5\textwidth}% 3 lines with 0pt indent and width 0.5\textwidth, followed by
  {2}{0.25\textwidth 200pt}% 2 lines with 0.25\textwidth indent and width 200pt, followed by
  {..}{...}% .. lines with ... and ..., followed by
  [...]% subsequent lines with indent ... and width ...

当然,完全不同的界面也是可以接受的。例如,更像这样的东西tabular

\newparshape{{4}{0pt 0.5\textwidth}{2}{0.25\textwidth 200pt}{..}{...}}[...]

其中,参数对在 的第一个参数中分组\newparshape{<lines>}[<other>],后面跟着一个可能的规范,<other>用于处理可选参数中的后续行。

答案1

在此处输入图片描述

\documentclass{article}
\usepackage{lipsum}% http://ctan.org/pkg/lipsum

\parindent0pt
\parskip\bigskipamount

\makeatletter
\def\newparshape{\parshape\@npshape0{}}
\def\@npshape#1#2#3{\ifx\\#3\expandafter\@@@npshape\else\expandafter\@@npshape\fi
{#1}{#2}{#3}}
\def\@@npshape#1#2#3#4#5{%
\ifnum#3>\z@\expandafter\@firstoftwo\else\expandafter\@secondoftwo\fi
{\expandafter\@@npshape\expandafter{\the\numexpr#1+1\relax}{#2 #4 #5}{\numexpr#3-1\relax}{#4}{#5}}%
{\@npshape{#1}{#2}}}
\def\@@@npshape#1#2#3{#1 #2 }
\makeatother


\begin{document}

\newparshape{3}{5pt}{5cm}{4}{10pt}{2cm}{1}{5cm}{8cm}\\\lipsum[1]

\newparshape{2}{5cm}{5cm}{2}{4cm}{5cm}{2}{3cm}{5cm}{1}{0pt}{\textwidth}\\\lipsum[1]



\end{document}

相关内容