A `frequently asked question' is that for possibilites to produce
shaded boxes.

Since the answers usually (just as recently) point either to PostScript
\special's and PiCTeX it seems that a `simpler' and easier to use version
is not readily available --- though I did not check this.

A small and simple approach to shaded boxes is the use of a special font
providing shaded rectangles, and some macros which automatically compose the
desired box from these characters.

Since, of course, the finest shading can be achieved by using single pixels
for the pattern, the best shading pattern is *device dependent*.
Furthermore, one generally defined shading pattern would imply the danger,
that - because of rounding errors - at the boundaries (between two of the
characters) `lines' would occur, and that the pattern would not look completely
uniform.  Consequently, since different fonts are to be used for different
printers, the dvi file is *device dependent* in this sense, too, though the
code - both for the macros and for the metafont description - is device
independent.

%%% SHADE.rdm
%%% ReadMe file for SHADE.mf and SHADE.tex/sty
%%% -------------------------------------------------------------------------
%%% Version 1 - March 21, 1993
%%% Peter Schmitt, Institute of Mathematics, University of Vienna
%%%                Strudlhofgasse 4, A-1090 Wien, Austria
%%%         e-mail A8131DAL@helios.edvz.univie.ac.at
%%%                schmitt@awirap.bitnet
%%% -------------------------------------------------------------------------

\magnification=\magstep1
\parindent0pt \parskip 3pt
\input shade.tex

{\tt SHADE} is a \TeX\ tool that can be used to produce shaded boxes
neither using PostScript nor Pic\TeX.

% The syntax is:

\shade{This text will appear on a shaded background!}

The shading macro first packs its argument into an hbox.

\shade{\vbox{\hsize 5cm
       \leftskip=0pt plus 1fil\rightskip=0pt plus 1fil
       \parfillskip=0pt
       Then it measures the dimensions of this box and produces a
       shaded box slightly larger then this box, using the font
       shade produced by {\tt shade.mf}. Finally it
       puts the box back and overlays it with the shaded box.
       \par
      }}

Since the best shading is achieved at the lowest possible resolution,
the font \shade{SHADE} is {\bf not device independent} --- it uses
the printer resolution. Therefore the .dvi file is
{\bf not device independent}, either.
The macro code, however, {\bf is device independent}.
This method was used because otherwise shading, and in particular
the boundaries between two shading characters, could turn out to be not
completely uniform.
For the same reason, the font should only be used at its true size.

The {\tt shade} package consists of three files:
    {\tt shade.mf,           % MetaFont file for shading font
         shade.tex,          % macro file be used with LaTeX, too
         shade.rdm.          % this file
                            % it can be processed by TeX as a demo file
       }
It was tested with a HP Laserjet II plus.

\bye

%%% end of SHADE.rdm %%%
%%% SHADE.tex or SHADE.sty
%%% Macros for use with font SHADE
%%% -------------------------------------------------------------------------
%%% Version 1 - March 21, 1993
%%% Peter Schmitt, Institute of Mathematics, University of Vienna
%%%                Strudlhofgasse 4, A-1090 Wien, Austria
%%%         e-mail A8131DAL@helios.edvz.univie.ac.at
%%%                schmitt@awirap.bitnet
%%% -------------------------------------------------------------------------

\catcode`\:11

\font\grey:=shade at 10truept

\newbox\shade:box
\newdimen\fill:boundary
    \setbox0=\hbox{\grey:\char0\relax}\fill:boundary=\ht0
\newcount\fill:level \newdimen\fill:size \newdimen\fill:goal

\long\def\shade#1{\leavevmode
             \setbox\shade:box=\hbox{#1}%
             \def\shade:column{}\def\shade:row{}%
             \fill:level=5 \fill:goal=\wd\shade:box
                \advance\fill:goal by 2\fill:boundary
             \let\shade:v\relax \Fill: \shade:row\shade:v
             \fill:level=5
             \fill:goal=\ht\shade:box \advance\fill:goal by \dp\shade:box
                \advance\fill:goal by 2\fill:boundary
             \let\shade:h\relax \Fill: \shade:column\shade:h
             \fill:goal=\ht\shade:box \advance\fill:goal by \dp\shade:box
             \setbox0=\vbox to\fill:goal{\offinterlineskip\grey:
                 \def\shade:h##1{%
                     \def\shade:v####1{\char####1##1\relax}%
                     \hbox to \wd\shade:box{\hss\shade:row\hss}}
                 \vss \shade:column \vss
                 }\ht0=\ht\shade:box \dp0=\dp\shade:box
             \rlap{\box0}\box\shade:box
            }
\def\Fill: {\setbox0=\hbox{\grey:\char\fill:level\relax}\fill:size=\ht0 
            \fill:}
\def\fill: #1#2{%
    \ifdim \fill:size>\fill:goal
           \advance\fill:level by-1
            \ifnum \fill:level>-1 \let \fill:next = \Fill:
                            \else \let \fill:next = \fill:stop \fi
     \else \edef#1{#1#2\the\fill:level}\advance\fill:goal by -\fill:size
           \let \fill:next = \fill:
      \fi \fill:next #1#2}
\def\fill:stop#1#2{}

\endinput

%%% end of SHADE.tex/sty %%%
%%% SHADE.mf
%%% Font SHADE for use with SHADE.TEX/STY
%%% -------------------------------------------------------------------------
%%% Version 1 - March 21, 1993
%%% Peter Schmitt, Institute of Mathematics, University of Vienna
%%%                Strudlhofgasse 4, A-1090 Wien, Austria
%%%         e-mail A8131DAL@helios.edvz.univie.ac.at
%%%                schmitt@awirap.bitnet
%%% -------------------------------------------------------------------------

mode_setup;
magnification=1000;
font_identifier "Shade";
font_coding_scheme "Shade Style Matrix";
font_size 10pt#;

%%% a = side of smallest shaded square (3x3 pixels)
    a#:=(3/pixels_per_inch)*1in#;
    define_pixels(a);
%%% greybox produces a shaded rectangle:
%%%     height 2^H*a
%%%      width 2^W*a
%%%                                     ... 
%%% it consists of WxH `unit squares':  .*.
%%%                                     ... 
%%% its character code is 10*W + H
%%%     i.e., the first digit corresponds to the width and
%%%           the second digit corresponds to the height of the character

def greybox (expr H, W) =
    HH:=2**H; WW:=2**W;
    beginchar(10*W+H, WW*a#, HH*a#, 0);
       pickup pencircle scaled 1;
       fill (1,1)--(1,3*HH)--(3*WW,3*HH)--(3*WW,1)--cycle;
       pickup pencircle scaled 2;
       for x = 0 step 3 until 3*HH : undraw (0,x)--(3*WW,x); endfor;
       for x = 0 step 3 until 3*WW : undraw (x,0)--(x,3*HH); endfor;
       endchar;
    enddef;

%%% produce characters for H and W from 0 to 5

for ww = 0 upto 5 :
    for hh = 0 upto 5 : greybox (hh,ww); endfor;
    endfor;

bye;

%%% end of SHADE.mf %%%
