[dev-context] A few questions

Hans Hagen pragma at wxs.nl
Thu Aug 13 23:35:16 CEST 2009


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
-----------------------------------------------------------------


More information about the dev-context mailing list