meta-imp-punk.mkxl /size: 9533 b    last modification: 2021-10-28 13:51
1%D \module
2%D   [       file=meta-imp-punk,
3%D        version=2020.01.16,
4%D          title=\METAPOST\ Graphics,
5%D       subtitle=Punk,
6%D         author=Hans Hagen,
7%D           date=\currentdate,
8%D      copyright={PRAGMA ADE \& \CONTEXT\ Development Team}]
9%C
10%C This module is part of the \CONTEXT\ macro||package and is
11%C therefore copyrighted by \PRAGMA. See mreadme.pdf for
12%C details.
13
14% This file is a merge of the original punk files by Donald Knuth, who
15% added this comment:
16%
17%   Font inspired by Gerard and Marjan Unger's lectures, Feb 1985
18%
19% The regular punk files are part of TeXLive and in metafont format. All
20% errors introduced are ours. We also changed the encoding to unicode. In
21% due time we might add a few more more characters. We still need to
22% improve some of the metrics which involves a bit of trial and error. The
23% font just covers basic latin shapes but in ConTeXt MkIV we add virtual
24% composed shapes. There is a module m-punk.tex that implements this. This
25% derivate is also used in mk.tex (mk.pdf) which is one of our tests for
26% LuaTeX. We published an article on it in the MAPS (NTG magazine).
27%
28% 2008, mkiv variant: Taco Hoekwater & Hans Hagen
29% 2020, lmtx variant: Hans Hagen (playground)
30
31\startMPcalculation{simplefun}
32
33    picture PunkShapes[][];
34
35    numeric PunkId       ; PunkId       := 0 ;
36    numeric PunkBase     ; PunkBase     := 0 ;
37    string  PunkName     ; PunkName     := "punk" ;
38    numeric PunkUsed     ; PunkUsed     := 0 ;
39    numeric PunkSlant    ; PunkSlant    := 0 ;
40    numeric PunkWeight   ; PunkWeight   := 1 ;
41    numeric PunkSqueeze  ; PunkSqueeze  := 1 ;
42    numeric PunkExtend   ; PunkExtend   := 1 ;
43    numeric PunkVariants ; PunkVariants := 0 ;
44
45    numeric PunkRatio ; PunkRatio := 2/3 ;
46    numeric PunkScale ; PunkScale := 20 ;  % when zero we use the knuth values
47    numeric PunkN     ; PunkN     := 0 ;
48
49    def beginpunkchar(expr c, n, hor, ver) =
50        begingroup ;
51        save uc, w, h, d, hdev, vdev ;
52        hdev := hor * dev ; % modify horizontal amounts of deviation
53        vdev := ver * dev ; % modify vertical   amounts of deviation
54        uc := if string c : utfnum(c) else : c fi ;
55        h := if PunkScale > 0 : PunkN else : n fi / PunkSqueeze ;
56        w := n * PunkExtend ;
57        d := 0 ;
58        clearxy ;
59        clearit ;
60    enddef ;
61
62    def endpunkchar =
63        if PunkSlant <> 0 :
64            currentpicture := currentpicture slanted PunkSlant ;
65        fi ;
66        save llx, lly, uly ;
67        llx := xpart llcorner currentpicture ;
68        lly := ypart llcorner currentpicture ;
69        uly := ypart ulcorner currentpicture ;
70
71        currentpicture := currentpicture shifted (- llx + 1, 0);
72        w := bbwidth(currentpicture) + 2 ;
73        h := uly ;
74        d := if lly < 0 : - lly else : 0 fi ;
75
76        PunkUsed := if PunkBase > 0 : PunkBase else : uc fi;
77        PunkShapes[PunkId][PunkUsed] := currentpicture ;
78        lmt_registerglyph [
79            category  = PunkName,
80            unicode   = PunkUsed,
81            tounicode = uc,
82            width     = w,
83            height    = h,
84            depth     = d,
85            code      = "draw PunkShapes[" & decimal PunkId & "][" & decimal PunkUsed & "]",
86        ] ;
87        if PunkBase > 0 :
88            PunkBase := PunkBase + 1 ;
89        fi ;
90        endgroup ;
91    enddef ;
92
93    def initialize_punk_upper =
94        PunkN := PunkScale ;
95        dev   := 1 ;
96    enddef ;
97
98    def initialize_punk_lower =
99        PunkN := PunkScale * PunkRatio ;
100        dev   := .5 ;
101    enddef ;
102
103    def revert_punk_lower =
104        PunkN := PunkScale ;
105        dev   := 1 ;
106    enddef ;
107
108    def beginpunkfont =
109
110        begingroup ;
111
112        save dev;
113
114        save u ; u := 1 ;
115
116        PunkBase  := 0 ;
117
118        pen linepen ; linepen := pencircle scaled (PunkWeight * u) ;
119        pen dotpen  ; dotpen  := linepen scaled 2 slanted -PunkSlant ;
120
121        pickup linepen ;
122
123        save pp ; vardef pp expr z =
124            z + (hdev * normaldeviate, vdev * normaldeviate)
125        enddef ;
126
127        save pd ; def pd expr z =
128            drawdot z withpen dotpen ;
129        enddef ;
130
131        PunkId := PunkId + 1 ;
132
133        lmt_registerglyphs [
134            name     = PunkName, % todo: when we do name = name we get ['"name"'] = name
135            units    = 25,
136            width    = 25,
137            height   = 25,
138            depth    = 0,
139            usecolor = true,
140        ] ;
141
142        def endchar = endpunkchar enddef ;
143
144    enddef ;
145
146    def endpunkfont =
147        endgroup;
148    enddef ;
149
150    % We started out with immediate:
151
152  % def MakePunkFont (expr name, filename, slant, weight, squeeze, extend) =
153  %     begingroup ;
154  %         save PunkName, PunkFileName, PunkSlant, PunkWeight, PunkSqueeze, PunkExend, PunkVariants ;
155  %         string PunkName, PunkFileName ;
156  %         PunkFileName := filename ;
157  %         PunkName     := name ;
158  %         PunkSlant    := slant ;
159  %         PunkWeight   := weight ;
160  %         PunkSqueeze  := squeeze ;
161  %         PunkExtend   := extend ;
162  %         PunkVariants := 0 ;
163  %         beginpunkfont ;
164  %             loadfile(PunkFileName) ;
165  %         endpunkfont ;
166  %     endgroup ;
167  % enddef ;
168  %
169  % MakePunkFont("punk",            "punkfont-characters.mp", 1, 0   ) ;
170  % MakePunkFont("punkbold",        "punkfont-characters.mp", 2, 0   ) ;
171  % MakePunkFont("punkslanted",     "punkfont-characters.mp", 1, 0.15) ;
172  % MakePunkFont("punkboldslanted", "punkfont-characters.mp", 2, 0.15) ;
173
174    % And ended up with delayed:
175
176    def punkpreroll =
177        begingroup ;
178            save PunkName, PunkFileName, PunkSlant, PunkWeight, PunkSqueeze, PunkExtend, PunkVariants ;
179            string PunkName, PunkFileName ;
180            PunkName     := getparameterdefault "mpsfont" "name" "punk" ;
181            PunkFileName := getparameterdefault "mpsfont" "filename" "punkfont-characters.mp" ;
182            PunkSlant    := scantokens(getparameterdefault "mpsfont" "slant" "0") ;
183            PunkWeight   := scantokens(getparameterdefault "mpsfont" "weight" "1") ;
184            PunkSqueeze  := scantokens(getparameterdefault "mpsfont" "squeeze" "1") ;
185            PunkExtend   := scantokens(getparameterdefault "mpsfont" "extend" "1") ;
186            PunkVariants := scantokens(getparameterdefault "mpsfont" "variants" "0");
187            beginpunkfont ;
188                loadfile(PunkFileName) ;
189                if PunkVariants > 0 :
190                    PunkBase := 57344 ; % 0xE000 ; 0xF0000 ;
191                    for i=1 upto PunkVariants :
192                        loadfile(PunkFileName) ;
193                    endfor ;
194                fi ;
195            endpunkfont ;
196        endgroup ;
197    enddef ;
198
199\stopMPcalculation
200
201% Are these names okay? If so it can go into the core.
202
203\permanent\protected\def\enablerandomvariants{\setcharactercasing[randomvariant]}
204\permanent\protected\def\randomvariants      {\groupedcommand\enablerandomvariants\donothing}
205\permanent\protected\def\startrandomvariants {\begingroup\enablerandomvariants}
206\permanent\protected\def\stoprandomvariants  {\endgroup}
207
208\definefontfeature [punk]            [metapost={category=punk,preroll=punkpreroll}]
209\definefontfeature [punkrandom]      [metapost={category=punk,preroll=punkpreroll,variants=10}]
210\definefontfeature [punkbold]        [metapost={category=punk,preroll=punkpreroll,weight=2}]
211\definefontfeature [punkslanted]     [metapost={category=punk,preroll=punkpreroll,slant=.15}]
212\definefontfeature [punkboldslanted] [metapost={category=punk,preroll=punkpreroll,slant=.15,weight=2}]
213\definefontfeature [punkveryslanted] [metapost={category=punk,preroll=punkpreroll,slant=-.15}]
214\definefontfeature [punksqueezed]    [metapost={category=punk,preroll=punkpreroll,squeeze=.5}]
215\definefontfeature [punkextended]    [metapost={category=punk,preroll=punkpreroll,extend=1.3}]
216
217\continueifinputfile{meta-imp-punk.mkxl}
218
219% immediate:
220%
221% \definefontfeature [punk]            [metapost=punk]
222% \definefontfeature [punkbold]        [metapost=punkbold]
223% \definefontfeature [punkslanted]     [metapost=punkslanted]
224% \definefontfeature [punkboldslanted] [metapost=punkboldslanted]
225
226% delayed:
227
228% name=punk
229% filename=punkfont-characters.mp
230
231\setupbodyfont[dejavu]
232
233\definefont[PunkA][Serif*punk]
234\definefont[PunkB][Serif*punkbold]
235\definefont[PunkC][Serif*punkslanted]
236\definefont[PunkD][Serif*punkboldslanted]
237\definefont[PunkE][Serif*punkveryslanted]
238\definefont[PunkF][Serif*punkrandom]
239\definefont[PunkG][Serif*punksqueezed]
240\definefont[PunkH][Serif*punkextended]
241
242\starttext
243
244\startTEXpage[offset=10pt,width=30cm]
245    % \showglyphs
246    {\darkcyan    \PunkA \samplefile{tufte} \par}
247    {\darkmagenta \PunkB \samplefile{tufte} \par}
248    {\darkred     \PunkC \samplefile{tufte} \par}
249    {\darkgreen   \PunkD \samplefile{tufte} \par}
250    {\darkblue    \PunkE \samplefile{tufte} \par}
251    {\darkyellow  \PunkF \enablerandomvariants \samplefile{tufte} \par}
252    {\darkgray    \PunkG \samplefile{tufte} \par}
253    {\darkorange  \PunkH \samplefile{tufte} \par}
254\stopTEXpage
255
256\startTEXpage[offset=10pt,width=20cm]
257    \PunkF \enablerandomvariants
258    \dostepwiserecurse{1}{2000}{1}{\glyphscale#1\relax f }
259\stopTEXpage
260
261% \setupbodyfont[dejavu] % one first needs to load a bodyfont !
262
263\setupbodyfont[punk]
264
265\startTEXpage[offset=10pt,width=20cm]
266    {\darkcyan    \tf \samplefile{zapf} \par}
267    {\darkmagenta \bf \samplefile{zapf} \par}
268    {\darkred     \sl \samplefile{zapf} \par}
269    {\darkgreen   \bs \samplefile{zapf} \par}
270\stopTEXpage
271
272\stoptext
273