Re: [NTG-context] how to get thick and thin borders working in tables (ConTeXt)
On 12/10/2008 4:05 AM, Wolfgang Schuster wrote:
On Wed, Dec 10, 2008 at 7:07 AM, Lars Huttar
wrote: ... However, when I try to mix double frames with single frames, I'm having trouble. Here is what I tried, in order to get a cell with double frame on the left, and single frame everywhere else:
\startuseMPgraphic{table:frame:Lrtb} % left border is double draw leftboundary OverlayBox enlarged \the\dimexpr\linewidth*1\relax ; % outer frame draw leftboundary OverlayBox enlarged -\the\dimexpr\linewidth*2\relax ; % inner frame draw rightboundary OverlayBox enlarged -\the\dimexpr\linewidth/2\relax ; draw topboundary OverlayBox enlarged -\the\dimexpr\linewidth/2\relax ; draw bottomboundary OverlayBox enlarged -\the\dimexpr\linewidth/2\relax ; setbounds currentpicture to OverlayBox ; \stopuseMPgraphic
Now the graphic has double line on the left and a single line elsewhere. However, the lines are thicker than in the previous one... about twice as thick, too heavy for our requirements. And I can't tell why. This is true on all four sides. See http://www.huttar.net/lars-kathy/tmp/test-mp-tableframe.pdf, second table.
Also, on the side that has double lines, the double lines don't go all the way to the top and bottom (see same pdf, second table), so that the double line is not continuous across multiple rows.
Any suggestions?
The above graphic is used as follows... \start \setupTABLE[c][first][background={table:frame:Lrtb}] \getbuffer \stop
\startuseMPgraphic{table:frame:all} draw OverlayBox enlarged -0.2 ; setbounds currentpicture to OverlayBox ; \stopuseMPgraphic
\startuseMPgraphic{table:frame:leftdouble} draw OverlayBox leftenlarged 2 topenlarged -0.2 bottomenlarged -0.2 rightenlarged -0.2 ; setbounds currentpicture to OverlayBox ; \stopuseMPgraphic
\defineoverlay[table:frame:all][\useMPgraphic{table:frame:all}] \defineoverlay[table:frame:leftdouble][\useMPgraphic{table:frame:leftdouble}]
\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:all}] \setupTABLE[c][first][background={table:frame:all,table:frame:leftdouble}] \getbuffer \stop
\stoptext
Wolfgang
This fixes the problems I mentioned in my previous email. Thanks again for that! Unfortunately, when I generalize it, it takes us back to producing triple borders between adjacent cells. I think this is inevitable when overlaying a double frame (for certain sides) on top of a single frame for all sides, because a double side overlaid on a single side cannot be centered (or else the single line shows through separately from the double line). So my fix... which I'm posting here in hopes that someone may refine it, and for the benefit of others who may attempt similar things... is to center the double frames between the cells and avoid overlaying a double frame side over a single frame side. We center borders between the cells by using "enlarged" values -0.2 +/- k, i.e. center around -0.2. I'm not sure why -0.2 works better than zero, but it does... Doing this makes coincident border lines from adjacent cells look like ordinary single lines instead of being extra thick. We settled on k = 0.6 to get the desired distance between our double lines. Incidentally, I wish I knew how to put -0.2, 0.2-k, and -0.2+k into variables or something so that they could all be changed in one place, instead of hard-coded in many places. Maybe somebody can help me there. A cost of this single-overlay-per-cell approach is that we have to specify individually the 16 possible overlays (combinations of single and double edges) for any possible cell. But that's not too bad, as we only have to define them once. (In practice, we also had to define a couple of special cases where we needed some cells with open edges for a "faked rowspan". We haven't completely got those working yet.) An unexpected and potentially large benefit of this approach is that for each cell, we only generate one MPgraphic (apparently because we only use one overlay per cell), which should make the TeX run much faster, and avoid running over the maxnumMPgraphics limit. With the multiple-overlay-per-cell approach, we ended up using about 13,000 MPgraphics for our document, far beyond the default limit of 4000, and taking 15 minutes to run compared to 37 seconds for a similar document without the tables. Here is our working system... hope it's helpful to somebody: %%%% define MPgraphics for double-ruled tables % Lars Huttar, 2008-12-09 % Thanks to Wolfgang Schuster on NTG-list % Each MPgraph (and overlay) is named lrtb, with capitalized letters indicating which sides are double-ruled. % Adjacent cells must not define their common side differently, e.g. one cell define it single and one side % define it double; if that happens, it will appear triple (or a triple-thick line). % 0 double sides \startuseMPgraphic{table:frame:lrtb} % all single draw OverlayBox enlarged -0.2 ; setbounds currentpicture to OverlayBox ; \stopuseMPgraphic % 1 double side \startuseMPgraphic{table:frame:Lrtb} % left double draw OverlayBox leftenlarged 0.4 topenlarged -0.2 bottomenlarged -0.2 rightenlarged -0.2 ; draw OverlayBox leftenlarged -0.8 topenlarged -0.2 bottomenlarged -0.2 rightenlarged -0.2 ; setbounds currentpicture to OverlayBox ; \stopuseMPgraphic \startuseMPgraphic{table:frame:lRtb} % right double draw OverlayBox leftenlarged -0.2 topenlarged -0.2 bottomenlarged -0.2 rightenlarged -0.8 ; draw OverlayBox leftenlarged -0.2 topenlarged -0.2 bottomenlarged -0.2 rightenlarged 0.4 ; setbounds currentpicture to OverlayBox ; \stopuseMPgraphic \startuseMPgraphic{table:frame:lrTb} % top double draw OverlayBox leftenlarged -0.2 topenlarged 0.4 bottomenlarged -0.2 rightenlarged -0.2 ; draw OverlayBox leftenlarged -0.2 topenlarged -0.8 bottomenlarged -0.2 rightenlarged -0.2 ; setbounds currentpicture to OverlayBox ; \stopuseMPgraphic \startuseMPgraphic{table:frame:lrtB} % bottom double draw OverlayBox leftenlarged -0.2 topenlarged -0.2 bottomenlarged 0.4 rightenlarged -0.2 ; draw OverlayBox leftenlarged -0.2 topenlarged -0.2 bottomenlarged -0.8 rightenlarged -0.2 ; setbounds currentpicture to OverlayBox ; \stopuseMPgraphic % 2 double sides: adjacent \startuseMPgraphic{table:frame:LrTb} % left, top double draw OverlayBox leftenlarged -0.8 topenlarged -0.8 bottomenlarged -0.2 rightenlarged -0.2 ; draw OverlayBox leftenlarged 0.4 topenlarged 0.4 bottomenlarged -0.2 rightenlarged -0.2 ; setbounds currentpicture to OverlayBox ; \stopuseMPgraphic \startuseMPgraphic{table:frame:lRTb} % right, top double draw OverlayBox leftenlarged -0.2 topenlarged -0.8 bottomenlarged -0.2 rightenlarged -0.8 ; draw OverlayBox leftenlarged -0.2 topenlarged 0.4 bottomenlarged -0.2 rightenlarged 0.4 ; setbounds currentpicture to OverlayBox ; \stopuseMPgraphic \startuseMPgraphic{table:frame:LrtB} % left, bottom double draw OverlayBox leftenlarged -0.8 topenlarged -0.2 bottomenlarged -0.8 rightenlarged -0.2 ; draw OverlayBox leftenlarged 0.4 topenlarged -0.2 bottomenlarged 0.4 rightenlarged -0.2 ; setbounds currentpicture to OverlayBox ; \stopuseMPgraphic \startuseMPgraphic{table:frame:lRtB} % right, bottom double draw OverlayBox leftenlarged -0.2 topenlarged -0.2 bottomenlarged -0.8 rightenlarged -0.8 ; draw OverlayBox leftenlarged -0.2 topenlarged -0.2 bottomenlarged 0.4 rightenlarged 0.4 ; setbounds currentpicture to OverlayBox ; \stopuseMPgraphic % 2 double sides: opposite \startuseMPgraphic{table:frame:LRtb} % left, right double draw OverlayBox leftenlarged -0.8 topenlarged -0.2 bottomenlarged -0.2 rightenlarged -0.8 ; draw OverlayBox leftenlarged 0.4 topenlarged -0.2 bottomenlarged -0.2 rightenlarged 0.4 ; setbounds currentpicture to OverlayBox ; \stopuseMPgraphic \startuseMPgraphic{table:frame:lrTB} % top, bottom double draw OverlayBox leftenlarged -0.2 topenlarged -0.8 bottomenlarged -0.8 rightenlarged -0.2 ; draw OverlayBox leftenlarged -0.2 topenlarged 0.4 bottomenlarged 0.4 rightenlarged -0.2 ; setbounds currentpicture to OverlayBox ; \stopuseMPgraphic % 3 double sides \startuseMPgraphic{table:frame:LRTb} % left, top, right double draw OverlayBox leftenlarged -0.8 topenlarged -0.8 bottomenlarged -0.2 rightenlarged -0.8 ; draw OverlayBox leftenlarged 0.4 topenlarged 0.4 bottomenlarged -0.2 rightenlarged 0.4 ; setbounds currentpicture to OverlayBox ; \stopuseMPgraphic \startuseMPgraphic{table:frame:LRtB} % left, bottom, right double draw OverlayBox leftenlarged -0.8 topenlarged -0.2 bottomenlarged -0.8 rightenlarged -0.8 ; draw OverlayBox leftenlarged 0.4 topenlarged -0.2 bottomenlarged 0.4 rightenlarged 0.4 ; setbounds currentpicture to OverlayBox ; \stopuseMPgraphic \startuseMPgraphic{table:frame:LrTB} % left, top, bottom double draw OverlayBox leftenlarged -0.8 topenlarged -0.8 bottomenlarged -0.8 rightenlarged -0.2 ; draw OverlayBox leftenlarged 0.4 topenlarged 0.4 bottomenlarged 0.4 rightenlarged -0.2 ; setbounds currentpicture to OverlayBox ; \stopuseMPgraphic \startuseMPgraphic{table:frame:lRTB} % right, top, bottom double draw OverlayBox leftenlarged -0.2 topenlarged -0.8 bottomenlarged -0.8 rightenlarged -0.8 ; draw OverlayBox leftenlarged -0.2 topenlarged 0.4 bottomenlarged 0.4 rightenlarged 0.4 ; setbounds currentpicture to OverlayBox ; \stopuseMPgraphic % 4 double sides \startuseMPgraphic{table:frame:LRTB} % all double draw OverlayBox enlarged 0.4 ; draw OverlayBox enlarged -0.8 ; setbounds currentpicture to OverlayBox ; \stopuseMPgraphic % Special cases for 'fake' rowspans: three double sides and one open side % Note that these do not look quite right: the borders are too thick \startuseMPgraphic{table:frame:LRTO} % left, right, top double; bottom open % draw OverlayBox leftenlarged -0.8 topenlarged -0.8 bottomenlarged 0.0 rightenlarged -0.8 ; % draw OverlayBox leftenlarged 0.4 topenlarged 0.4 bottomenlarged 0.0 rightenlarged 0.4 ; draw leftboundary OverlayBox enlarged 0.4; draw rightboundary OverlayBox enlarged 0.4 ; draw topboundary OverlayBox enlarged 0.4; draw leftboundary OverlayBox enlarged -0.8; draw rightboundary OverlayBox enlarged -0.8 ; draw topboundary OverlayBox enlarged -0.8; setbounds currentpicture to OverlayBox ; \stopuseMPgraphic \startuseMPgraphic{table:frame:LROB} % left, right, bottom double; top open % draw OverlayBox leftenlarged -0.8 topenlarged 0.0 bottomenlarged -0.8 rightenlarged -0.8 ; % draw OverlayBox leftenlarged 0.4 topenlarged 0.0 bottomenlarged 0.4 rightenlarged 0.4 ; draw leftboundary OverlayBox enlarged 0.4; draw rightboundary OverlayBox enlarged 0.4 ; draw bottomboundary OverlayBox enlarged 0.4; draw leftboundary OverlayBox enlarged -0.8; draw rightboundary OverlayBox enlarged -0.8 ; draw bottomboundary OverlayBox enlarged -0.8; setbounds currentpicture to OverlayBox ; \stopuseMPgraphic %%%%% define overlays %%%%% % 0 double sides \defineoverlay[lrtb][\useMPgraphic{table:frame:lrtb}] % 1 double side \defineoverlay[Lrtb][\useMPgraphic{table:frame:Lrtb}] \defineoverlay[lRtb][\useMPgraphic{table:frame:lRtb}] \defineoverlay[lrTb][\useMPgraphic{table:frame:lrTb}] \defineoverlay[lrtB][\useMPgraphic{table:frame:lrtB}] % 2 double sides: adjacent \defineoverlay[LrTb][\useMPgraphic{table:frame:LrTb}] \defineoverlay[lRTb][\useMPgraphic{table:frame:lRTb}] \defineoverlay[LrtB][\useMPgraphic{table:frame:LrtB}] \defineoverlay[lRtB][\useMPgraphic{table:frame:lRtB}] % 2 double sides: opposite \defineoverlay[LRtb][\useMPgraphic{table:frame:LRtb}] \defineoverlay[lrTB][\useMPgraphic{table:frame:lrTB}] % 3 double sides \defineoverlay[LRTb][\useMPgraphic{table:frame:LRTb}] \defineoverlay[LRtB][\useMPgraphic{table:frame:LRtB}] \defineoverlay[lRTB][\useMPgraphic{table:frame:lRTB}] \defineoverlay[LrTB][\useMPgraphic{table:frame:LrTB}] % 4 double sides \defineoverlay[LRTB][\useMPgraphic{table:frame:LRTB}] % Special cases for 'fake' rowspans \defineoverlay[LRTO][\useMPgraphic{table:frame:LRTO}] \defineoverlay[LROB][\useMPgraphic{table:frame:LROB}]
participants (1)
-
Lars Huttar