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 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). > > > > ___________________________________________________________________________________ > 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 > ___________________________________________________________________________________