TeXの記憶(12) — \fbox (\fclorbox) で作る囲み

前回は\vruleと\hruleで囲みを作ってみましたが、単純な四角の囲みを作るなら\fboxかを使うのがいちばん簡単です。色を付けるなら\fcolorboxが使えます。\fcolorboxならワクの色も囲み内の色も指定できます。もちろん囲みの中の色も指定できますが、ちょっと問題があります(それは最後に)。

\Hruleと\Vruleで作った囲みと考え方はだいたい同じです。

中身のbox=\vbox{
「上のアキ」
「中身」
「下のアキ」}

というように作ってから

\fboxsepをゼロにして、

\fcolorbox{「左のアキ」「中身のbox」「右のアキ」」

として左右のアキも加えています。

ワクの外側の上下のアキは、ちょっと適当です。

マクロ名:\BoxSS
引数は
#1 左右のアキ
#2 ワクの幅
#3 ワクの色
#4 中身の色
#5 上のアキ(ワク内)
#6 下のアキ(ワク内)
#7 上のアキ(ワク外)
#8 下のアキ(ワク外)

としました。

これで作ったのが下の画像です。

test

よく見ると、罫線の上が細くなっています。おそらく、外側の罫線の描画をしてから内側を描画するために、罫線の上まですこしはみ出して描画されているのではないかと思います。

これに対処するのは、先に中の色を描画して、その後でワクを描画すればいいんだろうけど、fcolorboxをカスタマイズするよりもpstricksを使うほうが簡単そうです。

今回のソースです。

% 本文の入る箱
\newbox\Box@box
% ワクの幅
\newdimen\Box@rule@wd
% ワクから中身までの水平距離
\newdimen\Box@Hsep
%ワク上部から中身まで / ワク下部から中身まで
%    \begin{macrocode}
\newdimen\Box@VTsep
\newdimen\Box@VBsep
%上の行からワク上部まで / ワク下部から下の行まで
\newdimen\Box@OVTsep
\newdimen\Box@OVBsep
% 中身の高さと深さ
\newdimen\Box@ht
\newdimen\Box@wd
% その他の長さ
\newdimen\keephsize
\newdimen\keeplinewidth
\newdimen\Box@tempA

\def\BoxSS#1#2#3#4#5#6#7#8{\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
  % 箱の全体の幅から,アキと罫線の幅を引く
  \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
  % 上のアキ(ワク内)
  \vskip\Box@VTsep}
\def\endBoxSS{%
  % 下のアキ(ワク内)
  \vskip\Box@VBsep
  \egroup
  % 値の復元
  \hsize=\keephsize
  \linewidth=\keeplinewidth
  % 箱の設定
  \fboxsep=\z@ \fboxrule=\Box@rule@wd
  \Box@tempA=\Box@Hsep
  \fcolorbox{\Box@rulecolor}{\Box@color}{%
      \hskip\Box@tempA\box\Box@box\hskip\Box@tempA}%
    \Box@tempA=\Box@OVBsep\advance\Box@tempA -1.1\Cht
    \vspace{\Box@tempA}}

...実際の使用...

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

\def\waku{\BoxSS{1zw}{.3mm}{iro1}{iro2}{2mm}{2mm}{1.5mm}{2mm}}
\def\endwaku{\endBoxSS}

\begin{document}

\begin{waku}
□□□□□□□□□□□□□□□□
□□□□□□□□□□□□□□□□
□□□□□□□□□□□□□□□□
□□□□□□□□□□□□□□□□

○○○○○○○○○○○○○○○○
○○○○○○○○○○○○○○○○
\end{waku}

コメント

  1. […] 数式全体なら、以前の(12) — \fbox (\fclorbox) で作る囲みの方法でできるのですが、複数の行をalignで揃えていて、ある1行だけ網掛けとなると、ちょっと考えてしまいます。 […]