[NTG-context] Escaping in LuaTeX

Wolfgang Schuster schuster.wolfgang at googlemail.com
Sun Jan 2 09:30:43 CET 2011


Am 02.01.2011 um 02:04 schrieb Fulvio Satta:

> I have a problem with Lua and the "#" operator.
> If I execute the following code I receive an error.
> 
> \def\luacode%
> {\startluacode
>    local t = {1, 2, 3}
>    tex.print(#t)
> \stopluacode}
> 
> \starttext
>    \luacode
> \stoptext
> 
> ConTeXt give me the message:
> 
> ! Illegal parameter number in definition of \luacode.
> <to be read again> 
>                   t
> l.4     tex.print(#t
>                    )
> 
> And if I execute the "H" command I get:
> 
> You meant to type ## instead of #, right?
> Or maybe a } was forgotten somewhere earlier, and things
> are all screwed up? I''m going to assume that you meant ##.
> 
> I've tryed with ##t, whit \#t, with \string#t, with \ctxlua instread of 
> \startluacode and \stopluacode, and I've obtained some other errors, but 
> ConTeXt always give me an error.
> 
> Maybe should I escape in another manner the "#" operator?

You can replace the # with \letterhash but you method is wrong, the first thing is that
\luacode is already defined in the core and it can be used as replacement for \ctxlua
and second it’s better to separate a lua function and the call to the function.

Instead of writing the function in a luacode environment you can also put it
in a external file which is then loaded in your document/module. You should
also use a namespace for your functions.

\startluacode

userdata        = userdata        or { }
userdata.fulvio = userdata.fulvio or { }

function userdata.fulvio.size()
    local t = {1, 2, 3}
    tex.print(#t)
end

\stopluacode

\def\SizeOne{\ctxlua {userdata.fulvio.size()}}
\def\SizeTwo{\luacode{userdata.fulvio.size()}}

\starttext

\startluacode
   local t = {1, 2, 3}
   tex.print(#t)
\stopluacode

\starttabulate
\NC ctxlua  \EQ \SizeOne \NC\NR
\NC luacode \EQ \SizeTwo \NC\NR
\stoptabulate

\stoptext

Wolfgang



More information about the ntg-context mailing list