Wolfgang Schuster wrote:
It's now your turn to extend the macro to more optional arguments.
hm, your challenging me? i must be crazy but here you go \startluacode local texsprint, ctxcatcodes = tex.sprint, tex.ctxcatcodes local format, match, gmatch, rep = string.format, string.match, string.gmatch, string.rep local empty = { "single", "double", "triple", "quadruple", "quintuple", } local check = { "first", "second", "third", "fourth", "fifth", } function commands.define(str) -- we could store the defaults in lua and call lua instead but why bother local arg, cmd = match(str,"(.*)\\(.-)$") local a = { } for s in gmatch(arg,"%[(.-)%]") do a[#a+1] = s end local n = tonumber(a[#a]) if n then a[#a] = nil else n = 0 end texsprint(ctxcatcodes,format("\\unexpanded\\def\\%s",cmd)) if #a > 0 then texsprint(ctxcatcodes,format("{\\do%sempty\\do%s}",empty[#a],cmd)) texsprint(ctxcatcodes,format("\\def\\do%s",cmd)) for i=1,#a do texsprint(ctxcatcodes,"[#",i,"]") end texsprint(ctxcatcodes,"{") for i=#a,1,-1 do texsprint(ctxcatcodes,format("\\if%sargument",check[i])) texsprint(ctxcatcodes,format("\\def\\next{\\dodo%s",cmd)) for j=1,#a-i do texsprint(ctxcatcodes,format("[%s]",a[j])) end for j=1,i do texsprint(ctxcatcodes,format("[#%s]",j)) end texsprint(ctxcatcodes,"}") if i == 1 then texsprint(ctxcatcodes,rep("\\fi",#a)) else texsprint(ctxcatcodes,"\\else") end end texsprint(ctxcatcodes,"\\next}") texsprint(ctxcatcodes,format("\\def\\dodo%s",cmd)) for i=1,#a do texsprint(ctxcatcodes,"[#",i,"]") end end for i=1,n do texsprint(ctxcatcodes,"#",#a+i) end end \stopluacode \def\define#1#{\ctxlua{commands.define([[\detokenize{#1}]])}} \starttext \define[2]\whatevera{#1+#2} \whatevera{A}{B} \define[me][too][2]\whateverb{#1+#2+#3+#4} \whateverb[A]{B}{C} \whateverb[A][B]{C}{D} \stoptext we might add some \longs here and there ----------------------------------------------------------------- Hans Hagen | PRAGMA ADE Ridderstraat 27 | 8061 GH Hasselt | The Netherlands tel: 038 477 53 69 | fax: 038 477 53 74 | www.pragma-ade.com | www.pragma-pod.nl -----------------------------------------------------------------