TeXの記憶(13)—PSTricksで見出し付きの囲みを作る

\vruleや\hrule`でも見出し付きの囲みを作ることができますが、応用が効いて便利なのはPSTricksを使った囲みでしょう。

PSTricksなら描画の順番をコントロールできるので、fcolorboxであったように罫線が欠けてしまうような状況にも対応できます。

これで自動改ページができればいいんだけれど、自分ではできていません。どこかにそんなマクロがあるかな。使ってみたいものです。\vrule, \hruleだけを使った囲みならあるんですけどね。

PSTricksを使って見出しを付けた仕上がりは以下のようになっています。
せっかくだから、見出しの位置をスイッチで変更できるようにしました。
\ifBoxSTtitleLがtrueなら右、falseなら中央です。
(右寄せのほうが自然かもしれませんが、このほうが需要が多かったもので)。

画面

マクロです。

\documentclass[draft]{jsbook}

\usepackage{color}
\usepackage{pstricks}

\makeatletter

% 囲みの罫線の色
\definecolor{iro1}{cmyk}{1,1,0,0}
% 囲みの内側の色
\definecolor{iro2}{cmyk}{0.1,0,0,0}

% 準備する変数など
\newbox\Box@box       % 中身を入れる箱
\newbox\Box@titlebox  % 見出しを入れる箱
\newdimen\Box@rule@wd % ワクの幅
\newdimen\Box@Hsep    % ワクから中身までの水平距離
\newdimen\Box@VTsep   % ワク上部から中身までの距離
\newdimen\Box@VBsep   % ワク下部から中身までの距離

\newdimen\Box@OVTsep  % 上の行からワク上部までの距離
\newdimen\Box@OVBsep  % ワク下部から下の行まで距離

\newdimen\Box@ht  % 中身の高さ
\newdimen\Box@wd  % 中身の深さ
% 保存する値
\newdimen\keephsize
\newdimen\keeplinewidth
\newdimen\Box@offset
\newdimen\Box@tempA

% 見出しの位置(true==左、false==中央)
\newif\ifBoxSTtitleL
\BoxSTtitleLtrue
\def\BoxST#1#2#3#4#5#6#7#8#9{\par\vskip#7
  % 引数の設定
  \Box@Hsep=#1
  \Box@rule@wd=#2
  \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@rule@wd
  \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\endBoxST{%
  \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
  % 描画
  \Box@tempA=\Box@ht
  \advance\Box@tempA 2mm
  \begin{pspicture}(0,0)(\linewidth,\Box@tempA)  % 見出しの上のはみ出し
    \psframe[linestyle=solid,linecolor=\Box@rulecolor,
    linewidth=\Box@rule@wd,fillstyle=solid,fillcolor=\Box@color]
    (0,0)(\linewidth,\Box@ht)
   \def\Box@titleback{\color{\Box@color}\rule{\wd\Box@titlebox}{1mm}}
   \def\Box@title{%
     \psframebox[linestyle=none,fillstyle=none,framesep=0mm]
     {\box\Box@titlebox}}%
    % 見出しの上の部分を白にする
    \Box@tempA=\Box@ht \advance\Box@tempA -.82mm
    \ifBoxSTtitleL
      \rput[lb](0.6,\Box@tempA){\Box@titleback}
    \else
      \rput[Cb](0.5\textwidth,\Box@tempA){\Box@titleback}
    \fi
    % ワク内最下行とケイとのアキの補正
    \advance\Box@VBsep -0.1mm
    % 中身
    \rput[lb](\Box@Hsep,\Box@VBsep){\box\Box@box}
    % 見出し
    \advance\Box@ht -.55\Box@offset
    \ifBoxSTtitleL
      \rput[lb](0.6,\Box@ht){\Box@title}
    \else
      \rput[Cb](0.5\textwidth,\Box@ht){\Box@title}
    \fi
  \end{pspicture}\vskip\Box@OVBsep}


\makeatother

\def\waku#1{\BoxST{1zw}{.6mm}{iro1}{iro2}{3mm}{3mm}{1.5mm}{2mm}{\bf #1}}
\def\endwaku{\endBoxST}


\begin{document}

\BoxSTtitleLtrue
\begin{waku}{見出し}
□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□
□□□□□□□□□□□□□□□□\par
○○○○○○○○○○○○○○○○
\end{waku}

\BoxSTtitleLfalse
\begin{waku}{見出し}
□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□
□□□□□□□□□□□□□□□□\par
○○○○○○○○○○○○○○○○
\end{waku}


\end{document}

コメント

  1. […] TeXの記憶(13) —PSTricksで見出し付きの囲みを作るで作った枠のマクロを土台に見出しだけ加工してみました。 […]

  2. […] 前回、\hruleと\vruleで作った子持罫のPSTricks版です。TeXの記憶(13)—PSTricksで見出し付きの囲みを作るの手順とほとんど同じです。罫線を外側に重ねるだけです。ついでに見出しも付けま […]