diff options
Diffstat (limited to 'doc/context/sources/general/manuals/ontarget/ontarget-makesnosense.tex')
-rw-r--r-- | doc/context/sources/general/manuals/ontarget/ontarget-makesnosense.tex | 213 |
1 files changed, 213 insertions, 0 deletions
diff --git a/doc/context/sources/general/manuals/ontarget/ontarget-makesnosense.tex b/doc/context/sources/general/manuals/ontarget/ontarget-makesnosense.tex new file mode 100644 index 000000000..3a9e45e5e --- /dev/null +++ b/doc/context/sources/general/manuals/ontarget/ontarget-makesnosense.tex @@ -0,0 +1,213 @@ +% language=us runpath=texruns:manuals/ontarget + +\startcomponent ontarget-makesnosense + +\environment ontarget-style + +\startchapter[title={Not all makes sense}] + +The development of \CONTEXT\ is to a large extend driven by users with a wide +variety of background and usage. I can safely say that much time spent on +\CONTEXT\ qualifies as hobby (or maybe even more by curiosity). Of course I do +use it myself but personally I never make advanced documents. I'm not a writer, +nor an artist, nor a typesetter. I do like challenges so that's why we get +mechanisms that can do tricky things and some stay sort of hidden because the +practical usage is limited, although you will be surprised to see what users find +in the source and use anyway. My colleague uses \CONTEXT\ for large scale, mostly +complex and demanding \XML\ documents where one source is rendered in different +ways with different parts used. Many features in \CONTEXT\ relate to workflows. + +I like to visualize things so that's part of the development cycle. I never start +from some \quote {typographical} point of view, if only because in my experience +much design is arbitrary and personal. The output should look okay on the +average, and on reasonable simple documents there should be no need for manual +intervention. I am quite willing to accept an occasional less optimal looking +page and don't loose sleep over it. A next time, when a sentence gets added, it +might be better and the problem can be moved further down the pages. Also, given +what one runs into nowadays the average job that \TEX\ does is pretty good (but +users can of course mess up). It is boundary conditions that determine in what +direction a style or solution goes. The more abstract one argues about +typesetting and possible solutions, the less interested I often become simply +because there are no perfect solutions for every case. There are always those +last few \percent\ points that need manual intervention or some trickery and most +users get that. It is also what makes using \TEX\ fun. + +As mentioned, the \TEX\ engine does a pretty good job on average but that didn't +prevent me from extending it: the mix of \TEX, \METAPOST\ and \LUA\ is even more +fun. But what is the development agenda there? Again, it is very much driven by +what users want me to solve, but there's also the curiosity element. A recent +example of extending is the math sub system. It was already made more +configurable and some features where added but now it is really flexible. This +was doable because the heuristics in the engine are clear. It was could be done +because I had a dedicated partner in this journey. \footnote {In another chapter +I summarize what Mikael Sundqvist and I did in this context.} Other parts are +more difficult but have nevertheless been extended, to mention a few: alignments, +par building and page building. However the last two use some heuristics that are +hard to make more flexible. For instance the badness calculation combined with +the loop that tries to find breakpoints is already quite good and the somewhat +special values involved in the calculations have been optimized stepwise by Don +Knuth during the development of \TEX. + +Does that mean that one cannot add some options to influence that tuning? For sure +one can. The source has this comment: + +\startquotation + When looking for optimal line breaks, \TEX\ creates a \quote {break node} for + each break that is {\em feasible}, in the sense that there is a way to end a line + at the given place without requiring any line to stretch more than a given + tolerance. A break node is characterized by three things: the position of the + break (which is a pointer to a \type {glue_node}, \type {math_node}, \type + {penalty_node}, or \type {disc_node}); the ordinal number of the line that will + follow this breakpoint; and the fitness classification of the line that has just + ended, i.e., \type {tight_fit}, \type {decent_fit}, \type {loose_fit}, or \type + {very_loose_fit}. +\stopquotation + +The book {\TEX\ by Topic} (by Eijkhout) gives a good explanation of the way lines +are broken so there is no need to go into detail here. The code involved is not +that trivial anyway. The criteria for deciding what is bad are as follows: + +\starttabulate[|c|c|c|] +\FL +\BC verdict \BC effect \BC badness \NC \NR +\ML +\NC very loose \NC stretch \NC >= 100 \NC \NR +\NC loose \NC stretch \NC >= 13 \NC \NR +\NC decent \NC \NC <= 12 \NC \NR +\NC tight \NC shrink \NC >= 13 \NC \NR +\LL +\stoptabulate + +When the difference between two lines is more than one, they are considered to be +visually incompatible. Then, if the badness of any line exceeds \type +{pretolerance} a second pass is triggered, When \type {pretolerance} is negative +the first pass is skipped. When the badness of any line exceeds \type {tolerance} +a third pass is triggered and \type {emergencystretch} is used to make things fit. + +Where in traditional \TEX\ a lot of parsing, hyphenation, font handling and par +building is combined, in \LUAMETATEX\ we always work with completely hyphenated +and font readied lists. In traditional \TEX\ the first pass works on +the original non|-|hyphenated lists. + +In the source there is an old note that one day I will play with a plugged in +badness calculation but it also says that there might be a performance impact as +well as all kind of unforeseen side effects because \TEX\ makes sure that the +heuristics lead to values that don't result in overflow and such. + +Another note concerns more fitness values. Doing that will increase the runtime a +little but on a modern machine that is not really an issue. Shortly after I +upgraded my laptop to a somewhat newer one I decided to play with this and +therefore any performance hit would go unnoticed anyway. The following snippet +from the source shows the idea: + +\starttyping +typedef enum fitness_value { + very_loose_fit, /*tex lines stretching more than their stretchability */ + loose_fit, /*tex lines stretching 0.5 to 1.0 of their stretchability */ + semi_loose_fit, + decent_fit, /*tex for all other lines */ + semi_tight_fit, + tight_fit, /*tex lines shrinking 0.5 to 1.0 of their shrinkability */ + n_of_finess_values +} fitness_value; +\stoptyping + +This means that when we loop over \type {very_loose_fit} upto \type {tight_fit} +we have two more classes to take into account: the semi ones. Playing with that +and associating them with magic numbers quickly learned that we enter the area of +\quote {random improvements}. You can render variants and because some will look +better and others worse one can argue for any case. And as usual, once a user +(unaware of what we are doing) looks at it, things like successive hyphens, wider +spaces, rivers and such are seen as the main difference. Of course spacing is the +direct result of this kind of messing, but because the effects are actually +mostly noticeable on non|-|justified texts it then is the end|-|of|-|line spacing +that influences the verdict. \footnote {When \HZ\ showed up in \PDFTEX\ we did +experiments with random samples of its usage and \TEX ies at user group meetings +and the results were such that one could only draw the conclusion that on the +average a user has no clue if something is good or bad for what reason. The +strong emphasis in the \TEX\ community on hyphenation makes that an eye|-|catching +criterium. So having two in a successive lines even when there is really no +better solution is what draws the attention and users then tend to think that +what a survey is about is \quotation {The quality of hyphenation related to +breaking paragraphs into lines.}} + +In the end this kind of extensions make little sense. One can of course play +science and introduce all kind of imaginary cases where it might work but that is +why I started this summary by explaining what drives developments: users and +constraints. Playing science for the sake of it is pseudo science. And, as with +much science related to typesetting (probably with the exception of Don's work) +most has therefore little practical value. + +So, do we keep this feature or not? We actually do, if only to be able to +demonstrate the fuzziness of this. We have an undocumented magic parameter: + +\starttyping +\linebreakcriterium"0C0C0C63 +\stoptyping + +Actually the value is zero but when one of the four byte pairs is zero it will +default to \type {"0C} (\number"0C) or \type {"63} (\number"63). The values +concern \type {semitight}, \type {decent}, \type {semiloose}, and \type {loose}. +After some trial and error I got to the examples on the next two pages. You need +to zoom in to see the differences (the black one is the original). In setting used are: + +\starttabulate[|c|c|l|] +\BC \BC \type {\hsize} \BC \type {\setupalign} \NC \NR +\NC 1 \NC 12em \NC normal, stretch, tolerant \NC \NR +\NC 2 \NC 18em \NC flushleft \NC \NR +\stoptabulate + +As mentioned, one can look at specific expected properties and draw conclusions +but when \TEX\ cannot find a good solution using its default, it is unlikely that +alternative settings help you out, unless you do that on a per|-|paragraph basis. + +% run in default font and layout + +\startbuffer[lbc] +\def\TestA#1#2#3% + {\switchtobodyfont[10pt]% + \ruledvtop + {\hsize#1\relax + \begingroup + \setupalign[#2]% + \linebreakcriterium"#3\relax + \samplefile{tufte}\par + \endgroup + \hpack to \hsize{\hss\infofont\setstrut\strut\black\string\linebreakcriterium="#3\hss}}} + +\def\TestB#1#2% + {\startTEXpage[offset=4dk] + \hbox \bgroup + {\black \TestA{#1}{#2}{00000000}}\kern1ex + {\red \TestA{#1}{#2}{00001C00}}\kern1ex + {\green \TestA{#1}{#2}{00002C00}}\kern1ex + {\blue \TestA{#1}{#2}{00003C00}}\kern1ex + {\cyan \TestA{#1}{#2}{00004C00}}\kern1ex + {\magenta\TestA{#1}{#2}{00005C00}} + \egroup + \vskip1ex + \hbox \bgroup + \startoverlay {\TestA{#1}{#2}{00000000}} \stopoverlay \kern1ex + \startoverlay {\TestA{#1}{#2}{00000000}} {\red \TestA{#1}{#2}{00001C00}} \stopoverlay \kern1ex + \startoverlay {\TestA{#1}{#2}{00000000}} {\green \TestA{#1}{#2}{00002C00}} \stopoverlay \kern1ex + \startoverlay {\TestA{#1}{#2}{00000000}} {\blue \TestA{#1}{#2}{00003C00}} \stopoverlay \kern1ex + \startoverlay {\TestA{#1}{#2}{00000000}} {\cyan \TestA{#1}{#2}{00004C00}} \stopoverlay \kern1ex + \startoverlay {\TestA{#1}{#2}{00000000}} {\magenta\TestA{#1}{#2}{00005C00}} \stopoverlay + \egroup + \stopTEXpage} + +\TestB{12em}{normal,stretch,tolerant} +\TestB{18em}{flushleft} +\stopbuffer + +\startpagemakeup[pagestate=start,doublesided=no,page=no] + \centerbox {\typesetbuffer[lbc][page=1,frame=on,height=\dimexpr\textwidth-2ex\relax,orientation=90]} +\stoppagemakeup +\startpagemakeup[pagestate=start,doublesided=no,page=no] + \centerbox {\typesetbuffer[lbc][page=2,frame=on,width=\dimexpr\textheight-2ex\relax,orientation=90]} +\stoppagemakeup + +\stopchapter + +\stopcomponent + |