On Sep 3, 2012, at 9:39 PM, Aditya Mahajan wrote:
> On Mon, 3 Sep 2012, Michael Rogers wrote:
>
>> On Sep 2, 2012, at 12:24 PM, Aditya Mahajan wrote:
>>
>>> Is it possible to stretch the widths of each column in natural TABLEs, so
>>> that the widths are in a certain propotion? For example, suppose I have a
>>> table with three columns and I want to set the width of the first column to
>>> a fixed amount, and split the remaining space between columns two and three
>>> in a 1:2 ratio.
>>>
>
>> If you know the width of the first column and total width, then you can use
>> arithmetic, as in the example below. But perhaps this already occurred to
>> you, and you were wondering if the widths and stretching can be handled
>> automatically -- the short answer is I don't know.
>>
>> \starttext
>> \setupTABLE[c][1][width={2cm}]
>> \setupTABLE[c][2][width={\dimexpr(\textwidth-2cm)/3\relax}]
>> \setupTABLE[c][3][width={\dimexpr(\textwidth-2cm)* 2 / 3\relax}]
>> \startTABLE
>> \NC One \NC Two \NC Three \NC\NR
>> \NC A \NC B \NC C \NC\NR
>> \stopTABLE
>> \stoptext
>
> Apart from being hard to maintain, this works well if I know the width of a
> cell in advance. But most of the time I want something the width of the fixed
> column to be determined using width=fit option, so I cannot precompute the
> width of other columns.
>
> Aditya
That's what I was afraid. It's just I had the same problem last week, and a
deadline made me settle for the ad hoc approach. You made me curious enough to
go look at the source, and one can hack it to work. See below, if interested.
Not optimal, and might break in future.
By the way, what you posted in your other message,
> \setupTABLE[c][1][width=fit]
> \setupTABLE[c][2][width=0.33\hsize]
> \setupTABLE[c][3][width=0.66\hsize]
extends into the right margin by the width of the first column or thereabouts,
for me.
Michael
The hack:
\unprotect
% adapted from \tabl_ntb_stretch_widths, tabl-ntb.mkiv, ll. 1296f
\def\tabl_ntb_mystretch_widths % more variants, e.g. a max to \dimend
{\ifcase\c_tabl_ntb_maximum_col\else % else division by zero
\!!dimend\zeropoint
\!!dimene\hsize
\dorecurse\c_tabl_ntb_maximum_col
{\advance\!!dimend\dimexpr\tabl_ntb_get_wid\recurselevel+\naturaltablelocalparameter\c!columndistance\relax
\advance\!!dimene-\tabl_ntb_get_dis\recurselevel}%
\advance\!!dimend\dimexpr-\naturaltablelocalparameter\c!columndistance+\naturaltablelocalparameter\c!leftmargindistance+\naturaltablelocalparameter\c!rightmargindistance\relax
% distribute width (stretch)
\ifdim\!!dimend<\!!dimene
\advance\!!dimend-\!!dimene
\!!dimend-\!!dimend
% \divide\!!dimend\c_tabl_ntb_maximum_col
% \dorecurse\c_tabl_ntb_maximum_col
%
{\tabl_ntb_set_wid\recurselevel{\the\dimexpr\tabl_ntb_get_wid\recurselevel+\!!dimend\relax}}%
\divide\!!dimend3 %%% divide remainder into three equal parts
{\tabl_ntb_set_wid2{\the\dimexpr\tabl_ntb_get_wid2+\!!dimend\relax}}%%%
add one part to 2nd column
{\tabl_ntb_set_wid3{\the\dimexpr\tabl_ntb_get_wid3+\!!dimend *
2\relax}}%%% add two parts to 3rd column
\fi
\fi}
\def\usemystretch{\let\tabl_ntb_stretch_widths\tabl_ntb_mystretch_widths}
\protect
\starttext
\startsetups mystretch
\usemystretch
\setupTABLE[option=stretch]
\stopsetups
\startTABLE[setups=mystretch]
\NC One \NC Two \NC Three \NC\NR
\NC A \NC B \NC C \NC\NR
\stopTABLE
\stoptext
BTW, the above could be adapted to a key of the form stretch={n1,n2,...} (e.g.
stretch={0,1,2}) which would divide the remaining proportionally. Maybe not
worth doing, though...maybe harder than I think -- the table stuff is
complicated, and I'm assuming that since it worked once, I haven't messed
anything up.
________________________________
This e-mail message (including any attachments) is for the sole use of
the intended recipient(s) and may contain confidential and privileged
information. If the reader of this message is not the intended
recipient, you are hereby notified that any dissemination, distribution
or copying of this message (including any attachments) is strictly
prohibited.
If you have received this message in error, please contact
the sender by reply e-mail message and destroy all copies of the
original message (including attachments).
___________________________________________________________________________________
If your question is of interest to others as well, please add an entry to the
Wiki!
maillist : [email protected] / http://www.ntg.nl/mailman/listinfo/ntg-context
webpage : http://www.pragma-ade.nl / http://tex.aanhet.net
archive : http://foundry.supelec.fr/projects/contextrev/
wiki : http://contextgarden.net
___________________________________________________________________________________