Thanks to Taco, the solution was to simply use: function doubleQuotableEscapedConTeXtString( str) local rep = { [1] = { '{', '{\\textbraceleft}' }, [2] = { '}', '{\\textbraceright}' }, [3] = { '#', '{\\texthash}' }, [4] = { '$', '{\\textdollar}' }, [5] = { '&', '{\\textampersand}' }, [6] = { '%', '{\\textpercent}' }, [7] = { '\\','{\\textbackslash}' }, [8] = { '|', '{\\textbar}' }, [9] = { '_', '{\\textunderscore}' }, [10] = { '~', '{\\textasciitilde}' }, [11] = { '^', '{\\textasciicircum}' }, [12] = { '"', "\"&ditto&\"" }, } return lpeg.replacer(rep):match(str) end
And the string becomes something that can safely be given toi METAPOST and safely handled by TeX when called from METAPOST via textext() G > On 2 Apr 2020, at 14:05, Gerben Wierda <gerben.wie...@rna.nl> wrote: > > Here is a minimum example of a problem that I have in getting curly braces > printed in METAPOST in code that is generated by lua. > > Any help is welcome. > > \usemodule[scite] > \setupxml > [entities=yes] > > > \startluacode > > function warn( ... ) > texio.write_nl("-----> " .. string.format(...)) > end > > local function mpLabelString( xmlLabelString) > -- Returns a string where each " is replaced by a METAPOST compatible > result, except for outer double quotes" > rep = { > [1] = { "\"", "\"&ditto&\"" }, > -- DOESN'T WORK: [2] = { "\\", "\\\\" }, > } > local tmpString = string.formatters( "%!tex!", xmlLabelString) > warn( "STRING.FORMAT XML \"%s\"", xmlLabelString) > warn( "STRING.FORMAT TeX-ed \"%s\"", tmpString) > warn( "STRING.FORMAT Replaced \"%s\"", lpeg.replacer(rep):match(tmpString)) > return lpeg.replacer(rep):match(tmpString) > end > > function warnAndConTeXt( ...) > warn( ...) > context( ...) > end > > function moduledata.test( filename) > local labelString > context( "The string to typeset is:\\par\\type-{Label} \"a\" [Text]!-") > context( "\\par The attempts are:") > context( "\\par1. \\type-Label Text-") > context( "\\par2. \\type-Label [Text]!-") > context( "\\par3. \\type-Label \"a\" [Text]!-") > context( "\\par4. \\type-{Label} [Text]!-") > context( "\\par5. \\type-{Label} \"a\" [Text]!-") > context.startMPpage { instance = "doublefun" } > context( "picture pic;") > labelString = "1. Label Text OK" > warnAndConTeXt( "pic := Foo( 0, 0, 150, 50, \"%s\");", mpLabelString( > labelString)) > labelString = "2. Label [Text]! OK" > warnAndConTeXt( "pic := Foo( 0, -75, 150, 50, \"%s\");", mpLabelString( > labelString)) > labelString = "3. Label \"a\" [Text]! OK" > warnAndConTeXt( "pic := Foo( 0, -150, 150, 50, \"%s\");", mpLabelString( > labelString)) > labelString = "4. {Label} [Text]! MISSING curly braces" > warnAndConTeXt( "pic := Foo( 0, -225, 150, 50, \"%s\");", mpLabelString( > labelString)) > labelString = "5. {Label} \"a\" [Text]! MISSING curly braces" > warnAndConTeXt( "pic := Foo( 0, -300, 150, 50, \"%s\");", mpLabelString( > labelString)) > context( "drawdot (0,0) withpen pencircle scaled 4 withcolor red;") > context.stopMPpage() > end > \stopluacode > > \usemodule[article-basic] > %\enabletrackers[metapost.tracingall,metapost.lua,metapost.runs,metapost.textexts,metapost.scrintersectionPoints,metapost.runs,metapost.graphics,metapost.terminal] > > \starttext > > \definefontfamily[mainface][rm][Optima] > \setupbodyfont[mainface,10pt] > > \startMPinclusions[+]{doublefun} > > \stopMPinclusions > > \startMPdefinitions{doublefun} > vardef makeTeXLabel( expr w, h, name) = > show "NAME makeTeXLabel:", name; > save p; picture p ; > save s; string s; > s := "\framed{" & name & "}"; % Curly braces will be missing. I need this > to work. > % s := "\type-" & name & "-"; % Curly braces are displayed, but this must > become a vbox in the end, so can't use it > show "SCAN:", s; > p := textext( s); > p > enddef; > > vardef Foo( expr xpos, ypos, width, height, str) = > show "NAME Foo:", str; % Backslashes are already gone here > save pic; picture pic; > pic := makeTeXLabel( width, height, str) shifted (xpos, ypos); > draw pic; > pic > enddef; > > \stopMPdefinitions > > \ctxlua{moduledata.test("My ArchiMate Model Export BES.xml")} > \typefile[option=TEX]{test11.tex} > > \stoptext > > The question is: how can I get this to work? The strings that have to be > printed inside the METAPOST picture come from an XML and can contain about > anything. But in the end that string will have to be vertically typeset as a > paragraph, hence I cannot use \type (which works). > > <test11.tex> > > ___________________________________________________________________________________ > 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 ___________________________________________________________________________________