From f86b1ec82bbbba1a96989bb5d6f5b78e261659a1 Mon Sep 17 00:00:00 2001 From: "Maxime Chupin (escudo)" Date: Wed, 23 Nov 2016 22:44:11 +0100 Subject: [PATCH] =?utf8?q?Mise=20=C3=A0=20jour=20de=20la=20version=20utili?= =?utf8?q?sant=20le=20moteur=20tikz?= MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit --- luamesh.lua | 188 ++++++++++++++++++++++++++++++++++----------- luamesh.sty | 26 +++---- test/animation.pdf | Bin 40141 -> 40141 bytes test/delaunay.pdf | Bin 20587 -> 45045 bytes test/delaunay.tex | 79 ++++++++++++++++--- 5 files changed, 226 insertions(+), 67 deletions(-) diff --git a/luamesh.lua b/luamesh.lua index ad6ec6f..c8ffc51 100644 --- a/luamesh.lua +++ b/luamesh.lua @@ -253,17 +253,25 @@ function rectangleList(a,b,nbrA,nbrB) end -- trace a triangulation with TikZ -function traceMeshTikZ(listPoints, triangulation,points,color) +function traceMeshTikZ(listPoints, triangulation,points,color,colorBbox) output = "" for i=1,#triangulation do PointI = listPoints[triangulation[i][1]] PointJ = listPoints[triangulation[i][2]] PointK = listPoints[triangulation[i][3]] - output = output .. "\\draw[color="..color.."] (".. PointI.x ..",".. PointI.y ..")--("..PointJ.x..",".. PointJ.y ..")--("..PointK.x..",".. PointK.y ..")--cycle;" + if(triangulation[i].type == "bbox") then + output = output .. "\\draw[color="..colorBbox.."] (".. PointI.x ..",".. PointI.y ..")--("..PointJ.x..",".. PointJ.y ..")--("..PointK.x..",".. PointK.y ..")--cycle;" + else + output = output .. "\\draw[color="..color.."] (".. PointI.x ..",".. PointI.y ..")--("..PointJ.x..",".. PointJ.y ..")--("..PointK.x..",".. PointK.y ..")--cycle;" + end end if(points=="points") then for i=1,#listPoints do - output = output .. "\\draw[color=".."] (" .. listPoints[i].x ..",".. listPoints[i].y .. ") node {$\\bullet$} node[anchor=north east] {$\\MeshPoint_{" .. i .. "}$};" + if(listPoints[i].type == "bbox") then + output = output .. "\\draw[color="..colorBbox.."] (" .. listPoints[i].x ..",".. listPoints[i].y .. ") node {$\\bullet$} node[anchor=north east] {$\\MeshPoint_{" .. i .. "}$};" + else + output = output .. "\\draw[color="..color.."] (" .. listPoints[i].x ..",".. listPoints[i].y .. ") node {$\\bullet$} node[anchor=north east] {$\\MeshPoint_{" .. i .. "}$};" + end end end return output @@ -303,6 +311,43 @@ function traceMeshMP(listPoints, triangulation,points) end +-- buildMesh with MP +function buildMeshMPBW(chaine,mode,points,bbox,scale) + listPoints = buildList(chaine, mode) + triangulation = BowyerWatson(listPoints,bbox) + output = traceMeshMP(listPoints, triangulation,points) + output = "\\leavevmode\\begin{mplibcode}beginfig(0);u:="..scale.. ";" .. output .."endfig;\\end{mplibcode}" + tex.sprint(output) +end + +-- buildMesh with MP include code +function buildMeshMPBWinc(chaine,beginning, ending,mode,points,bbox,scale) + listPoints = buildList(chaine, mode) + triangulation = BowyerWatson(listPoints,bbox) + output = traceMeshMP(listPoints, triangulation,points) + output = "\\leavevmode\\begin{mplibcode}u:="..scale..";"..beginning .. output .. ending .. "\\end{mplibcode}" + tex.sprint(output) +end + +-- buildMesh with TikZ +function buildMeshTikZBW(chaine,mode,points,bbox,scale,color,colorBbox) + listPoints = buildList(chaine, mode) + triangulation = BowyerWatson(listPoints,bbox) + output = traceMeshTikZ(listPoints, triangulation,points,color,colorBbox) + output = "\\noindent\\begin{tikzpicture}[x=" .. scale .. ",y=" .. scale .."]" .. output .."\\end{tikzpicture}" + tex.sprint(output) +end + +-- buildMesh with TikZ +function buildMeshTikZBWinc(chaine,beginning, ending,mode,points,bbox,scale,color,colorBbox) + listPoints = buildList(chaine, mode) + triangulation = BowyerWatson(listPoints,bbox) + output = traceMeshTikZ(listPoints, triangulation,points,color,colorBbox) + output = "\\noindent\\begin{tikzpicture}[x=" .. scale .. ",y=" .. scale .."]" ..beginning.. output..ending .."\\end{tikzpicture}" + tex.sprint(output) +end + + -- print points of the mesh function tracePointsMP(listPoints,points) output = ""; @@ -323,36 +368,36 @@ function tracePointsMP(listPoints,points) else for i=1,#listPoints do if(listPoints[i].type == "bbox") then - output = output .. "drawdot (" .. listPoints[i].x ..",".. listPoints[i].y .. ")*u ) withcolor \\luameshmpcolorBbox ;" + output = output .. "drawdot (" .. listPoints[i].x ..",".. listPoints[i].y .. ")*u withcolor \\luameshmpcolorBbox withpen pencircle scaled 3;" else - output = output .. "drawdot (" .. listPoints[i].x ..",".. listPoints[i].y .. ")*u ) withcolor \\luameshmpcolor ;" + output = output .. "drawdot (" .. listPoints[i].x ..",".. listPoints[i].y .. ")*u withcolor \\luameshmpcolor withpen pencircle scaled 3;" end end end return output end - - --- buildMesh with TikZ -function buildMeshTikZ(chaine,mode,points,bbox,full,scale,color) - listPoints = buildList(chaine, mode) - triangulation = BowyerWatson(listPoints,bbox) - output = traceMeshTikZ(listPoints, triangulation,points,color) - if(full=="full") then - output = "\\noindent\\begin{tikzpicture}[x=" .. scale .. ",y=" .. scale .."]" .. output .."\\end{tikzpicture}" +-- print points of the mesh +function tracePointsTikZ(listPoints,points,color,colorBbox) + output = ""; + if(points=="points") then + for i=1,#listPoints do + if(listPoints[i].type == "bbox") then + output = output .. "\\draw[color="..colorBbox.."] (" .. listPoints[i].x ..",".. listPoints[i].y .. ") node {$\\bullet$} node[anchor=north east] {$\\MeshPoint_{" .. i .. "}$};" + else + output = output .. "\\draw[color="..color.."] (" .. listPoints[i].x ..",".. listPoints[i].y .. ") node {$\\bullet$} node[anchor=north east] {$\\MeshPoint_{" .. i .. "}$};" + end + end + else + for i=1,#listPoints do + if(listPoints[i].type == "bbox") then + output = output .. "\\draw[color="..colorBbox.."] (" .. listPoints[i].x ..",".. listPoints[i].y .. ") node {$\\bullet$} ;" + else + output = output .. "\\draw[color="..color.."] (" .. listPoints[i].x ..",".. listPoints[i].y .. ") node {$\\bullet$} ;" + end + end end - tex.sprint(output) -end - - --- buildMesh with MP -function buildMeshMPBW(chaine,mode,points,bbox,scale) - listPoints = buildList(chaine, mode) - triangulation = BowyerWatson(listPoints,bbox) - output = traceMeshMP(listPoints, triangulation,points) - output = "\\leavevmode\\begin{mplibcode}beginfig(0);u:="..scale.. ";" .. output .."endfig;\\end{mplibcode}" - tex.sprint(output) + return output end -- print points to mesh @@ -378,16 +423,30 @@ function printPointsMPinc(chaine,beginning, ending, mode,points,bbox,scale) tex.sprint(output) end +-- print points to mesh +function printPointsTikZ(chaine,mode,points,bbox,scale,color,colorBbox) + listPoints = buildList(chaine, mode) + if(bbox == "bbox" ) then + listPoints = buildBoundingBox(listPoints) + end + output = tracePointsTikZ(listPoints,points,color,colorBbox) + output = "\\noindent\\begin{tikzpicture}[x=" .. scale .. ",y=" .. scale .."]" .. output .."\\end{tikzpicture}" + tex.sprint(output) +end + --- buildMesh with MP include code -function buildMeshMPBWinc(chaine,beginning, ending,mode,points,bbox,scale) +-- print points to mesh +function printPointsTikZinc(chaine,beginning, ending, mode,points,bbox,scale,color,colorBbox) listPoints = buildList(chaine, mode) - triangulation = BowyerWatson(listPoints,bbox) - output = traceMeshMP(listPoints, triangulation,points) - output = "\\begin{mplibcode}u:="..scale..";"..beginning .. output .. ending .. "\\end{mplibcode}" + if(bbox == "bbox" ) then + listPoints = buildBoundingBox(listPoints) + end + output = tracePointsTikZ(listPoints,points,color,colorBbox) + output = "\\noindent\\begin{tikzpicture}[x=" .. scale .. ",y=" .. scale .."]" ..beginning.. output..ending .."\\end{tikzpicture}" tex.sprint(output) end + -- buildMesh function buildRect(largeur,a,b,nbrA, nbrB) listPoints = rectangleList(a,b,nbrA,nbrB) @@ -417,7 +476,6 @@ function cleanPoly(polygon) i=1 find = false while (i<=#polyCopy and find==false) do - i = i+1 bool1 = (polyCopy[i][1] == polyNew[j]) bool2 = (polyCopy[i][2] == polyNew[j]) if(bool1 or bool2) then -- the edge has a common point with polyNew[j] @@ -433,17 +491,15 @@ function cleanPoly(polygon) j = j+1 end end + i=i+1 end end return polyNew end -- -function TeXaddOnePointTikZ(chaine,point,step,color,colorBack, colorNew, colorCircle) - Sx,Sy=string.match(point,"%((.+),(.+)%)") - P = {x=Sx, y=Sy} +function TeXaddOnePointTikZ(chaine,point,step,color,colorBack, colorNew, colorCircle,colorBbox) output = "" - listPoints = buildList(chaine, "int") -- build the triangulation triangulation = BowyerWatson(listPoints,"none") badTriangles = buildBadTriangles(P,triangulation) @@ -453,7 +509,11 @@ function TeXaddOnePointTikZ(chaine,point,step,color,colorBack, colorNew, colorCi PointI = listPoints[triangulation[i][1]] PointJ = listPoints[triangulation[i][2]] PointK = listPoints[triangulation[i][3]] - output = output .. "\\draw[color="..color.."] (".. PointI.x ..",".. PointI.y ..")--("..PointJ.x..",".. PointJ.y ..")--("..PointK.x..",".. PointK.y ..")--cycle;" + if(triangulation[i].type == "bbox") then + output = output .. "\\draw[color="..colorBbox.."] (".. PointI.x ..",".. PointI.y ..")--("..PointJ.x..",".. PointJ.y ..")--("..PointK.x..",".. PointK.y ..")--cycle;" + else + output = output .. "\\draw[color="..color.."] (".. PointI.x ..",".. PointI.y ..")--("..PointJ.x..",".. PointJ.y ..")--("..PointK.x..",".. PointK.y ..")--cycle;" + end end -- draw and fill the bad triangle for i=1,#badTriangles do @@ -472,7 +532,11 @@ function TeXaddOnePointTikZ(chaine,point,step,color,colorBack, colorNew, colorCi end -- mark the points for i=1,#listPoints do - output = output .. "\\draw[color ="..color.."] (" .. listPoints[i].x ..",".. listPoints[i].y .. ") node {$\\bullet$} node[anchor=north east] {$\\MeshPoint_{" .. i .. "}$};" + if(listPoints[i].type == "bbox") then + output = output .. "\\draw[color="..colorBbox.."] (" .. listPoints[i].x ..",".. listPoints[i].y .. ") node {$\\bullet$} node[anchor=north east] {$\\MeshPoint_{" .. i .. "}$};" + else + output = output .. "\\draw[color="..color.."] (" .. listPoints[i].x ..",".. listPoints[i].y .. ") node {$\\bullet$} node[anchor=north east] {$\\MeshPoint_{" .. i .. "}$};" + end end -- mark the point to add output = output .. "\\draw[color="..colorNew.."] (" .. P.x ..",".. P.y .. ") node {$\\bullet$} node[anchor=north east] {$\\NewPoint$};" @@ -488,7 +552,11 @@ function TeXaddOnePointTikZ(chaine,point,step,color,colorBack, colorNew, colorCi PointI = listPoints[triangulation[i][1]] PointJ = listPoints[triangulation[i][2]] PointK = listPoints[triangulation[i][3]] - output = output .. "\\draw[color="..color.."] (".. PointI.x ..",".. PointI.y ..")--("..PointJ.x..",".. PointJ.y ..")--("..PointK.x..",".. PointK.y ..")--cycle;" + if(triangulation[i].type == "bbox") then + output = output .. "\\draw[color="..colorBbox.."] (".. PointI.x ..",".. PointI.y ..")--("..PointJ.x..",".. PointJ.y ..")--("..PointK.x..",".. PointK.y ..")--cycle;" + else + output = output .. "\\draw[color="..color.."] (".. PointI.x ..",".. PointI.y ..")--("..PointJ.x..",".. PointJ.y ..")--("..PointK.x..",".. PointK.y ..")--cycle;" + end end -- fill and draw the cavity path = "" @@ -499,7 +567,11 @@ function TeXaddOnePointTikZ(chaine,point,step,color,colorBack, colorNew, colorCi output = output .. "\\draw[color="..colorNew..",fill ="..colorBack..", thick] " .. path .. "cycle;" -- mark the points of the mesh for i=1,#listPoints do - output = output .. "\\draw[color="..color.."] (" .. listPoints[i].x ..",".. listPoints[i].y .. ") node {$\\bullet$} node[anchor=north east] {$\\MeshPoint_{" .. i .. "}$};" + if(listPoints[i].type == "bbox") then + output = output .. "\\draw[color="..colorBbox.."] (" .. listPoints[i].x ..",".. listPoints[i].y .. ") node {$\\bullet$} node[anchor=north east] {$\\MeshPoint_{" .. i .. "}$};" + else + output = output .. "\\draw[color="..color.."] (" .. listPoints[i].x ..",".. listPoints[i].y .. ") node {$\\bullet$} node[anchor=north east] {$\\MeshPoint_{" .. i .. "}$};" + end end -- mark the adding point output = output .. "\\draw[color="..colorNew.."] (" .. P.x ..",".. P.y .. ") node {$\\bullet$} node[anchor=north east] {$\\NewPoint$};" @@ -515,7 +587,11 @@ function TeXaddOnePointTikZ(chaine,point,step,color,colorBack, colorNew, colorCi PointI = listPoints[triangulation[i][1]] PointJ = listPoints[triangulation[i][2]] PointK = listPoints[triangulation[i][3]] - output = output .. "\\draw[color ="..color.."] (".. PointI.x ..",".. PointI.y ..")--("..PointJ.x..",".. PointJ.y ..")--("..PointK.x..",".. PointK.y ..")--cycle;" + if(triangulation[i].type == "bbox") then + output = output .. "\\draw[color="..colorBbox.."] (".. PointI.x ..",".. PointI.y ..")--("..PointJ.x..",".. PointJ.y ..")--("..PointK.x..",".. PointK.y ..")--cycle;" + else + output = output .. "\\draw[color="..color.."] (".. PointI.x ..",".. PointI.y ..")--("..PointJ.x..",".. PointJ.y ..")--("..PointK.x..",".. PointK.y ..")--cycle;" + end end -- fill and draw the cavity path = "" @@ -532,7 +608,11 @@ function TeXaddOnePointTikZ(chaine,point,step,color,colorBack, colorNew, colorCi end -- mark points for i=1,#listPoints do - output = output .. "\\draw[color="..color.."] (" .. listPoints[i].x ..",".. listPoints[i].y .. ") node {$\\bullet$} node[anchor=north east] {$\\MeshPoint_{" .. i .. "}$};" + if(listPoints[i].type == "bbox") then + output = output .. "\\draw[color="..colorBbox.."] (" .. listPoints[i].x ..",".. listPoints[i].y .. ") node {$\\bullet$} node[anchor=north east] {$\\MeshPoint_{" .. i .. "}$};" + else + output = output .. "\\draw[color="..color.."] (" .. listPoints[i].x ..",".. listPoints[i].y .. ") node {$\\bullet$} node[anchor=north east] {$\\MeshPoint_{" .. i .. "}$};" + end end -- mark the added point output = output .. "\\draw[color="..colorNew.."] (" .. P.x ..",".. P.y .. ") node {$\\bullet$} node[anchor=north east] {$\\NewPoint$};" @@ -691,12 +771,34 @@ function buildListExt(chaine, stop) end -function TeXOnePointTikZ(chaine,point,step,color,colorBack,colorNew,colorCircle,scale) - output = TeXaddOnePointTikZ(chaine,point,step,color,colorBack,colorNew,colorCircle) +function TeXOnePointTikZBW(chaine,point,step,scale,mode,bbox,color,colorBack,colorNew,colorCircle,colorBbox) + if(mode=="int") then + Sx,Sy=string.match(point,"%((.+),(.+)%)") + P = {x=Sx, y=Sy} + listPoints = buildList(chaine, mode) + else + -- point is a number + P, listPoints = buildListExt(chaine,tonumber(point)) + end + output = TeXaddOnePointTikZ(chaine,point,step,color,colorBack,colorNew,colorCircle,colorBbox) output = "\\noindent\\begin{tikzpicture}[x="..scale..",y="..scale.."]".. output .. "\\end{tikzpicture}" tex.sprint(output) end +function TeXOnePointTikZBWinc(chaine,point,beginning, ending,step,scale,mode,bbox,color,colorBack,colorNew,colorCircle,colorBbox) + if(mode=="int") then + Sx,Sy=string.match(point,"%((.+),(.+)%)") + P = {x=Sx, y=Sy} + listPoints = buildList(chaine, mode) + else + -- point is a number + P, listPoints = buildListExt(chaine,tonumber(point)) + end + output = TeXaddOnePointTikZ(chaine,point,step,color,colorBack,colorNew,colorCircle,colorBbox) + output = "\\noindent\\begin{tikzpicture}[x="..scale..",y="..scale.."]".. beginning..output ..ending.. "\\end{tikzpicture}" + tex.sprint(output) +end + function TeXOnePointMPBW(chaine,point,step,scale,mode,bbox) if(mode=="int") then Sx,Sy=string.match(point,"%((.+),(.+)%)") diff --git a/luamesh.sty b/luamesh.sty index 006b254..7133ddb 100644 --- a/luamesh.sty +++ b/luamesh.sty @@ -80,17 +80,17 @@ % (x1,y1);(x2,y2);... or the name file containing the points % #3 : the code to place before the generated one % #4 : the code to place after the generated one - \setkeys{buildMesh}{#1} % + \setkeys{buildMeshInc}{#1} % \def\MeshPoint{\luameshval@bmi@meshpoint}% - \ifKV@buildMesh@tikz% if we are using tikz + \ifKV@buildMeshInc@tikz% if we are using tikz \directlua{% - buildMeshTikZ("#2","\luameshval@bmi@mode","\luameshval@bmi@print","\luameshval@bmi@bbox","full","\luameshval@bmi@scale","\luameshval@bmi@color")% + buildMeshTikZBWinc("#2","\luaescapestring{\unexpanded{#3}}","\luaescapestring{\unexpanded{#4}}","\luameshval@bmi@mode","\luameshval@bmi@print","\luameshval@bmi@bbox","\luameshval@bmi@scale","\luameshval@bmi@color","\luameshval@bmi@colorbbox")% }% \else % we are using MP \mplibcolor{\luameshmpcolor}{\luameshval@bmi@color} \mplibcolor{\luameshmpcolorBbox}{\luameshval@bmi@colorbbox} \directlua{% - buildMeshMPBWinc("#2","#3","#4","\luameshval@bmi@mode","\luameshval@bmi@print","\luameshval@bmi@bbox","\luameshval@bmi@scale")% + buildMeshMPBWinc("#2","\luaescapestring{\unexpanded{#3}}","\luaescapestring{\unexpanded{#4}}","\luameshval@bmi@mode","\luameshval@bmi@print","\luameshval@bmi@bbox","\luameshval@bmi@scale")% }% % \fi% @@ -142,7 +142,7 @@ \def\MeshPoint{\luameshval@bm@meshpoint}% \ifKV@buildMesh@tikz% if we are using tikz \directlua{% - buildMeshTikZ("#2","\luameshval@bm@mode","\luameshval@bm@print","\luameshval@bm@bbox","full","\luameshval@bm@scale","\luameshval@bm@color")% + buildMeshTikZBW("#2","\luameshval@bm@mode","\luameshval@bm@print","\luameshval@bm@bbox","\luameshval@bm@scale","\luameshval@bm@color","\luameshval@bm@colorbbox")% }% \else % we are using MP \mplibcolor{\luameshmpcolor}{\luameshval@bm@color} @@ -200,9 +200,9 @@ % (x1,y1);(x2,y2);... or the name file containing the points \setkeys{tracePoints}{#1} % \def\MeshPoint{\luameshval@tp@meshpoint}% - \ifKV@buildMesh@tikz% if we are using tikz + \ifKV@tracePoints@tikz% if we are using tikz \directlua{% - % buildMeshTikZ("#2","\luameshval@tp@mode","\luameshval@tp@print","\luameshval@tp@bbox","full","\luameshval@tp@scale","\luameshval@tp@color")% + printPointsTikZ("#2","\luameshval@tp@mode","\luameshval@tp@print","\luameshval@tp@bbox","\luameshval@tp@scale","\luameshval@tp@color","\luameshval@tp@colorbbox")% }% \else % we are using MP \mplibcolor{\luameshmpcolor}{\luameshval@tp@color} @@ -272,7 +272,7 @@ \mplibcolor{\luameshmpcolor}{\luameshval@tpi@color} \mplibcolor{\luameshmpcolorBbox}{\luameshval@tpi@colorbbox} \directlua{% - printPointsMPinc("#2","#3","#4","\luameshval@tpi@mode","\luameshval@tpi@print","\luameshval@tpi@bbox","\luameshval@tpi@scale")% + printPointsMPinc("#2","\luaescapestring{\unexpanded{#3}}","\luaescapestring{\unexpanded{#4}}","\luameshval@tpi@mode","\luameshval@tpi@print","\luameshval@tpi@bbox","\luameshval@tpi@scale")% }% \fi% }% @@ -331,14 +331,12 @@ % #1 : optionnal arguments % #2 : the string containing the list of points % (x1,y1);(x2,y2);... or the name file containing the points - % #3 : the code to place before the generated one - % #4 : the code to place after the generated one \setkeys{MeshAddOneBW}{#1} % \def\MeshPoint{\luameshval@ap@meshpoint}% \def\NewPoint{\luameshval@ap@newpoint}% - \ifKV@MeshAddOne@tikz% if we are using tikz + \ifKV@MeshAddOneBW@tikz% if we are using tikz \directlua{% - buildMeshTikZ("#2","\luameshval@ap@mode","\luameshval@ap@print","\luameshval@ap@bbox","full","\luameshval@ap@scale","\luameshval@ap@color")% + TeXOnePointTikZBW("#2","#3","\luameshval@ap@step","\luameshval@ap@scale","\luameshval@ap@mode","\luameshval@ap@bbox","\luameshval@ap@color","\luameshval@ap@colorback","\luameshval@ap@colornew","\luameshval@ap@colorcircle","\luameshval@ap@colorbbox")% }% \else % we are using MP \mplibcolor{\luameshmpcolor}{\luameshval@ap@color} @@ -412,7 +410,7 @@ \def\NewPoint{\luameshval@api@newpoint}% \ifKV@MeshAddOneBWinc@tikz% if we are using tikz \directlua{% - buildMeshTikZ("#2","\luameshval@api@mode","\luameshval@api@print","\luameshval@api@bbox","\luameshval@api@scale","\luameshval@api@color")% + TeXOnePointTikZBWinc("#2","#3","\luaescapestring{\unexpanded{#4}}","\luaescapestring{\unexpanded{#5}}","\luameshval@ap@step","\luameshval@ap@scale","\luameshval@ap@mode","\luameshval@ap@bbox","\luameshval@ap@color","\luameshval@ap@colorback","\luameshval@ap@colornew","\luameshval@ap@colorcircle","\luameshval@ap@colorbbox")% }% \else % we are using MP \mplibcolor{\luameshmpcolor}{\luameshval@api@color} @@ -421,7 +419,7 @@ \mplibcolor{\luameshmpcolorCircle}{\luameshval@api@colorcircle} \mplibcolor{\luameshmpcolorBbox}{\luameshval@api@colorbbox} \directlua{% - TeXOnePointMPBWinc("#2","#3","#4","#5","\luameshval@api@step","\luameshval@api@scale","\luameshval@api@mode","\luameshval@api@bbox")% + TeXOnePointMPBWinc("#2","#3","\luaescapestring{\unexpanded{#4}}","\luaescapestring{\unexpanded{#5}}","\luameshval@api@step","\luameshval@api@scale","\luameshval@api@mode","\luameshval@api@bbox")% }% % \fi% diff --git a/test/animation.pdf b/test/animation.pdf index a38a444ee56c72bccbe292bb4a50c815ccea1359..678c5c08296b4c05d993b7f8f53a016ac8a7f365 100644 GIT binary patch delta 105 zcmX@Rlj-bErVUf4u^AZ}8XKEUo;^(l%G|tn+AbDnOA|8}b4x=*Q#ThALpMuvS7T#K b7Xu4ZQ&SgbBS%*!I|Um;N;dDBEzAf2qTC&O delta 105 zcmX@Rlj-bErVUf4u^CtzSsEKoo;^(l%G|tn+AbDnBV$)rCpQZt3v&x26H7B!XCo6w b3o}D=6E|~b7dKO5I|Um;N;dDBEzAf2tz#XP diff --git a/test/delaunay.pdf b/test/delaunay.pdf index 199be36817d5bc7c31f64dc8a083d40401b4704e..33fcbbe9651da80a21f0373fa727ef08aef12925 100644 GIT binary patch delta 28220 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 j=wi2!1^@50b9OOwa`A97HG^Yg6Y delta 3846 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 Z!ya-P^h7f^Ed&ICLa7A>HI22X{|g