On 12/9/2008 12:04 PM, Wolfgang Schuster wrote:

Am 09.12.2008 um 17:48 schrieb Lars Huttar:

Hello,

We are using ConTeXt (with XeTeX engine) to typeset some tables that
have borders (rules) between cells.

In the previous edition of the book (which was not done in TeX), some of
the lines between table cells were double, others single. This was done
to show grouping of columns and rows. We have been told that in TeX, or
at least in ConTeXt, you can't do double rules (we'd be happy to be
corrected on that point), so we have been trying to use thick and thin
lines to show grouping.

Thick or thin lines work fine if applied to whole tables or whole cells,
but when there are cells with thick rules on some sides and thin rules
on other sides, it gets confused.

For example, we tried
(a)    \setupTABLE[c][4][leftframe=on,rulethickness=0.5mm]
to set the left border of the fourth column to be thick. This worked.
But then if we use
(b)    \setupTABLE[c][4][rightframe=on,rulethickness=0.25mm]
to set the right border of the same column to be thin, it overrides the
thickness of both left and right borders, so setting (a) is lost.

In other words, we can't seem to get a given cell to have a thick border
on one side and a thin border on the other side. (Well, we could fake it
in some cases by setting rulethickness for an adjacent cell, but that
adjacent cell would then have to have thick borders on all sides.)

Does anybody know if it's possible to do this in ConTeXt? or in TeX?

Thanks for any ideas,
Lars

P.S.
Incidentally, if you set the bottom border of row 1 and the top border
of row 2 each to be thick, the result is additive: you get a
doubly-thick border.

I can provide a patch for ConTeXt to draw rules with different
thickness on each side but I can't assure it will work in the future.

With metapost you can nearly all types of borders you want.

\startuseMPgraphic{table:frame:double}
draw OverlayBox enlarged -\the\dimexpr\linewidth/2\relax ; % outer frame
draw OverlayBox enlarged -2pt ;                            % inner frame
setbounds currentpicture to OverlayBox ;
\stopuseMPgraphic

\startuseMPgraphic{table:frame:all}
draw OverlayBox enlarged -\the\dimexpr\linewidth/2\relax ;
setbounds currentpicture to OverlayBox ;
\stopuseMPgraphic

\startuseMPgraphic{table:frame:left}
linecap := squared ;
draw leftboundary OverlayBox withpen pencircle scaled 2 ;
setbounds currentpicture to OverlayBox ;
\stopuseMPgraphic

\startuseMPgraphic{table:frame:right}
linecap := squared ;
draw rightboundary OverlayBox withpen pencircle scaled 2 ;
setbounds currentpicture to OverlayBox ;
\stopuseMPgraphic

\startuseMPgraphic{table:frame:top}
linecap := squared ;
draw topboundary OverlayBox withpen pencircle scaled 2 ;
setbounds currentpicture to OverlayBox ;
\stopuseMPgraphic

\startuseMPgraphic{table:frame:bottom}
linecap := squared ;
draw bottomboundary OverlayBox withpen pencircle scaled 2 ;
setbounds currentpicture to OverlayBox ;
\stopuseMPgraphic

\defineoverlay[table:frame:double][\useMPgraphic{table:frame:double}]

\defineoverlay[table:frame:all]   [\useMPgraphic{table:frame:all}]
\defineoverlay[table:frame:left]  [\useMPgraphic{table:frame:left}]
\defineoverlay[table:frame:right] [\useMPgraphic{table:frame:right}]
\defineoverlay[table:frame:top]   [\useMPgraphic{table:frame:top}]
\defineoverlay[table:frame:bottom][\useMPgraphic{table:frame:bottom}]

\starttext

\startbuffer
\bTABLE[frame=off,offset=2ex]
    \bTR
        \bTD One   \eTD
        \bTD Two   \eTD
        \bTD Three \eTD
    \eTR
    \bTR
        \bTD Four  \eTD
        \bTD Five  \eTD
        \bTD Six   \eTD
    \eTR
    \bTR
        \bTD Seven \eTD
        \bTD Eight \eTD
        \bTD Nine  \eTD
    \eTR
\eTABLE
\stopbuffer

\start
\setupTABLE[background={table:frame:double}]
\getbuffer
\stop
\blank

\start
\setupTABLE[background={table:frame:all}]
\setupTABLE[c][first][background={table:frame:all,table:frame:left}]
\setupTABLE[c][last][background={table:frame:all,table:frame:right}]
\setupTABLE[r][first][background={table:frame:all,table:frame:top}]
\setupTABLE[r][last][background={table:frame:all,table:frame:bottom}]
\setupTABLE[first][first][background={table:frame:all,table:frame:left,table:frame:top}] \setupTABLE[last][first][background={table:frame:all,table:frame:right,table:frame:top}] \setupTABLE[first][last][background={table:frame:all,table:frame:left,table:frame:bottom}] \setupTABLE[last][last][background={table:frame:all,table:frame:right,table:frame:bottom}]
\getbuffer
\stop

\stoptext

Wolfgang





Thanks for the very detailed example!
We should be able to apply this to our document.

I'm copying it to the list because I think it would be valuable for posterity.

Thanks to Aditya too for the reply.

Regards,
Lars


--

Lars Huttar

___________________________________________________________________________________
If your question is of interest to others as well, please add an entry to the 
Wiki!

maillist : ntg-context@ntg.nl / http://www.ntg.nl/mailman/listinfo/ntg-context
webpage  : http://www.pragma-ade.nl / http://tex.aanhet.net
archive  : https://foundry.supelec.fr/projects/contextrev/
wiki     : http://contextgarden.net
___________________________________________________________________________________

Reply via email to