From 236690a6367b25187d37013e1e7fc196c5c44eb8 Mon Sep 17 00:00:00 2001 From: Context Git Mirror Bot Date: Sat, 24 Sep 2016 13:11:46 +0200 Subject: 2016-09-24 12:45:00 --- .../sources/general/manuals/rules/rules-mkiv.tex | 817 +++++++++++++++++++++ 1 file changed, 817 insertions(+) create mode 100644 doc/context/sources/general/manuals/rules/rules-mkiv.tex (limited to 'doc/context/sources/general/manuals/rules/rules-mkiv.tex') diff --git a/doc/context/sources/general/manuals/rules/rules-mkiv.tex b/doc/context/sources/general/manuals/rules/rules-mkiv.tex new file mode 100644 index 000000000..5b207e335 --- /dev/null +++ b/doc/context/sources/general/manuals/rules/rules-mkiv.tex @@ -0,0 +1,817 @@ +% interface=en engine=luatex language=uk + +% author : Hans Hagen +% copyright : PRAGMA ADE & ConTeXt Development Team +% license : Creative Commons Attribution ShareAlike 4.0 International +% reference : pragma-ade.nl | contextgarden.net | texlive (related) distributions +% origin : the ConTeXt distribution +% +% comment : Because this manual is distributed with TeX distributions it comes with a rather +% liberal license. We try to adapt these documents to upgrades in the (sub)systems +% that they describe. Using parts of the content otherwise can therefore conflict +% with existing functionality and we cannot be held responsible for that. Many of +% the manuals contain characteristic graphics and personal notes or examples that +% make no sense when used out-of-context. + +\setupbodyfont + [dejavu,10pt] + +\setuphead + [section] + [style=\bfb] + +\setupwhitespace + [big] + +\setuplayout + [header=15mm, + topspace=15mm, + footer=0mm, + bottomspace=20mm, + height=middle, + backspace=20mm, + cutspace=20mm, + width=middle] + +\usemodule[x][setups-basics] + +\loadsetups[context-en] +\loadsetups[i-linefiller] + +\startdocument + +\startMPpage + + StartPage ; + + linecap := butt ; + + fill Page withcolor .25[yellow/4,green/2] ; + + path p ; p := (ulcorner Page .. urcorner Page .. lrcorner Page) ; + + draw image ( + for i=1/200 step 1/200 until 1 : + draw p scaled i dashed dashpattern (on 4 randomized 2 off 4 randomized 2) ; + endfor ; + ) withcolor white ; + + draw anchored.urt( + textext("\ss RULES") xsized .5PaperWidth, + urcorner Page shifted(-15mm,-20mm) + ) withcolor white ; + + draw anchored.urt( + textext("\ss HANS HAGEN") xsized .5PaperWidth, + lrcorner Page shifted(-15mm,40mm) + ) withcolor white ; + + draw anchored.urt( + textext("\ss A CONTEXT MKIV MANUAL") xsized .5PaperWidth, + lrcorner Page shifted(-15mm,20mm) + ) withcolor white ; + + setbounds currentpicture to Page ; + + StopPage ; + +\stopMPpage + +\startsubject[title=Introduction] + +This manual describes just one type of rules: those that somehow magically are +bound to the typeset text. We will mention a few mechanisms that relate to this +in the sense that they share some of the underlaying code and logic. The term +\quotation {rules} should be interpreted liberally as we can kick in some +\METAPOST\ which then can get us away from straight rules. + +This manual will not be that extensive, after all these mechanisms are not that +complex to configure. + +\stopsubject + +\startsubject[title=Underlining and overstriking] + +Already in \CONTEXT\ \MKII\ we had underlining available but with some +limitations. We could handle more than one word but at some point you hit the +limits of the engine. The \MKIV\ implementation is more flexible. In fact you can +underline a whole document (which was actually a request from a user). This +feature was also used by a collegue who was experimenting with texts for +dyslectic readers. + +This mechanism is generic in the sense that a framework is provided to define +rules that run alongside text. Take this: + +\setupbars[foregroundcolor=darkyellow,color=darkred] + +\startbuffer +\underbars {drawing \underbar{bars} under words is a typewriter leftover} +\overstrikes {striking words makes them \overstrike {unreadable} but +sometimes even \overbar {top lines} come into view.} +\stopbuffer + +\typebuffer + +This shows up as: + +\getbuffer + +We can best explain what happens by looking at how these commands are +defined: + +\starttyping +\definebar[overbar] [method=1,dy=0.4, offset=1.8, continue=yes] +\definebar[underbar] [method=1,dy=-0.4,offset=-0.3,continue=yes] +\definebar[overstrike][method=0,dy=0.4, offset=0.5, continue=yes] + +\definebar + [understrike] + [method=0, + offset=1.375, + rulethickness=2.5, + continue=yes, + order=background] + +\definebar[overbars] [overbar] [continue=no] +\definebar[underbars] [underbar] [continue=no] +\definebar[overstrikes] [overstrike] [continue=no] +\definebar[understrikes][understrike][continue=no] +\stoptyping + +The formal definitions of the commands are show in \definition [definebar, setupbar]. + +\showdefinition{definebar} +\showdefinition{setupbar} + +The \type {dy} parameter specifies the shift up or down. The offset defines how +nested bars are shifted. The \type {method} determines centering of the bar: we +set it to zero when we want an overstrike. The \type {continue} parameter is +responsible for drawing over spaces and the \type {order} determines the layering. + +The units are either hard coded values like points or relate to the font at the spot +of the bar. Here are some examples: + +\startbuffer +\setupbars[unit=mm,rulethickness=1] bar \underbar{foo} bar\quad +\setupbars[unit=ex,rulethickness=1] bar \underbar{foo} bar\quad +\setupbars[unit=pt,rulethickness=1] bar \underbar{foo} bar\quad +\setupbars[unit=pt,rulethickness=10pt] bar \underbar{foo} bar +\stopbuffer + +\typebuffer \blank \start \getbuffer \stop \blank + +As if underlining wasn't already bad enough, of course at some point there came a +request for dashed lines. + +\startbuffer +test \underrandoms{test me} and \underrandom{test} or \underrandom{grep} +test \underdashes {test me} and \underdash {test} or \underdash {grep} +test \underdots {test me} and \underdot {test} or \underdot {grep} +\stopbuffer + +\typebuffer + +The above variants are predefined and render as: + +\startlines +\tfb \getbuffer +\stoplines + +A graphic is defined as follows. It boils down to drawing one or more shapes. In +this example we also force a specific boundingbox so that the result gets +positioned right. + +\starttyping +\startuseMPgraphic{rules:under:...} + draw + ((0,RuleDepth) -- (RuleWidth,RuleDepth)) + shifted (0,RuleFactor*RuleOffset) + withpen pencircle scaled RuleThickness + withcolor RuleColor ; + setbounds currentpicture to unitsquare xysized(RuleWidth,RuleHeight) ; +\stopuseMPgraphic +\stoptyping + +The following variables are available: + +\starttabulate[|T|||] +\BC variable \BC type \BC meaning \NC \NR +\ML +\NC RuleDirection \NC string \NC the direction of the line \NC \NR +\NC RuleOption \NC string \NC whatever the caller finds useful \NC \NR +\NC RuleWidth \NC number \NC the requested width of the rule \NC \NR +\NC RuleHeight \NC number \NC the requested height of the rule \NC \NR +\NC RuleDepth \NC number \NC the requested depth of the rule \NC \NR +\NC RuleThickness \NC number \NC the linewidth \NC \NR +\NC RuleFactor \NC number \NC the set factor (e.g. an \type {ex}) \NC \NR +\NC RuleOffset \NC number \NC an (optional) offset in case of nesting \NC \NR +\NC RuleColor \NC color \NC the color \NC \NR +\stoptabulate + +The \type {RuleFactor} can be used as multiplier for the \type {RuleOffset}. +Later we will see an example of how to use the \type {RuleDirection} and \type +{RuleOption}. + +The extra under commands are defined as follows. Watch the \type {mp} parameter: +it refers to a graphic. + +\starttyping +\definebar + [undergraphic] + [mp=rules:under:dash, + offset=-.2, + order=background] + +\definebar[underrandom] [undergraphic][mp=rules:under:random] +\definebar[underrandoms][underrandom] [continue=yes] + +\definebar[underdash] [undergraphic][mp=rules:under:dash] +\definebar[underdashes] [underdash] [continue=yes] + +\definebar[underdot] [undergraphic][mp=rules:under:dots] +\definebar[underdots] [underdot] [continue=yes] +\stoptyping + +A nasty side effect of the implementation is that because we look mostly at glyphs, +optionally separated by glue or kern some text might get unseen and therefore not +treated. + +\startbuffer +\underbars{We see this \high{\tfxx ®} symbol \runninghbox to 1cm{\hss} often.} +\underbar {We see this \high{\tfxx ®} symbol \runninghbox to 1cm{\hss} often.} +\stopbuffer + +\typebuffer + +This gives: + +\startlines +\getbuffer +\stoplines + +A running box is seen as text. As you (probably) expect, a nested ornamental +rule is supported as well: + +\startbuffer +\underbars{We see this \high{\tfxx\underdot{®}} symbol \runninghbox to 1cm{\hss} often.} +\underbar {We see this \high{\tfxx\underdot{®}} symbol \runninghbox to 1cm{\hss} often.} +\stopbuffer + +\typebuffer + +This time we get (you might need a magnifier to see it): + +\startlines +\getbuffer +\stoplines + +\stopsubject + +\startsubject[title=Shifting] + +We mention shifting here because it shares code with the bars. There are two +shifts defined but you can define more: + +\starttyping +\defineshift + [shiftup] + [method=0, + dy=-1, + unit=ex, + continue=yes, + style=\txx] + +\defineshift + [shiftdown] + [method=1, + dy=.3, + unit=ex, + continue=yes, + style=\txx, + color=] +\stoptyping + +An example of using the commands defined this way is: + +\startbuffer +Let's go \shiftup{up} and \shiftdown{down} a bit! +\stopbuffer + +\typebuffer + +or: \inlinebuffer\ Here we just shift words but you can shift more than that +although I haven't yet seen a useful example of that: + +\startbuffer +We can \shiftup {\input{tufte}} whole paragraphs if we really want. +\stopbuffer + +\typebuffer + +\getbuffer + +The formal definitions are given in \definition[defineshift, setupshift, +startshift]. The \type {align} switch is there for directional (and testing) +purposes and is normally not used (or even useful in a line). The \type {dy} +is multiplied by the \type {factor} that itself can depend on the used font. + +\showdefinition{defineshift} +\showdefinition{setupshift} +\showdefinition{startshift} + +\stopsubject + +\startsubject[title=Fillers] + +The possibility of line fillers was mentioned by Mojca on the \CONTEXT\ mailing +list and it's actually not that hard to implement them. The only need I ever had +for it was to fill out lines on some legal form and that was actually just some +fun challenge in \MKII\ times. The code got lost and never made it into \CONTEXT. +This time it was added as a side effect of a thread at the tenth \CONTEXT\ +meeting. + +The ideas is to fill the rest of a line with some kind of (ornamental) rule. I'm +not sure what sense it makes, even in legal documents. If it is to prevent +additions then one should wonder if additions at the end of a (kind of arbitrary) +broken line is what we should be afraid of most. So, for now, let's consider it +an educational feature. + +\startbuffer +\definelinefiller + [filler-1] + [height=.75\exheight, + distance=.25\emwidth, + rulethickness=.25\exheight, + textcolor=darkyellow, + before=\blank, + after=\blank, + color=darkred] + +\startlinefiller[filler-1] + \input ward +\stoplinefiller +\stopbuffer + +\typebuffer + +Here we define a filler. As you can see, a rule gets added at the end of a +paragraph. + +\getbuffer + +\startbuffer +\startalign[flushleft,broad] + \startlinefiller[filler-1] + \input ward + \stoplinefiller +\stopalign +\stopbuffer + +This time we don't justify: + +\typebuffer + +Now more lines get a rule appended: + +\getbuffer + +Before we continue it must be noted that the environment creates a paragraph. If +you don't want that you need to use \type {\setlinefiller} instead. Next we show +a \type {middle} alignment: + +\startbuffer +\startalign[middle] + \startlinefiller[filler-1] + \input ward + \stoplinefiller +\stopalign +\stopbuffer + +\getbuffer + +\startbuffer +\startalign[middle] + \startnarrower + \startlinefiller[filler-1] + \input ward + \stoplinefiller + \stopnarrower +\stopalign +\stopbuffer + +Let's add another level of complexity, left- and right skips: + +\typebuffer + +Here we get: + +\getbuffer + +The lines stay within the narrower boundaries but you can extend them +to the margins if you like: + +\startbuffer +\startalign[middle] + \startnarrower + \startlinefiller[filler-1][scope=global] + \input ward + \stoplinefiller + \stopnarrower +\stopalign +\stopbuffer + +\typebuffer + +This looks like: + +\getbuffer + +You can also use a \type {left} or \type {right} scope, as in: + +\startbuffer +\startalign[middle] + \startnarrower + \startlinefiller[filler-1][scope=right] + \input ward + \stoplinefiller + \stopnarrower +\stopalign +\stopbuffer + +\typebuffer + +Only the right rules extend into the margins. + +\getbuffer + +\startbuffer +\startalign[middle] + \startnarrower + \startlinefiller[filler-1][scope=right,location=right] + \input ward + \stoplinefiller + \stopnarrower +\stopalign +\stopbuffer + +You can get rid of the left rules: + +\typebuffer + +So: + +\getbuffer + +Of course these rules are somewhat boring so let's now kick in some \METAPOST. + +\startbuffer[mp] +\setuplinefiller + [filler-1] + [mp=rules:filler:demo, + %threshold=.25\emwidth, + color=darkred] + +\startuseMPgraphic{rules:filler:demo} + drawarrow + if RuleDirection == "TRT" : reverse fi + ((0,RuleHeight) -- (RuleWidth,RuleHeight)) + withpen + pencircle scaled RuleThickness + withcolor + if RuleOption == "left" : complemented fi RuleColor ; + setbounds currentpicture to + unitsquare xysized(RuleWidth,RuleHeight) ; +\stopuseMPgraphic +\stopbuffer + +\typebuffer[mp] \getbuffer[mp] + +The previous example now looks like: + +\getbuffer + +\startbuffer +\startalign[middle,r2l] + \startnarrower[4*middle] + \startlinefiller[filler-1] [scope=global] + \input ward + \stoplinefiller + \stopnarrower +\stopalign +\stopbuffer + +This time we also change the direction and we can let the \METAPOST\ graphic +adapt to that by reverting the arrows. + +\typebuffer + +The direction \type {TRT} is \TEX\ speak for a right|-|to|-|left direction. We +use a latin script example for convenience. + +\getbuffer + +\startbuffer[mp] +\startuseMPgraphic{rules:filler:demo} + drawarrow + if RuleDirection == "TRT" : reverse fi + if RuleOption == "right" : reverse fi + ((0,RuleHeight) -- (RuleWidth,RuleHeight)) + withpen + pencircle scaled RuleThickness + withcolor + if RuleOption == "left" : complemented fi RuleColor ; + setbounds currentpicture to + unitsquare xysized(RuleWidth,RuleHeight) ; +\stopuseMPgraphic +\stopbuffer + +% \startbuffer +% \startnarrower[4*middle] +% \startlinefiller[filler-1] [scope=global,align=middle] +% \parindent 100pt +% \parfillskip 100pt +% \input ward +% \stoplinefiller +% \stopnarrower +% \stopbuffer + +\startbuffer +\startnarrower[4*middle] + \startlinefiller[filler-1] [scope=global,align={middle,r2l}] + \parindent 100pt + \parfillskip 100pt + \input ward + \stoplinefiller +\stopnarrower +\stopbuffer + +The next rendering shows what happens when we set \type {\parindent} and \type +{\parfillskip} to an excessive have a \type {100pt}. + +\getbuffer[mp] \getbuffer + +Here we have adapted the graphic a bit: + +\starttyping +if RuleDirection == "TRT" : reverse fi + if RuleOption == "right" : reverse fi + ((0,RuleHeight) -- (RuleWidth,RuleHeight)) +\stoptyping + +\showdefinition{definelinefiller} +\showdefinition{setuplinefiller} + +\stopsubject + +% \startsubject[title=Backgrounds] +% \stopsubject + +\startsubject[title=User rules] + +Characters and rules are the only graphical elements that \TEX\ really knows +about. Even if you see images in a document, you should realize that they are +just blobs with dimensions and that the backend replaces such blobs by real +images. + +The primitive operations for rules are \type {\hrule} and \type {\vrule} and the +main difference is to what way they adapt to their situation when no dimensions +are given and the mode change they trigger. + +\startbuffer +hrule{\darkred \hrule width 10cm height 3mm depth 2mm}\par +vrule{\darkyellow\vrule width 10cm height 3mm depth 2mm}\par +hrule{\darkred \hrule width 10cm }\par +vrule{\darkyellow\vrule height 3mm depth 2mm}\par + +hrule{\darkred \leaders\hrule height 1mm\relax\hfill}hrule\par +\stopbuffer + +\typebuffer + +When more text is to follow you should end a specification with \type {\relax} to +make sure that the scanner stops looking for more arguments. With \type {\leaders} +you can create flexible rules. + +\startlinecorrection +\getbuffer +\stoplinecorrection + +In \CONTEXT\ we also have so called frame rules: + +\startbuffer +\color[darkred]{\frule + width 10cm + height 1cm + line 1mm +\relax} +\stopbuffer + +\typebuffer + +This will produce a rectangle: + +\startlinecorrection +\getbuffer +\stoplinecorrection + +There are a few more keywords. Keep in mind that we actually have a new kind of +primitive here, so we follow the \TEX\ conventions of keywords. + +\startbuffer +\ruledhbox\bgroup + \darkgray \frule width 100mm height 10mm depth 8mm radius 2mm line 2pt type fill\relax + \hskip-100mm + \darkred \frule width 100mm height 10mm depth 8mm radius 2mm line 2pt\relax + \hskip-100mm + \hbox to 100mm{\white \bold \hfill some handy word with frames\hfill} +\egroup +\stopbuffer + +\typebuffer + +Of course this is a rather low level way of doing frames and such, but when you +like that kind of low level programming you get the possibility here. + +\startlinecorrection +\getbuffer +\stoplinecorrection + +You can combine this with existing mechanisms. Take the following: + +\startbuffer +\defineoverlay[normalframe] + [\frule + width \overlaywidth + height\overlayheight + line \overlaylinewidth + ] + +\defineoverlay[ovalframe] + [\frule + width \overlaywidth + height \overlayheight + line \overlaylinewidth + radius \overlayradius + ] +\stopbuffer + +\typebuffer \getbuffer + +\startbuffer +\hbox \bgroup + \framed {test}\quad + \framed[frame=off] {test}\quad + \framed[background=normalframe,frame=off]{test}\quad + \framed[background=normalframe,frame=off]{test}\quad + \framed[corner=round] {test}\quad + \framed[corner=round] {test}\quad + \framed[background=ovalframe,frame=off] {test}\quad + \framed[background=ovalframe,frame=off] {test}\quad + \framed[background=ovalframe,frame=on] {test}\quad + \framed[background=ovalframe,frame=on] {test}\quad +\egroup +\stopbuffer + +This is a variant on the already available round corners: + +\startlinecorrection +\getbuffer +\stoplinecorrection + +The above result is accomplished with: + +\typebuffer + +Given the examples in the previous sections it will be no surprise that we +can also use \METAPOST. + +\startbuffer +\startuseMPgraphic{demoshape:back} + fill + unitcircle xysized (RuleWidth,RuleHeight+RuleDepth) + withcolor RuleColor ; +\stopuseMPgraphic + +\startuseMPgraphic{demoshape:fore} + draw + unitcircle xysized (RuleWidth,RuleHeight+RuleDepth) + withcolor RuleColor + withpen pencircle scaled 4RuleThickness ; +\stopuseMPgraphic + +\hbox\bgroup + \darkgray \frule width 100mm height 10mm depth 8mm type mp line 2pt + data {\includeMPgraphic{demoshape:back}} + \relax + \hskip-100mm + \darkred \frule width 100mm height 10mm depth 8mm type mp line 2pt + data {\includeMPgraphic{demoshape:fore}} + \relax + \hskip-100mm + \hbox to 100mm{\white \bold \hfill some handy word with frames\hfill} +\egroup +\stopbuffer + +\typebuffer + +Or rendered: + +\startlinecorrection +\getbuffer +\stoplinecorrection + +The \type {\blackrule} command is the more high level way to inject a rule. + +\startbuffer +\blackrule + [width=10cm, + height=1cm, + depth=1cm, + color=darkred] +\stopbuffer + +\typebuffer + +This produces a boring rule: + +\startlinecorrection +\getbuffer +\stoplinecorrection + +Again we can revert to \METAPOST: + +\startbuffer +\blackrule + [width=10cm, + height=1cm, + depth=1cm, + color=darkred, + type=mp, + mp=demoshape:back] +\stopbuffer + +\typebuffer + +or: + +\startlinecorrection +\getbuffer +\stoplinecorrection + +The formal definition of this command is shown in \definition [setupblackrules, +blackrule]. + +\showdefinition{setupblackrules} +\showdefinition{blackrule} + +\stopsubject + +\startsubject[title=Hiding] + +In education a to be filled in text is often represented by a gap in the running text +and the bar drawing mechanism supports this. THere is a predefined \type {\hiddenbar} +command: + +\starttyping +\definebar + [hiddenbar] [underbar] + [continue=yes,empty=yes, + left=\zwj,right=\zwj] +\stoptyping + +\startbuffer +\input ward \hiddenbar {\color[red]{invisible}} +\input ward \hiddenbar {\quad\color[red]{invisible}\quad} +\input ward \hiddenbar{\quad\quad\quad\color[red]{invisible}\quad\quad\quad} +\input ward \hiddenbar {\color[red]{invisible}\quad\quad\quad\quad\quad\quad} +\input ward +\stopbuffer + +\getbuffer + +The previous text is generated with: + +\typebuffer + +Here is a variant that inserts spacing at the left and right edges. In this case +the spacing is kept at a linebreak: + +\startbuffer +\definebar + [widehiddenbar] + [hiddenbar] + [left={\quads[3]}, + right={\quads[3]}] + +\widehiddenbar{invisible} \input weisman +\widehiddenbar{invisible} \input weisman +\widehiddenbar{invisible} +\stopbuffer + +\typebuffer + +\getbuffer + +\stopsubject + +\stopdocument -- cgit v1.2.3