TeXの記憶(33) — 子持罫の囲みをPSTricksで作る

前回、\hruleと\vruleで作った子持罫のPSTricks版です。TeXの記憶(13)—PSTricksで見出し付きの囲みを作るの手順とほとんど同じです。罫線を外側に重ねるだけです。ついでに見出しも付けました。マクロがなんだか長くなってしまいましたが。

0903

PSTricksを使った方法は、私の場合はどれも同じです。

  • ボックスの中に入れるテキストの幅境を\hsizeと\linewidthで設定
  • \vboxを開始(\bgroup)
  • その中でインデントを決めたり、必要ならば\mathindent設定
  • 環境が終わったら、\egroupでボックスを閉じる
  • ボックスの高さを求めて、その周囲に罫線を描画
  • 罫線の領域の中にテキストの入ったボックスを書き出す

見出しに必要な手順は2つだけでした。

  • 見出しが配置される領域に囲みの中の色の領域を重ねる
  • 見出しを配置する

見出しの下にある罫線を隠すように適当な値を設定しています。見出しの下の罫線の隠し方(見た目)はいろいろあるかもしれませんが、罫線だけ隠してしまうのがいちばん自然かなと思います。

13Qに合わせた固定値なので、文字のサイズが変わるときには直さないといけないですね。12Qくらいだと、同じ値でも分からないかもしれません。

\usepackage{pstricks}
\usepackage{color}

...

\definecolor{iro1}{cmyk}{1,0,0,0}
\definecolor{iro2}{cmyk}{0,0,0,0.1}

\newdimen\Box@ht  % 中身の高さ
\newdimen\Box@wd  % 中身の幅
\newbox\Box@box          % 中身の入るボックス
\newbox\Box@titlebox
\newdimen\Box@inrule@wd  % 内側の罫線の太さ
\newdimen\Box@outrule@wd % 外側の罫線の太さ
\newdimen\Box@rulesep    % 2つのケイ線の間隔
\newdimen\Box@Hsep   % 内側の罫線と中のテキストまでの距離
\newdimen\Box@VTsep  % ワク上部から中身まで
\newdimen\Box@VBsep  % ワク下部から中身まで
\newdimen\Box@OVTsep % 上の行からワク上部まで
\newdimen\Box@OVBsep %ワク下部から下の行まで

\newdimen\Box@offset

% hsizeとlinewidthを保存しておく
\newdimen\keephsize
\newdimen\keeplinewidth
% 一時的な値の保存
\newdimen\Box@tempA
\newdimen\Box@tempB
\newdimen\Box@tempC

\def\komotiM#1{\BoxDdT{1zw}{.5mm}{iro1}{iro2}{3mm}{2mm}{4mm}{0mm}{#1}}
\def\endkomotiM{\endBoxDdT}

% BoxDdTの本体
%     #1 左右のアキ
%     #2 ワクの幅(無効)
%     #3 ワクの色
%     #4 中身の色
%     #5 上のアキ(ワク内)
%     #6 下のアキ(ワク内)
%     #7 上のアキ(ワク外)
%     #8 下のアキ(ワク外)
%     #9 見出し
\def\BoxDdT#1#2#3#4#5#6#7#8#9{\par\vskip#7
  % 引数の設定
  \Box@Hsep=#1
  \Box@outrule@wd=.3mm
  \Box@inrule@wd=.1mm
  \Box@rulesep=.5mm
  \def\Box@rulecolor{#3}%
  \def\Box@color{#4}%
  \Box@VTsep=.2mm \advance\Box@VTsep #5
  \Box@VBsep=.3mm \advance\Box@VBsep #6
  \Box@OVBsep=#8
  \setbox\Box@titlebox=\hbox{\hskip1mm{#9}\hskip1.2mm}%
  % 箱の全体の幅から,アキと罫線の幅を引く
  \Box@wd=\linewidth
  \advance\Box@wd -2\Box@outrule@wd
  \advance\Box@wd -2\Box@inrule@wd
  \advance\Box@wd -2\Box@rulesep
  \advance\Box@wd -2\Box@Hsep
  % 元の値を保存
  \keephsize=\hsize
  \keeplinewidth=\linewidth
  \hsize=\Box@wd \parindent=\z@
  \linewidth=\hsize
  % 箱を作る
  \setbox\Box@box=\vbox\bgroup\parindent=1zw}
\def\endBoxDdT{%
  \egroup
  % 値の復元
  \hsize=\keephsize
  \linewidth=\keeplinewidth
  % 箱の高さ = 中身+上下のアキ
  \Box@ht=\ht\Box@box \advance\Box@ht \dp\Box@box
  \advance\Box@ht \Box@VTsep \advance\Box@ht \Box@VBsep
  % 箱の高さ += 見出しの高さ(ケイより下に出ている分)
  \Box@offset=\ht\Box@titlebox \advance\Box@offset \dp\Box@titlebox
  \advance\Box@ht .35\Box@offset % 割合は適当
  % 描画
  \begin{pspicture}(0,0)(\linewidth,\Box@ht)
    % 外側のワク
    \psframe[linestyle=solid,linecolor=\Box@rulecolor,
    linewidth=\Box@outrule@wd,fillstyle=solid,fillcolor=\Box@color]
    (0,0)(\linewidth,\Box@ht)
    % 内側のワク
    \Box@tempA=\Box@outrule@wd     % 内側のワクの描画ポイント
    \advance\Box@tempA \Box@rulesep
    \Box@tempB=\linewidth       % ワクの右端のポイント
    \advance\Box@tempB -\Box@tempA
    \Box@tempC=\Box@ht
    \advance\Box@tempC -\Box@tempA
    \psframe[linestyle=solid,linecolor=\Box@rulecolor,
    linewidth=\Box@inrule@wd,fillstyle=none]
    (\Box@tempA,\Box@tempA)(\Box@tempB,\Box@tempC)
    % 見出しの地(ケイの内側)
    \def\Box@titleback{%
      \psframe[linestyle=none,fillstyle=solid,fillcolor=\Box@color]
      (0,-.05)(\wd\Box@titlebox,0.1)}
    \def\Box@title{%
      \psframebox[linestyle=none,fillstyle=none,framesep=0mm]
      {\box\Box@titlebox}}%
    % 見出しの上の部分を白にする
    \Box@tempA=\Box@ht \advance\Box@tempA -.82mm
    \rput[lb](0.6,\Box@tempA){\Box@titleback}
    % ワク内最下行とケイとのアキの補正
    \advance\Box@VBsep -0.1mm
    % 中身
    \Box@tempA=\Box@rulesep
    \advance\Box@tempA \Box@inrule@wd
    \Box@tempB=\Box@Hsep
    \advance\Box@tempB \Box@tempA
    \Box@tempC=\Box@VBsep
    \advance\Box@tempC \Box@tempA
    \rput[lb](\Box@tempB,\Box@tempC){\box\Box@box}
    % 見出し
    \advance\Box@ht -.65\Box@offset
    \rput[lb](0.6,\Box@ht){\Box@title}
  \end{pspicture}\vskip\Box@OVBsep}
\begin{komotiM}{見出し}
□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□
□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□
\end{komotiM}

コメント