diff options
Diffstat (limited to 'doc/context/sources/general/manuals/spacing/spacing-spaces.tex')
-rw-r--r-- | doc/context/sources/general/manuals/spacing/spacing-spaces.tex | 276 |
1 files changed, 276 insertions, 0 deletions
diff --git a/doc/context/sources/general/manuals/spacing/spacing-spaces.tex b/doc/context/sources/general/manuals/spacing/spacing-spaces.tex new file mode 100644 index 000000000..0d7f64379 --- /dev/null +++ b/doc/context/sources/general/manuals/spacing/spacing-spaces.tex @@ -0,0 +1,276 @@ +% language=uk + +\environment spacing-style + +\startcomponent spacing-periods + +\startchapter[title=Spacing] + +\startsection[title=Spaces] + +When \TEX\ reads its input and transforms content it into a node list spaces are +turned into glue nodes of subtype \quote {spaceskip} or \quote {xspaceskip}. In +pseudo code, this is what happens: + +\starttyping +if spacefactor >= 2000 and xspaceskip ~= 0 then + space = xspaceskip_space + stretch = xspaceskip_stretch + shrink = xspaceskip_shrink + subtype = xspaceskip +else + if spaceskip == 0 then + space = font_space + stretch = font_stretch + shrink = font_shrink + else + space = spaceskip_space + stretch = spaceskip_stretch + shrink = spaceskip_shrink + end + if space_factor >= 2000 + space = space + font_extraspace + end + stretch = stretch * space_factor + shrink = shrink * space_factor + subtype = spaceskip +end +insert_glue(space,stretch,shrink,subtype) +\stoptyping + +We demonstrate the effects in a few examples. You can use \typ {\showmakeup [space]} to +visualize spaces. + +\def\ShowSpaces#1#2#3% + {\blank + \start + \startsubsubsubject[title={case #1: \type{#2} and \type {#3}}] + \dontleavehmode + #2\relax + #3\relax + \showmakeup[space]% + % \definedfont[Serif*default]% + \nonfrenchspacing + \strut x\space x.\space x\crlf + \frenchspacing + \strut x\space x.\space x\par + \stop + \stopsubsubject + \blank} + +\ShowSpaces{1}{\spacefactor2000}{\xspaceskip100pt} + +\starttabulate[|l|l|] +\HL +\NC \type {\spacefactor} \NC $\geq 2000$ \NC \NR +\NC \type {\xspaceskip} \NC $\neq 0$ \NC \NR +\HL +\NC space \NC xspaceskip_space \NC \NR +\NC stretch \NC xspaceskip_stretch \NC \NR +\NC shrink \NC xspaceskip_shrink \NC \NR +\NC subtype \NC xspaceskip \NC \NR +\HL +\stoptabulate + +\ShowSpaces{2}{\spacefactor1000}{\spaceskip0pt} + +\starttabulate[|l|l|] +\HL +\NC \type {\spacefactor} \NC $\lt 2000$ \NC \NR +\NC \type {\spaceskip} \NC $\eq 0$ \NC \NR +\HL +\NC space \NC font_space \NC \NR +\NC stretch \NC font_stretch \NC \NR +\NC shrink \NC font_shrink \NC \NR +\NC subtype \NC spaceskip \NC \NR +\HL +\stoptabulate + +\ShowSpaces{3}{\spacefactor2000}{\spaceskip0pt} + +\starttabulate[|l|l|] +\HL +\NC \type {\spacefactor} \NC $\geq 2000$ \NC \NR +\NC \type {\spaceskip} \NC $\eq 0$ \NC \NR +\HL +\NC space \NC font_space $+$ extraspace_font \NC \NR +\NC stretch \NC font_stretch \NC \NR +\NC shrink \NC font_shrink \NC \NR +\NC subtype \NC spaceskip \NC \NR +\HL +\stoptabulate + +\ShowSpaces{4}{\spacefactor1000}{\spaceskip100pt} + +\starttabulate[|l|l|] +\HL +\NC \type {\spacefactor} \NC $\lt 2000$ \NC \NR +\NC \type {\spaceskip} \NC $\neq 0$ \NC \NR +\HL +\NC space \NC font_space \NC \NR +\NC stretch \NC font_stretch $\times$ space_factor \NC \NR +\NC shrink \NC font_shrink $\times$ space_factor \NC \NR +\NC subtype \NC spaceskip \NC \NR +\HL +\stoptabulate + +\ShowSpaces{5}{\spacefactor2000}{\spaceskip100pt} + +\starttabulate[|l|l|] +\HL +\NC \type {\spacefactor} \NC $\geq 2000$ \NC \NR +\NC \type {\spaceskip} \NC $\neq 0$ \NC \NR +\HL +\NC space \NC font_space $+$ extraspace_font \NC \NR +\NC stretch \NC font_stretch $\times$ space_factor \NC \NR +\NC shrink \NC font_shrink $\times$ space_factor \NC \NR +\NC subtype \NC spaceskip \NC \NR +\HL +\stoptabulate + +The width of a space relates to the design of a font and therefore the t width of +the space, its stretch and its shrink are taken from the font and scaled +accordingly. Normally we take the space character in the font as reference. +Traditional \TEX\ fonts don't have that character but \OPENTYPE\ fonts have. When +there is no space character, in the case of a monospaced font we take the +emwidth, otherwise we take half the emwidth. As a last resort we can take the +average width of characters. And of even that fails we take half of the font +units. But, as mentioned, modern fonts have a space. + +In the \CONTEXT\ font loader we use a stretch that is 1/2 of the width of a space +and the shrink is 1/3 the width of a space. These values are familiar for those +who come from traditional \TEX. + +As with many variables, you can overload these values when a font is loaded by +setting the \type {spacing} feature. Here is how this is done: + +\startbuffer +\definefontfeature + [morespace] + [spacing=0.50 plus 0.50 minus 0.250] +\definefontfeature + [lessspace] + [spacing=0.25 plus 0.25 minus 0.125] +\definefontfeature + [extramorespace] + [spacing=0.50 plus 0.50 minus 0.250 extra 2.00] +\definefontfeature + [extralessspace] + [spacing=0.25 plus 0.25 minus 0.125 extra 2.00] + +\definedfont[Serif*default] + \inleft{\infofont default} + \samplefile{klein}\par + \blank +\definedfont[Serif*default,morespace] + \inleft{\infofont morespace} + \samplefile{klein}\par + \blank +\definedfont[Serif*default,extramorespace] + \inleft{\infofont extramorespace} + \samplefile{klein}\par + \blank +\definedfont[Serif*default,lessspace] + \inleft{\infofont lessspace} + \samplefile{klein}\par + \blank +\definedfont[Serif*default,extralessspace] + \inleft{\infofont extralessspace} + \samplefile{klein}\par + \blank +\stopbuffer + +\typebuffer + +For demonstration purposes we use a somewhat excessive \type {extra} +specification. By default the extra space is equal to the shrink. + +\blank \start + \showmakeup[space] + \getbuffer +\stop \blank + +\stopsection + +\startsection[title=Expansion] + +Spaces become glue that can shrink or stretch. In the worst case words will come +too close, or the gap will be large. Even worse is that this can lead to +successive lines in a paragraph looking different with respect to spacing. A solution +for this is to use font expansion, although the benefits are often less than +some users want (you) to believe. + +This mechanism is enabled with \type {\setupalign}. There are two variants (\type +{hz} and \type {fullhz}) and a reset (\type {nohz}). In \in {figure} [fig:expansion] +we use the following font definition: + +\startbuffer +\definefont[testfont][Normal*default,quality @ 9pt] +\stopbuffer + +\typebuffer \getbuffer + +We use \type {\showfontexpansion} to view the effective expansion factors of each +glyph. When \type {fullhz} is used fontkerns also can get expanded. Zero values +are not shown. The font kern factors are shown below the character factors. They +can be neglected and one can even wonder if they need a treatment especially +because kerns are also used for relative positioning, accent anchoring and +cursive attachments. + +\startplacefigure[reference=fig:expansion,title={The two expansion methods in action.}] + \startcombination[nx=3,ny=2,location=top] + {\framed[foregroundstyle=\testfont,width=.3\textwidth,align={normal,tolerant,nohz}] {\showfontexpansion\samplefile{ward}}} {} + {\framed[foregroundstyle=\testfont,width=.3\textwidth,align={normal,tolerant,fullhz}]{\showfontexpansion\samplefile{ward}}} {} + {\framed[foregroundstyle=\testfont,width=.3\textwidth,align={normal,tolerant,hz}] {\showfontexpansion\samplefile{ward}}} {} + {\scale[width=.3\textwidth]{\clip[nx=2,ny=4,x=2,y=3]{\framed[foregroundstyle=\testfont,width=.3\textwidth,align={normal,tolerant,nohz}] {\showfontexpansion\samplefile{ward}}}}} {\tttf{nohz}} + {\scale[width=.3\textwidth]{\clip[nx=2,ny=4,x=2,y=3]{\framed[foregroundstyle=\testfont,width=.3\textwidth,align={normal,tolerant,fullhz}]{\showfontexpansion\samplefile{ward}}}}} {\tttf{fullhz}} + {\scale[width=.3\textwidth]{\clip[nx=2,ny=4,x=2,y=3]{\framed[foregroundstyle=\testfont,width=.3\textwidth,align={normal,tolerant,hz}] {\showfontexpansion\samplefile{ward}}}}} {\tttf{hz}} + \stopcombination +\stopplacefigure + +\stopsection + +\startsection[title=Looseness] + +The \type {\looseness} parameter can be used to let the par builder add more +lines, but that condition is only met when the demand is reasonable. So we need +stretch and often also tolerance to achieve it. + +\starttyping +\looseness=1 ... text ... \par +\stoptyping + +This setting is reset afterwards. Because \type {framed} does some grouping deep down, +we need either to use it in there like this: + +\starttyping +\framed + [align={normal,verytolerant,stretch},strut=no] + {\looseness1 ... \par} +\stoptyping + +which is somewhat clumsy, or we can do: + +\starttyping +\framed + [align={normal,verytolerant,stretch,2*more}] + {...} +\stoptyping + +This is demonstrated in \in {figure} [fig:looseness]. + +\startplacefigure[reference=fig:looseness,title={Looseness in action.}] + \dontcomplain + \startcombination[location=top,nx=3,ny=1] + {\framed[foregroundstyle=small,align={normal,verytolerant,stretch}, width=.3\textwidth]{\samplefile{sapolsky}\unskip}} {} + {\framed[foregroundstyle=small,align={normal,verytolerant,stretch,1*more},width=.3\textwidth]{\samplefile{sapolsky}\unskip}} {\type {1*more}} + {\framed[foregroundstyle=small,align={normal,verytolerant,stretch,2*more},width=.3\textwidth]{\samplefile{sapolsky}\unskip}} {\type {2*more}} + \stopcombination +\stopplacefigure + +\stopsection + +\stopchapter + +\stopcomponent + |