TeXの記憶(109)— PSTricksを使った見出しが2つの囲み

PSTricksを使った囲みで、見出しが2つ付いたタイプです。ずっと以前に作ったものです。

1213

書籍の中で例題を表示するための囲みなので、マクロ名はreidaiです。

このマクロの中で「例題」の番号を設定して、囲み本体のマクロ\BoxINに値を渡しています。

2つの見出しのうち、左側の見出しは\BoxINの引き数で、右側の見出しは\reidaiMRtitleRとして定義しています。もともと1つの見出しのマクロを拡張したので、こんな形になってしまいました。

これだけ引き数が多くなると、PSTricksのように [ ] の中にパラメータを入れるほうがいいかもしれません。パッケージとして作るならそのほうが良いのでしょうが、その場しのぎの積み重ねでやり過ごしてしまいました。

\newcounter{reidaicnt}
\def\reidai#1{%
  \stepcounter{reidaicnt}%
  \protected@edef\@currentlabel{\thechapter.\arabic{reidaicnt}}
  \BoxIN{1zw}{.3mm}{blue}{white}{3mm}{2mm}{3mm}{0mm}%
  {{\bf 例題\thechapter.\arabic{reidaicnt}}}%
  \gdef\reidaiMRtitleR{\bf #1}}
\def\endreidai{\endBoxSTR}

\newbox\Box@box       % 中身を入れる箱
\newbox\Box@titlebox  % 見出しを入れる箱
\newdimen\Box@Hsep    % ワクから中身までの水平距離
\newdimen\Box@rule@wd \Box@rule@wd=0.15mm
\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
\newdimen\Box@tempB
\newdimen\Box@tempC


% 本体
\def\BoxIN#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\endBoxSTR{%
  \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@rule@wd,fillstyle=solid,fillcolor=\Box@color]
    (0,0)(\linewidth,\Box@ht)
    \def\Box@titleback{%
      \psframe[linestyle=none,fillstyle=solid,fillcolor=\Box@color]
      (0,0)(\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 -.62mm
    \rput[lb](1.5zw,\Box@tempA){\Box@titleback}
    % 右側の見出し
    \def\Box@titleRback{%
      \setbox0=\hbox{\reidaiMRtitleR}\dimen0=\wd0\advance\dimen0 .8mm
      \psframe[linestyle=none,fillstyle=solid,fillcolor=\Box@color]
      (0,0)(\dimen0,0.1)}
    \def\Box@titleR{%
      \psframebox[linestyle=none,fillstyle=none,framesep=0mm]
      {\reidaiMRtitleR}}%
    \Box@tempB=\linewidth
    \advance\Box@tempB -1.5zw
    \setbox0=\hbox{\reidaiMRtitleR}%
    \advance\Box@tempB -\wd0
    \Box@tempA=\Box@ht \advance\Box@tempA -.82mm
    % 見出しの上の部分を白にする
    \Box@tempC=\Box@tempB
    \advance\Box@tempC -.4mm
    \rput[lb](\Box@tempC,\Box@tempA){\Box@titleRback}
    % ワク内最下行とケイとのアキの補正
    \advance\Box@VBsep -0.1mm
    % 中身
    \rput[lb](\Box@Hsep,\Box@VBsep){\box\Box@box}
    % 見出し
    \advance\Box@ht -.65\Box@offset
    \rput[lb](1.5zw,\Box@ht){\Box@title}
    \rput[lb](\Box@tempB,1.01\Box@ht){\reidaiMRtitleR}
  \end{pspicture}\vskip\Box@OVBsep}
\setcounter{chapter}{1}

\begin{reidai}{この例題の見出し}
□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□
□□□□□□□□□□□□□□□□
\end{reidai}

コメント