\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}