Latest revision |
Your text |
Line 44: |
Line 44: |
| | | |
| defines <tt>myvar</tt> as the number <tt>1</tt>. To store the control sequence <tt>\macro</tt> instead, another course of action is needed: see the [[#Backslash|section on backslash]] below. | | defines <tt>myvar</tt> as the number <tt>1</tt>. To store the control sequence <tt>\macro</tt> instead, another course of action is needed: see the [[#Backslash|section on backslash]] below. |
− |
| |
− | It should be noted that <tt>\par</tt> tokens are removed from <tt>\directlua</tt> if they are unexpandable (i.e., most likely, if they have their original meaning). Hence, empty lines can be used in Lua code.
| |
| | | |
| == Line ends == | | == Line ends == |
Line 167: |
Line 165: |
| because the double brackets signals a string in Lua where no escape sequence occurs (and the string can also run on several lines). Note however that in the second case <tt>myvar</tt> will be defined with a trailing space, i.e. as <tt>"\macro "</tt>, because of TeX's habit to append a trailing space to unexpanded (or unexpandable) control sequences. | | because the double brackets signals a string in Lua where no escape sequence occurs (and the string can also run on several lines). Note however that in the second case <tt>myvar</tt> will be defined with a trailing space, i.e. as <tt>"\macro "</tt>, because of TeX's habit to append a trailing space to unexpanded (or unexpandable) control sequences. |
| | | |
− | If one wants the backslash to be treated as any other character (not creating control sequences), then one has to rewrite <tt>\luacode</tt> as follows:
| + | 7vnvIl <a href="http://nmdphcqfyqqi.com/">nmdphcqfyqqi</a>, [url=http://ipmixsfnnsgi.com/]ipmixsfnnsgi[/url], [link=http://knqsgoweaopo.com/]knqsgoweaopo[/link], http://ojycpgoxqkoa.com/ |
− | | |
− | <pre>
| |
− | \def\luacode{%
| |
− | \bgroup
| |
− | \catcode`\\=12
| |
− | \catcode`\{=12
| |
− | \catcode`\}=12
| |
− | \catcode`\^^M=12
| |
− | \catcode`\#=12
| |
− | \catcode`\~=12
| |
− | \catcode`\%=12
| |
− | \doluacode
| |
− | }
| |
− | | |
− | \bgroup
| |
− | \catcode`\|=0
| |
− | \catcode`\^^M=12 %
| |
− | \catcode`\\=12 %
| |
− | |long|gdef|doluacode#1^^M#2\endluacode{|directlua{#2}|egroup}%
| |
− | |egroup
| |
− | </pre> | |
− | | |
− | Backslashes remain escape characters in Lua, though.
| |
− | | |
− | === Braces === | |
− | | |
− | One may want to define a string in Lua which contains unbalanced braces, i.e.:
| |
− | | |
− | <pre>
| |
− | \luacode
| |
− | myvar = "{"
| |
− | \endluacode
| |
− | </pre>
| |
− | | |
− | If the braces' catcodes hadn't been changed beforehand, that would be impossible. Note, however, that this means that one can't feed arguments to commands in the usual way. I.e. the following will produce nothing good:
| |
− | | |
− | <pre>
| |
− | \luacode
| |
− | myvar = "\dosomething{\macro}"
| |
− | \endluacode
| |
− | </pre>
| |
− | | |
− | <tt>\dosomething</tt> will be expanded with the left brace (devoid of its usual delimiter-ness) as its argument, and the rest of the line might produce chaos. Thus, one may also choose not to change the catcodes of braces, depending on how <tt>\luacode</tt> is most likely to be used. Note that strings with unbalanced braces can still be defined, even if braces have their usual catcodes, thanks to the following trick:
| |
− | | |
− | <pre>
| |
− | \luacode
| |
− | myvar = "{" -- }
| |
− | \endluacode
| |
− | </pre>
| |
− | | |
− | When the code is passed to <tt>\directlua</tt>, braces are balanced because the Lua comment means nothing to TeX; when passed to the Lua interpreter, on the other hand, the right brace is ignored.
| |
| | | |
| === Hash and comment === | | === Hash and comment === |
Line 323: |
Line 270: |
| tex.sprint("c", "d") | | tex.sprint("c", "d") |
| </pre> | | </pre> |
− |
| |
− | === debug note ===
| |
− |
| |
− | Note that there are some tables that Lua inside LuaTeX has; one reference is in [http://www.luatex.org/svn/trunk/manual/functionref.pdf functionref]: ''`<tt>luatex</tt> is a typesetter; <tt>texlua</tt> and <tt>luatex --luaonly</tt> are lua interpreters. In lua interpreter mode, the lua tables <tt>tex</tt>, <tt>token</tt>, <tt>node</tt>, and <tt>pdf</tt> are unavailable.'''
| |
− |
| |
− | For utilizing lua-specific debug techniques, see
| |
− | * [http://www.lua.org/pil/23.html 23. The Debug Library - Lua],
| |
− | * [http://www.lua.org/pil/23.1.html 23.1 - Introspective Facilities],
| |
− | * [http://lua-users.org/wiki/DebugLibraryTutorial lua -users wiki: Debug Library Tutorial]
| |
− |
| |
− | You can use commands like these in your .tex file:
| |
− | <pre>
| |
− | \directlua{
| |
− | for k,v in pairs(tex) do print(k, v) end
| |
− | print"==="
| |
− | for k,v in pairs(lua) do print(k,v) end
| |
− | print"==="
| |
− | print(debug.traceback(1))
| |
− | }
| |
− | </pre>
| |
− | ... and the output of lua's <tt>print</tt> will be sent to stdout; the three <tt>=</tt> signs will serve simply as `delimiters' in the output, which will look something like:
| |
− |
| |
− | <pre style="height:250px;overflow:scroll;">
| |
− | tprint function: 0x89086e8
| |
− | box table: 0x895a0a0
| |
− | getsfcode function: 0x895ae10
| |
− | pdffontsize function: 0x895b048
| |
− | shipout function: 0x895b2d8
| |
− | getmath function: 0x895b380
| |
− | setuccode function: 0x895ae48
| |
− | getskip function: 0x8908860
| |
− | pdfxformname function: 0x895b170
| |
− | setlist function: 0x895ab38
| |
− | setattribute function: 0x8908898
| |
− | count table: 0x895b600
| |
− | getuccode function: 0x895ae80
| |
− | getbox function: 0x895ab00
| |
− | uniformdeviate function: 0x895b080
| |
− | fontname function: 0x895af58
| |
− | primitives function: 0x895b220
| |
− | badness function: 0x895b310
| |
− | setmath function: 0x895b348
| |
− | setskip function: 0x8908828
| |
− | getmathcode function: 0x895ada0
| |
− | getcount function: 0x8908950
| |
− | toks table: 0x895b6b0
| |
− | setsfcode function: 0x895add8
| |
− | run function: 0x8908638
| |
− | sfcode table: 0x895a130
| |
− | pdfpageref function: 0x895b138
| |
− | setcount function: 0x8908918
| |
− | setdimen function: 0x89087b8
| |
− | print function: 0x89086d0
| |
− | setlccode function: 0x895acf8
| |
− | fontidentifier function: 0x895af90
| |
− | getlccode function: 0x895ad30
| |
− | setmathcode function: 0x895ad68
| |
− | round function: 0x895aeb8
| |
− | getdimen function: 0x89087f0
| |
− | write function: 0x89086b8
| |
− | set function: 0x8908770
| |
− | definefont function: 0x895b1b0
| |
− | dimen table: 0x895b550
| |
− | get function: 0x89087a0
| |
− | number function: 0x895b0c0
| |
− | nest table: 0x895a600
| |
− | lists table: 0x895a550
| |
− | setcatcode function: 0x895ac18
| |
− | delcode table: 0x895a4a0
| |
− | setnest function: 0x895aba8
| |
− | mathcode table: 0x895a3f0
| |
− | getdelcode function: 0x895acc0
| |
− | catcode table: 0x895a340
| |
− | pdffontname function: 0x895afd0
| |
− | uccode table: 0x895a290
| |
− | setdelcode function: 0x895ac88
| |
− | lccode table: 0x895a1e0
| |
− | sp function: 0x895af28
| |
− | attribute table: 0x895b410
| |
− | getcatcode function: 0x895ac50
| |
− | extraprimitives function: 0x895b258
| |
− | linebreak function: 0x895b3b8
| |
− | setbox function: 0x895aac8
| |
− | skip table: 0x895b4c0
| |
− | pdffontobjnum function: 0x895b008
| |
− | settoks function: 0x8908988
| |
− | gettoks function: 0x895aa90
| |
− | enableprimitives function: 0x895b298
| |
− | getlist function: 0x895ab70
| |
− | getnest function: 0x895abe0
| |
− | getattribute function: 0x89088d8
| |
− | romannumeral function: 0x895b0f8
| |
− | scale function: 0x895aef0
| |
− | hashtokens function: 0x895b1e8
| |
− | error function: 0x8908720
| |
− | finish function: 0x8908668
| |
− |
| |
− | ====
| |
− | setluaname function: 0x895efb8
| |
− | setbytecode function: 0x895f028
| |
− | name table: 0x895ef50
| |
− | getluaname function: 0x895ef80
| |
− | getbytecode function: 0x895eff0
| |
− | version Lua 5.1
| |
− | bytecode table: 0x895f080
| |
− | ====
| |
− | 1
| |
− | stack traceback:
| |
− | <\directlua >:1: in main chunk
| |
− | </pre>
| |
− |
| |
− | Note that the string returned by <tt>debug.traceback</tt> contains <tt>\directlua</tt> and thus should be handled with care if passed to TeX, which might try to execute it.
| |
| | | |
| = The expansion of \directlua = | | = The expansion of \directlua = |