TeXの記憶(9) — \parshapeと\@whilenumを使う

作ってみたものの、あまり役に立たなそうなコマンドです。\@whilenumを使ってみたかった、というのがいちばんの理由です。

TeXには「\parshape」というコマンドがあって、TeX Bookの例を見たりするとなんだか便利に使えそうな気がします。ところが実際に指定しようとすると、必要な行数だけ引数を指定しなければならず面倒です。

\parboxの使い方は

\parbox n i_1 l_1 i_2 l_2 ... i_k l_k ... i_n l_n
n:整形に必要な行数
i_k:k行目の字下げ幅
l_k:k行目の文字数
n行目以降は最後のi_nとl_nの値が続く

これを必要な行数分引数として渡すのはとても面倒なので、引数を文字列として作って\parboxに渡すためのコマンドを作ってみました。TeX Bookの例よりずっと単純で、右端の一部を開けるだけですの機能です。

図版を回り込ませるならwrapfig.styのようなマクロを使ったほうが便利ですね。

実行例

img20130506

\newcommand{\Parshape}[3][0]{%
  \@tempcnta=#1\advance\@tempcnta by 1 % 全体の行数が入る
  \@tempcntb=1
  \def\STR{}%
  % #1 != 0なら、#1行分は普通に出力するための引数の文字列
  \@whilenum\@tempcntb<\@tempcnta\do{\edef\STR{ \STR 0pt \the\linewidth }%
    \advance\@tempcntb by 1}%
  \advance\@tempcnta #2
  % 整形するための引数の文字列
  \@whilenum\@tempcntb<\@tempcnta\do{\edef\STR{ \STR 0pt #3 }%
    \advance\@tempcntb by 1}%
  % 最終行以降、段落の終わりまでは通常の指定
  \edef\STR{\STR 0pt \the\linewidth}%
  % 作った文字列を引数として渡す
  \parshape \@arabic\@tempcnta \STR}

.....

\begin{document}

% 2行は通常、3行分右明け、2+3+1行からは通常
\Parshape[2]{3}{15zw}
□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□
□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□
□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□
□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□
□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□

 

コメント