TeXの記憶(11) — \hruleと\vruleで作る囲み

TeXの囲みを\hruleと\vruleを使って作ってみました。

img

作り方は、中身の入ったboxを作り、\hruleと\vruleで囲むだけです。
このときに考えるのは、囲みの幅、上下左右のアキ、囲みの色、などです。

ここでは、囲みの幅を\linewidthにしました。\linewidthは、通常は\textwidthに、\enumerateなどの環境内では\linewidth <= \textwidthになっています。

\linewidth以外の値は変数にしてできるだけ流用できるようにしてみました。変数の数は7個です。

マクロの名前はとりあえず「BoxSSS」にしました。

\def\BoxSSS#1#2#3#4#5#6#7

変数の意味は次のようになっています。
#1 左右のアキ
#2 ワクの幅
#3 ワクの色
#4 上のアキ(ワク内)
#5 下のアキ(ワク内)
#6 上のアキ(ワク外)
#7 下のアキ(ワク外)

次のように使います。

\BoxSSS{1zw}{.6mm}{red}{.5mm}{.5mm}{1.5mm}{2mm}
...
\endBoxSSS
  1. 中身のbox(Box@box)の幅 = \linewidth – (ワクの罫線の幅 + 左右のアキ)となるように計算して、Box@boxを\vboxとして作成
  2. 中身は、\bgroupから\egroupまでの間で取得
  3. 中身をboxができたあとは、上下左右に罫線を追加

罫線の追加は

上下罫線を先に、
vbox=
\hrule
アキ
「中身のbox」
アキ
\hrule

となるように重ねます。

左右の罫線を加えるために、vboxを、こんどはhboxで囲って

hbox=
\vrule アキ「いま作ったvbox」アキ \vrule

となるように横に並べています。

このマクロだと変数が多すぎるので、実際に使うときには
もうひとつマクロを作って簡略化して使っています。

\def\waku{\BoxSSS{1zw}{.6mm}{red}{.5mm}{.5mm}{1.5mm}{2mm}}
\def\endwaku{\endBoxSSS}

\begin{waku}
...
\end{waku}

マクロは次のようになりました。

% 準備する変数など
% 中身を入れる箱
\newbox\Box@box
% ワクの幅
\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

\def\BoxSSS#1#2#3#4#5#6#7{\par\vskip#6
  % 引数の設定
  \Box@Hsep=#1
  \Box@rule@wd=#2
  \def\Box@rulecolor{#3}%
  \Box@VTsep=.2mm \advance\Box@VTsep #4
  \Box@VBsep=.3mm \advance\Box@VBsep #5
  \Box@OVBsep=#7
  % 箱の全体の幅から,アキと罫線の幅を引く
  \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\endBoxSSS{%
  % 下のアキ(ワク内)
  \vskip\Box@VBsep
  \egroup
  % 値の復元
  \hsize=\keephsize
  \linewidth=\keeplinewidth
  % 箱の設定
  \hbox{{\color{\Box@rulecolor}\vrule\@width\Box@rule@wd}%
    \vbox{{\color{\Box@rulecolor}\hrule\@height\Box@rule@wd}%
      \vskip\Box@VTsep
      \hbox{\hskip\Box@Hsep
        \box\Box@box
        \hskip\Box@Hsep}%
      \vskip\Box@VBsep
      {\color{\Box@rulecolor}\hrule\@height\Box@rule@wd}}%
    {\color{\Box@rulecolor}\vrule\@width\Box@rule@wd}}%
  \nointerlineskip
  \vskip\Box@OVBsep}

\def\waku{\BoxSSS{1zw}{.6mm}{red}{.5mm}{.5mm}{1.5mm}{2mm}}
\def\endwaku{\endBoxSSS}

コメント

  1. […] の罫線に付けられた名前です。これをLaTeXで\hruleと\vruleで作ってみました。TeXの記憶(11)—hruleとvruleで作る囲みで作った\hruleと\vruleを使った囲みの周りをもう一度囲むだけと言ってしま […]