summaryrefslogtreecommitdiff
path: root/tex/context/base/mkxl/meta-imp-txt.mkxl
diff options
context:
space:
mode:
authorHans Hagen <pragma@wxs.nl>2021-02-27 20:17:05 +0100
committerContext Git Mirror Bot <phg@phi-gamma.net>2021-02-27 20:17:05 +0100
commit4f7f67101a808c6b6c89d64ad5ee1f1701d8f632 (patch)
treec5f90a0b8e8a4e9d2cab82a0abebc65c6a93288e /tex/context/base/mkxl/meta-imp-txt.mkxl
parentc3ae4997f73041c6b97d8aec055ba24096602ab4 (diff)
downloadcontext-4f7f67101a808c6b6c89d64ad5ee1f1701d8f632.tar.gz
2021-02-27 19:30:00
Diffstat (limited to 'tex/context/base/mkxl/meta-imp-txt.mkxl')
-rw-r--r--tex/context/base/mkxl/meta-imp-txt.mkxl339
1 files changed, 339 insertions, 0 deletions
diff --git a/tex/context/base/mkxl/meta-imp-txt.mkxl b/tex/context/base/mkxl/meta-imp-txt.mkxl
new file mode 100644
index 000000000..4654ca722
--- /dev/null
+++ b/tex/context/base/mkxl/meta-imp-txt.mkxl
@@ -0,0 +1,339 @@
+%D \module
+%D [ file=meta-txt,
+%D version=2000.07.06,
+%D title=\METAPOST\ Graphics,
+%D subtitle=Text Tricks,
+%D author=Hans Hagen,
+%D date=\currentdate,
+%D copyright={PRAGMA ADE \& \CONTEXT\ Development Team}]
+%C
+%C This module is part of the \CONTEXT\ macro||package and is
+%C therefore copyrighted by \PRAGMA. See mreadme.pdf for
+%C details.
+
+%D See comments in the \MKIV\ module. This is an upgraded version for \LMTX,
+%D where we can so some things nicer.
+
+\unprotect
+
+%D Text in shapes. Here we use the option to prune a parshape when a new paragraph
+%D is seen. It's an experimental feature so I need to keep an eye on how it evolves.
+%D This time we combine \TEX, \METAPOST\ and \LUA, so we do't need a temporary file
+%D to communicate from \METAPOST\ to \TEX. We just store information in \LUA\ tables.
+
+\ifdefined\startshapetext
+
+ % now moved into the core
+
+\else
+
+ \ifdefined\shapetextbox \else
+ \newbox \shapetextbox
+ \newcount\shapetextindex
+ \fi
+
+ \ctxloadluafile{meta-imp-txt.lmt}
+
+ \startMPextensions loadmodule "text" ; \stopMPextensions
+
+ \protected\def\startshapetext[#1]%
+ {\begingroup
+ \global\shapetextindex\zerocount
+ \global\setbox\shapetextbox\vbox\bgroup
+ % analyze the mp shapes
+ \ctxlua{metapost.parshapes.reset()}
+ \def\docommand##1%
+ {\ctxlua{metapost.parshapes.next()}%
+ \startMPcalculation
+ \includeMPgraphic{##1}%
+ \stopMPcalculation}%
+ \processcommalist[#1]\docommand
+ \forgetall
+ \dontcomplain
+ % setup tex part (maybe just enable grid snapping)
+ \setuptolerance[\v!verytolerant,\v!stretch]% default
+ \setuplayout[\c!grid=\v!yes]%
+ \ctxlua{metapost.parshapes.wholeshape()}%
+ \pushparagraphtweak {prune}}
+
+ \protected\def\stopshapetext
+ {\popparagraphtweak
+ \egroup
+ \endgroup}
+
+ \def\getshapeparameter#1{\ctxlua{metapost.parshapes.get(\number\shapetextindex,"#1")}}
+
+ \protected\def\getshapetext
+ {\vbox\bgroup
+ \forgetall
+ \dontcomplain
+ \global\advance\shapetextindex\plusone
+ \scratchcounter\getshapeparameter{lines}\relax
+ \scratchwidth \getshapeparameter{width}\scaledpoint\relax
+ \scratchheight \getshapeparameter{height}\scaledpoint\relax
+ \setbox\scratchbox\vpack to \scratchheight
+ {\splittopskip\strutheight
+ \vskip\dimexpr\getshapeparameter{voffset}\scaledpoint\relax
+ \ifcase\numexpr\getshapeparameter{first}\relax\else
+ \vskip\lineheight
+ \fi
+ \hskip\dimexpr\getshapeparameter{hoffset}\scaledpoint\relax
+ \hpack{\vsplit\shapetextbox to \scratchcounter\lineheight}}%
+ \wd\scratchbox\scratchwidth
+ \ht\scratchbox\scratchheight
+ \dp\scratchbox\zeropoint
+ \box\scratchbox
+ \egroup}
+
+\fi
+
+%D Following:
+
+% \doifundefined{RotFont}{\definefont[RotFont][RegularBold*default]}
+%
+% \unexpanded\def\getfollowtoken#1%
+% {\hbox\bgroup
+% \strut
+% \ctxlua{mp.follow_text(#1)}%
+% \egroup}
+
+\definefontfeature[mp:tp][liga=no]
+
+% if unknown RotPath : path RotPath ; RotPath := origin ; fi ;
+% if unknown TraceRot : boolean TraceRot ; TraceRot := false ; fi ;
+% if unknown ExtraRot : numeric ExtraRot ; ExtraRot := 0 ; fi ;
+% if al < len[n]:
+% RotPath := RotPath scaled ((len[n]+ExtraRot)/al) ;
+% al := arclength RotPath ;
+% fi ;
+% if TraceRot :
+% draw RotPath withpen pencircle scaled 1pt withcolor blue ;
+% fi ;
+% if TraceRot :
+% draw boundingbox currentpicture withpen pencircle scaled .25pt withcolor blue ;
+% fi ;
+
+\protected\def\dofollowtokens#1#2%
+ {\dontleavehmode
+ \vpack\bgroup
+ \forgetall
+ \dontcomplain
+ \addff{mp:tp}%
+ \startMPcode
+ \includeMPgraphic{followtokens}
+ draw lmt_followtext [ path = RotPath, text = "#2", spread = #1 ] ;
+ \stopMPcode
+ \egroup}
+
+\protected\def\followtokens {\dofollowtokens{true}}
+\protected\def\followtokenscentered{\dofollowtokens{false}}
+
+%D Fuzzy counters:
+
+\startuseMPgraphic{fuzzycount}
+ begingroup
+ save height, span, drift, d, cp ;
+ height := 3/ 5 * LineHeight ;
+ span := 1/ 3 * height ;
+ drift := 1/10 * height ;
+ pickup pencircle scaled (1/12 * height) ;
+ def d = (uniformdeviate drift) enddef ;
+ for i := 1 upto \MPvar{n} :
+ draw
+ if (i mod 5)=0 : ((-d - 4.5span,d) -- (d -0.5span,height - d))
+ else : ((-d, d) -- (d, height - d)) fi
+ shifted (span*i,d-drift) ;
+ endfor;
+ picture cp ; cp := currentpicture ; % for readability
+ setbounds currentpicture to
+ (llcorner cp shifted (0,-ypart llcorner cp) --
+ lrcorner cp shifted (0,-ypart lrcorner cp) --
+ urcorner cp --
+ ulcorner cp -- cycle) ;
+ endgroup ;
+\stopuseMPgraphic
+
+\setupMPvariables
+ [fuzzycount]
+ [n=10]
+
+\protected\def\fuzzycount#1%
+ {\dontleavehmode\bgroup
+ \tx
+ \useMPgraphic{fuzzycount}{n=#1}%
+ \egroup}
+
+\defineconversion[fuzzy][\fuzzycount]
+
+%D English rules:
+
+\setupMPvariables
+ [EnglishRule]
+ [height=1ex,
+ width=\localhsize,
+ color=darkgray]
+
+\defineblank
+ [EnglishRule]
+ [medium]
+
+\startuniqueMPgraphic{EnglishRule}{height,width,color}
+ x1 = 0 ; x3 = \MPvar{width} ; x2 = x4 = .5x3 ;
+ y1 = y3 = 0 ; y2 = -y4 = \MPvar{height} / 2 ;
+ fill z1 .. z2 .. z3 & z3 .. z4 .. z1 & cycle withcolor \MPvar{color} ;
+\stopuniqueMPgraphic
+
+\protected\def\EnglishRule
+ {\startlinecorrection[EnglishRule]%
+ \setlocalhsize
+ \noindentation
+ \reuseMPgraphic{EnglishRule}%
+ \stoplinecorrection}
+
+%D Tight text (for old times sake): the following macro returns a tight bound
+%D character sequence.
+%D
+%D \useMPlibrary[txt]
+%D
+%D \startlinecorrection
+%D \TightText{\ss\bf 123}{0cm}{3cm}{red}
+%D \stoplinecorrection
+
+\protected\def\TightText#1#2#3#4%
+ {\hpack
+ {\startMPcode
+ picture p ; p := image (graphictext "#1" withfillcolor red) ;
+ draw p xsized #2 ysized #3 withcolor \MPcolor{#4} ;
+ \stopMPcode}}
+
+\protected\def\TightText#1#2#3#4%
+ {\dontleavehmode
+ \startMPcode
+ draw outlinetext.f ("#1") (\iftok{#4}\emptytoks \else withcolor \MPcolor{#4} \fi)
+ \iftok{#2}\emptytoks \else xsized #2 \fi
+ \iftok{#3}\emptytoks \else ysized #3 \fi
+ ;
+ \stopMPcode}
+
+\protect
+
+\continueifinputfile{meta-imp-txt.mkxl}
+
+\setupbodyfont[pagella,10pt]
+
+% \useMPlibrary[txt]
+
+\starttext
+
+%D Shapes:
+
+\startuseMPgraphic{test 1}
+ path p ; p := fullcircle scaled 6cm ;
+
+ build_parshape(p,BodyFontSize/2,0,0,LineHeight,StrutHeight,StrutDepth,StrutHeight) ;
+
+ draw p withpen pencircle scaled 1pt ;
+\stopuseMPgraphic
+
+\startuseMPgraphic{test 2}
+ path p ; p := fullsquare rotated 45 scaled 5cm ;
+
+ build_parshape(p,BodyFontSize/2,0,0,LineHeight,StrutHeight,StrutDepth,StrutHeight) ;
+
+ draw p withpen pencircle scaled 1pt ;
+\stopuseMPgraphic
+
+\startuseMPgraphic{test 3}
+ numeric w, h ; w := h := 6cm ;
+ path p ; p := (.5w,h) -- (0,h) -- (0,0) -- (w,0) &
+ (w,0) .. (.75w,.5h) .. (w,h) & (w,h) -- cycle ;
+
+ build_parshape(p,BodyFontSize/2,0,0,LineHeight,StrutHeight,StrutDepth,StrutHeight) ;
+
+ draw p withpen pencircle scaled 1pt ;
+\stopuseMPgraphic
+
+\startuseMPgraphic{test 4}
+ numeric w, h, o, d ;
+
+ def shape = (o,o) -- (w-o,o) & (w-o,o) .. (.75w-o,.5h) ..
+ (w-2o,h-o) & (w-2o,h-o) -- (o,h-o) -- cycle
+ enddef ;
+
+ d := BodyFontSize/2;
+
+ w := h := 6cm ; o := d ; path p ; p := shape ;
+ w := h := 6cm ; o := 0 ; path q ; q := shape ;
+
+ build_parshape(p,q,d,d,LineHeight,StrutHeight,StrutDepth,StrutHeight) ;
+
+ draw q withpen pencircle scaled 1pt ;
+\stopuseMPgraphic
+
+\defineoverlay[test 1][\useMPgraphic{test 1}]
+\defineoverlay[test 2][\useMPgraphic{test 2}]
+\defineoverlay[test 3][\useMPgraphic{test 3}]
+\defineoverlay[test 4][\useMPgraphic{test 4}]
+
+\startbuffer
+ \startshapetext[test 1,test 2,test 3,test 4]
+ \setupalign[verytolerant,stretch,normal]%
+ \samplefile{douglas} % Douglas R. Hofstadter
+ \stopshapetext
+ \startTEXpage[offset=10pt]
+ \startcombination[2*2]
+ {\framed[offset=overlay,frame=off,background=test 1]{\getshapetext}} {test 1}
+ {\framed[offset=overlay,frame=off,background=test 2]{\getshapetext}} {test 2}
+ {\framed[offset=overlay,frame=off,background=test 3]{\getshapetext}} {test 3}
+ {\framed[offset=overlay,frame=off,background=test 4]{\getshapetext}} {test 4}
+ \stopcombination
+ \stopTEXpage
+\stopbuffer
+
+\getbuffer
+
+\startMPextensions
+ boolean trace_parshape ; trace_parshape := true ;
+\stopMPextensions
+
+\getbuffer
+
+%D Fuzzycount (maybe handy):
+
+\startitemize[fuzzy,nostopper]
+ \startitem This is real fuzzy. \stopitem
+ \startitem But it can be even more fuzzier. \stopitem
+ \startitem And how about this. \stopitem
+\stopitemize
+
+\EnglishRule
+
+\startitemize[continue,broad]
+ \startitem This is real fuzzy. \stopitem
+ \startitem But it can be even more fuzzier. \stopitem
+ \startitem And how about this. \stopitem
+\stopitemize
+
+%D Tight text (manual stuff):
+
+\ruledhbox{\TightText{oeps wat doet dit}{10cm}{1cm}{red}} \blank
+\ruledhbox{\TightText{oeps wat doet dit}{10cm}{} {green}} \blank
+\ruledhbox{\TightText{oeps wat doet dit}{} {1cm}{blue}} \blank
+\ruledhbox{\TightText{oeps wat doet dit}{} {} {}} \blank
+
+%D Old fashioned:
+
+\startuseMPgraphic{followtokens}
+ path RotPath ; RotPath := reverse halfcircle xyscaled 3cm ;
+ draw RotPath ;
+\stopuseMPgraphic
+
+\startTEXpage
+ \followtokens{{\hskip1em}some text{\hskip1em}}
+\stopTEXpage
+
+\startTEXpage
+ \followtokenscentered{{\hskip1em}some text{\hskip1em}}
+\stopTEXpage
+
+\stoptext