Hi Garulfo, Thank you for sharing your nice example: it typesets correctly with mkiv, but it seems to me that with LMTX the text does not appear (at least on my installation of the latest LMTX).
Best regards: Otared > On 24 Dec 2020, at 00:14, Garulfo <garu...@azules.eu> wrote: > > Thanks Taco, > > I made some progress : > https://wiki.contextgarden.net/Talk:Cover_Pages > > I now have two additional questions ... ;-) > > - How can I deal with "space" characters (because current solution > requires to explicitly add the ~ character) > > - What would be the work to do in order to make this mechanism directly > usable in metapost / metafun, within \startMPpage \stopMPpage, > - to avoid switching between \start\stopMPdrawing and TeX > - to have something like "draw followtext" in mp-blob.mpiv ? > > > > %------------------------------------------------------------------------------ > > \setuppapersize [A4] > > %------------------------------------------------------------------------------ > > \def\MyFont{\definedfont[name:% > texgyrepagellabold% > %exo2black% > %agaramondprobold% > *default at 55pt]} > > %------------------------------------------------------------------------------ > > \startluacode > > function document.outlinepaths(character) > local chardata = fonts.hashes.characters[true] -- by unicode > local shapedata = fonts.hashes.shapes[true] -- by index > local c = chardata[character] > if c and c.index and shapedata then > local shapeglyphs = shapedata.glyphs or { } > local glyph = shapeglyphs[c.index] > if glyph and (glyph.segments or glyph.sequence) then > local units = shapedata.units or 1000 > local factor = 100/units > return fonts.metapost.paths(glyph,factor) > end > end > return { } > end > > function document.defineoutline(char,target) > local outlines = document.outlinepaths(char) > local nofpaths = #outlines > context("\\startMPdrawing") -- ADDED by garulfo > context("path %s[] ;",target) > context("numeric %sn ; %sn := %s ;",target,target,nofpaths) > for i=1,nofpaths do > context("%s[%i] := %s ; ",target,i,outlines[i]) > end > context("\\stopMPdrawing") -- ADDED by garulfo > end > > \stopluacode > > %------------------------------------------------------------------------------ > > \def\mpdefineoutlines#1#2{\ctxlua{document.defineoutline(\number`#1,"#2")}} > > %------------------------------------------------------------------------------ > > \def\EmptyLetters#1% > {% > \resetMPdrawing > \MPtoks={} > % > \startMPdrawing > picture pic[], pictA ; > numeric wid[], len[], pos[], n ; > wid[0] := len[0] := pos[0] := n := 0 ; > numeric scaling; > path pictB , frame ; > pair shiftB ; > picture monImageA; monImageA := nullpicture; > picture monImageB; monImageB := nullpicture; > color colorframe; colorframe := 0.6white; > % > \stopMPdrawing > % > \MyFont\handletokens#1\with\whatever > % > \startMPdrawing > frame := unitsquare > xscaled ( (xpart urcorner monImageB - xpart llcorner monImageB) + > 5mm ) > yscaled ( (ypart urcorner monImageB - ypart llcorner monImageB) + > 5mm ); > frame := frame shifted (center monImageB - center frame); > addto monImageB contour > frame > withpostscript "evenodd" > withcolor transparent (1,1.,colorframe); > draw monImageB ; > draw monImageA ; > \stopMPdrawing > % > \MPdrawingdonetrue > \getMPdrawing} > > %------------------------------------------------------------------------------ > > \def\whatever#1% > {\appendtoks#1\to\MPtoks > \setbox\MPbox=\hbox{\MyFont\the\MPtoks}% > % > \startMPdrawing > n := n + 1 ; len[n] := \the\wd\MPbox ; > \stopMPdrawing > % > \mpdefineoutlines{M}{MaLettre} > % > \startMPdrawing > pictA := textext.drt("\MyFont M") ; > pictB := MaLettre[1]; > scaling := bbheight pictA / bbheight pictB; > \stopMPdrawing > % > \doifinstringelse{~}{#1}{}{% HOW TO PROPERLY COPE WITH > SPACES ? > \mpdefineoutlines{#1}{MyGlyph} > % > \startMPdrawing > string sb; sb := "i"; > pic[n] := textext.drt("\MyFont\setstrut\strut#1") ; > % > shiftB := - llcorner pic[n]; > pic[n] := pic[n] shifted shiftB ; > % > wid[n] := abs(xpart urcorner pic[n] - xpart llcorner pic[n]) ; > pos[n] := len[n]-wid[n] ; > % > addto monImageB contour > ((MyGlyph[1] scaled scaling) > shifted ( (pos[n],0) + shiftB)) > withpostscript "collect"; > % > if MyGlyphn > 1 : > for ind=2 upto MyGlyphn : > if (((xpart llcorner MyGlyph[ind]) > (xpart llcorner MyGlyph[1])) > and > ((ypart llcorner MyGlyph[ind]) > (ypart llcorner MyGlyph[1])) > and > ((xpart urcorner MyGlyph[ind]) < (xpart urcorner MyGlyph[1])) > and > ((ypart urcorner MyGlyph[ind]) < (ypart urcorner MyGlyph[1]))) > : > % > addto monImageA contour > (MyGlyph[ind] scaled scaling) > shifted ( (pos[n],0) + shiftB) > withcolor transparent (1,1.,colorframe); > else : > addto monImageB contour > (MyGlyph[ind] scaled scaling) > shifted ( (pos[n],0) + shiftB) > withpostscript "collect"; > fi; > endfor; > fi; > \stopMPdrawing}} > > > %============================================================================== > %============================================================================== > > \starttext > > %------------------------------------------------------------------------------ > > \startuseMPgraphic{MyBackgroundGraphic} > path pathbackground ; > numeric dimA ; dimA := \the\paperwidth; > numeric dimB ; dimB := \the\paperheight; > pathbackground := unitsquare xscaled dimA yscaled dimB ; > fill pathbackground > withshademethod "linear" > withshadedirection(0,1) > withshadecolors (red,blue); > \stopuseMPgraphic > > %------------------------------------------------------------------------------ > > \definelayer[MyBackgroundLayer] > \setlayer[MyBackgroundLayer]{\useMPgraphic{MyBackgroundGraphic}} > \setupbackgrounds[page][background={MyBackgroundLayer}] > > %------------------------------------------------------------------------------ > > \EmptyLetters{MetaPost~is~fun!} > \EmptyLetters{ABCDEFGHIJ} > \EmptyLetters{KLMNOPQRST} > \EmptyLetters{UVWXYZ!?\&*} > \EmptyLetters{abcdefghij} > \EmptyLetters{klmnopqrst} > \EmptyLetters{uvwxyz<>;:@} > \EmptyLetters{0123456789} > > %------------------------------------------------------------------------------ > > \stoptext > > > > Le 21/12/2020 à 16:29, Taco Hoekwater a écrit : >>> On 21 Dec 2020, at 16:09, Garulfo <garu...@azules.eu> wrote: >>> >>> Hi, >>> >>> >>> * I try to "remove the paths of text" from a metapost pictures to let >>> the background visible. >>> >>> * Using >>> https://mailman.ntg.nl/pipermail/ntg-context/2018/thread.html#92725 >>> >>> * I was able to get the following with one glyph (MVE code below) >>> >>> https://wiki.contextgarden.net/images/d/d2/test_extract_glyphs.pdf >>> >>> >>> 2 questions: >>> >>> 1/ for some fonts (e.g. dejavu vs latin modern) the "encompassing" path >>> of the B glyph can switch from B[1] to B[Bn]. Is there a trick to >>> identify which id match with "the encompassing" path ? >> What you get is the order of the paths as defined in the font, which is >> arbitrary, as you discovered. >> A quick trick (that will not always work, but should work quite well for >> font variations of alphabetics) is to check the actual arclength of the >> paths. The longest one will typically be the outer one. >> But much depends on the font, so a generic solution is likely quite >> complicated. Consider an outline font’s colon glyph ;) >>> >>> 2/ now, I would like to do the same, but for text... a kind of >>> derivative of "textext" or "outlinetext". >>> Would you please give me some guidelines ? >>> does it already exist ? >>> should I use something like \handletokens, \scantokens ? >>> do you have examples where I can get inspiration ? >>> >>> >>> Thanks again for your help, >>> Garulfo >>> >>> >>> %============================================================================== >>> >>> >>> >>> >>> \starttext >>> >>> %------------------------------------------------------------------------------ >>> >>> \startluacode >>> >>> function document.outlinepaths(character) >>> local chardata = fonts.hashes.characters[true] -- by unicode >>> local shapedata = fonts.hashes.shapes[true] -- by index >>> local c = chardata[character] >>> if c and c.index and shapedata then >>> local shapeglyphs = shapedata.glyphs or { } >>> local glyph = shapeglyphs[c.index] >>> if glyph and (glyph.segments or glyph.sequence) then >>> local units = shapedata.units or 1000 >>> local factor = 100/units >>> return fonts.metapost.paths(glyph,factor) >>> end >>> end >>> return { } >>> end >>> >>> function document.defineoutline(char,target) >>> local outlines = document.outlinepaths(char) >>> local nofpaths = #outlines >>> context("path %s[] ;",target) >>> context("numeric %sn ; %sn := %s ;",target,target,nofpaths) >>> for i=1,nofpaths do >>> context("%s[%i] := %s ; ",target,i,outlines[i]) >>> end >>> end >>> >>> \stopluacode >>> >>> %------------------------------------------------------------------------------ >>> >>> \def\mpdefineoutlines#1#2{\ctxlua{document.defineoutline(\number`#1,"#2")}} >>> >>> %------------------------------------------------------------------------------ >>> >>> \startMPpage >>> >>> numeric dimA ; dimA := 20cm; >>> >>> path pathbackground ; >>> pathbackground := unitsquare scaled dimA ; >>> fill pathbackground withshademethod "linear" withshadedirection(0,1) >>> withshadecolors (red,blue); >>> >>> %-------------------------------------- >>> >>> \mpdefineoutlines{B}{B} >>> >>> %-------------------------------------- >>> >>> numeric dimB ; dimB := 2cm; >>> numeric vratio ; vratio := 2; >>> >>> path frame ; >>> frame := unitsquare >>> xscaled (dimA - 2 * dimB) >>> yscaled (dimA / vratio) >>> shifted (dimB , (dimA - (dimA / vratio))/2 ); >>> >>> %-------------------------------------- >>> >>> pair shift ; shift := center frame; >>> numeric scal ; scal := (0.9) * (10cm / (bbheight B[1])) ; >>> >>> picture monImageB; monImageB := nullpicture; >>> addto monImageB contour >>> (B[1] shifted (- center B[1]) scaled scal) >>> shifted shift >>> withpostscript "collect"; >>> >>> addto monImageB contour >>> frame >>> withpostscript "evenodd"; >>> >>> for i=2 upto Bn : >>> addto monImageB contour >>> (B[i] shifted (- center B[1]) scaled scal) >>> shifted shift; >>> endfor ; >>> >>> %-------------------------------------- >>> >>> draw monImageB withcolor white; >>> >>> \stopMPpage >>> >>> \stoptext >>> ___________________________________________________________________________________ >>> If your question is of interest to others as well, please add an entry to >>> the Wiki! >>> >>> maillist : ntg-context@ntg.nl / >>> http://www.ntg.nl/mailman/listinfo/ntg-context >>> webpage : http://www.pragma-ade.nl / http://context.aanhet.net >>> archive : https://bitbucket.org/phg/context-mirror/commits/ >>> wiki : http://contextgarden.net >>> ___________________________________________________________________________________ >> Taco Hoekwater >> Elvenkind BV >> ___________________________________________________________________________________ >> If your question is of interest to others as well, please add an entry to >> the Wiki! >> maillist : ntg-context@ntg.nl / >> http://www.ntg.nl/mailman/listinfo/ntg-context >> webpage : http://www.pragma-ade.nl / http://context.aanhet.net >> archive : https://bitbucket.org/phg/context-mirror/commits/ >> wiki : http://contextgarden.net >> ___________________________________________________________________________________ > ___________________________________________________________________________________ > If your question is of interest to others as well, please add an entry to the > Wiki! > > maillist : ntg-context@ntg.nl / http://www.ntg.nl/mailman/listinfo/ntg-context > webpage : http://www.pragma-ade.nl / http://context.aanhet.net > archive : https://bitbucket.org/phg/context-mirror/commits/ > wiki : http://contextgarden.net > ___________________________________________________________________________________ ___________________________________________________________________________________ If your question is of interest to others as well, please add an entry to the Wiki! maillist : ntg-context@ntg.nl / http://www.ntg.nl/mailman/listinfo/ntg-context webpage : http://www.pragma-ade.nl / http://context.aanhet.net archive : https://bitbucket.org/phg/context-mirror/commits/ wiki : http://contextgarden.net ___________________________________________________________________________________