Strings [[...]] inside \startluacode \stopluacode
Hello. I am experimenting with courious things in LuaTeX (combining TeX and Lua codes) and I have a problem with lua strings containing TeX definitions. When string (containing definition of TeX macro with \directlua call-in) is creating in the separate lua file (reading by command dofile) then script does work OK, but when string is inside \startluacode \stopluacode environment, then does work only when i use text string inside ' ' for example: luastring='\\def\\texmacro\#1\{\\directlua\{luafunction(\#1)\}\}' Script does not work when i use text inside [[ ... ]]! (message undefined control sequence) for example: luastring=[[ \def\texmacro#1{ \directlua{luafunction(#1)} } ]] Where is a problem? Is there any solutions with [[ ... ]] Thanx Jaroslav ============================================ Here are all functioning scripts: 1) all in one file: \startluacode function luafunction(num) if num==nil then num = 1 end for i=1,num do tex.sprint(i..') Hello\\par ') end end luastring='\\def\\texmacro\#1\{\\directlua\{luafunction(\#1)\}\}' tex.sprint(luastring) \stopluacode \def\texmacrotwo#1{ \directlua{luafunction(#1)} \par } \starttext \texmacro{7} \texmacrotwo{10} \stoptext ===================================================== 2) Script in two separates files: %this is file ulet.tex : \directlua{dofile("ulet.lua")} \def\texmacrotwo#1{ \directlua{luafunction(#1)} \par } \starttext \texmacro{7} \texmacrotwo{10} \stoptext And here is content of external file ulet.lua: function luafunction(num) for i=1,num do tex.sprint(i..[[) Hello\par]]) end end luastring=[[ \def\texmacro#1{ \directlua{luafunction(#1)} } ]] tex.sprint(luastring)
Jaroslav Hajtmar wrote:
Where is a problem? Is there any solutions with [[ ... ]]
Category codes, of course. :) \startluacode leaves the backslash at category code 0, and expands its argument so that you can use TeX macros inside the environment (which is normally what is wanted). The special macro \\ is let to \relax so that it does not actually expand, which is why normal quoted lua strings work out ok. Anyway, this works, but you loose the benefits of [[ ... ]] strings: \startluacode luastring=[[ \\def\\texmacro#1{\\directlua{luafunction(#1)}} ]] luastring = luastring:gsub('\\\\','\\') tex.sprint(luastring) \stopluacode Generally speaking, you are much better off with an external file because in an external file the category code of the backslash character (or any other character) does not matter, and then you only have to worry about lua input syntax. Best wishes, Taco
participants (2)
-
Jaroslav Hajtmar
-
Taco Hoekwater