On Mon, Jun 9, 2008 at 3:44 PM, Wolfgang Schuster
On Mon, Jun 9, 2008 at 3:06 AM, Uwe Koloska
wrote: Hello,
for a CD-Cover I have to fit a given text into a fixed box. I have tried to achieve this with the help of mag-0010 "Good looking shapes" but was not successful :-(
Can you help me with this?
The conditions: - the text is of fixed length - the area is of given size (has a given ratio) - the text has to fit completely inside this area - the last line must be justified, too - the fontsize of the text is the variable that can be changed - I have the current minimal context installation
and as an addition: - if possible the words should not be hyphenated at all or hyphenated at an arbitrary character without a hyphenation mark (the text consists of names)
A possible algorithm (similar to the one from mag-0010) 1 start with a small box with the given ratio 2 fill the text into the box 3 if all text fits in with a small penalty we are ready 4 make the box a bit larger 5 goto 2
Unfortunately, I'm not able to understand the code from the mag nor can I code the algorithm in context ...
I would appreciate any input on this problem!
Thank you Uwe Koloska
Not perfect but you could use it as a start. I used ruledvbox only to take a look at the boxsize. There is a parameter to disable the indenting for the last line but I don't know it's name without looking into a TeX book.
\startbuffer[cover] \input ward \stopbuffer
\definetwopasslist{cover}
\newbox\cover \newdimen\coverheight \coverheight= 7cm \newdimen\coverwidth \coverwidth = 7cm \newdimen\coverfont \coverfont =12pt \newdimen\fontstep \fontstep = 1pt
\starttext
\definefont[Cover][Sans at \the\coverfont]
\gettwopassdata{cover} \iftwopassdatafound \coverfont\twopassdata \definefont[Cover][Sans at \the\coverfont] \fi
\setbox\cover\ruledvbox {\hsize\coverwidth \Cover\setupinterlinespace \setupalign[nothyphenated] \emergencystretch\maxdimen \getbuffer[cover]}
\ifdim\ht\cover<\coverheight \advance\coverfont\fontstep \savetwopassdata{cover}{1}{\the\coverfont} \else \advance\coverfont-\fontstep \savetwopassdata{cover}{1}{\the\coverfont} \fi
\ruledvbox to 7cm{\box\cover}
\stoptext
Another version, this did work without multiple passes and is faster. \newbox\cover \newdimen\coverheight \coverheight= 7cm \newdimen\coverwidth \coverwidth = 7cm \newdimen\coverfont \coverfont =12pt \newdimen\fontstep \fontstep = 1pt \def\startcover {\dostartbuffer[cover][startcover][stopcover]} \def\stopcover {\setups[cover:place]} \def\boxsize {\setbox\cover\vbox {\hsize\coverwidth \definedfont[Serif at \the\coverfont]\setupinterlinespace \setupalign[nothyphenated] \emergencystretch\maxdimen \getbuffer[cover]}} \def\covertext {\boxsize\doloop {\boxsize \ifdim\ht\cover>\coverheight \global\advance\coverfont-\fontstep \exitloop \else \global\advance\coverfont\fontstep \fi}} \startsetups[cover:place] \covertext \boxsize \ruledvbox to\coverheight{\box\cover} \stopsetups \starttext \startcover \strut\input ward \stopcover \stoptext Wolfgang