[luatex] Changing catcodes in \directlua
Steve Hafner
steve.b.hafner at gmail.com
Tue Jul 6 16:05:20 CEST 2010
On Mon, Jul 5, 2010 at 11:34 PM, Paul Isambert <zappathustra at free.fr> wrote:
> Things are expanded in a \directlua statement, like in a \write or \special.
> And what is not exanded, e.g. primitives like \begingroup, is interpreted as
> Lua code, where quite obviously a string like "\begingroup" doesn't make
> sense. The simplest solution to achieve what you want is:
>
> \directlua{tex.print("\luaescapestring{$\noexpand\alpha$}")}
>
> which turns into correct Lua code: first because \alpha isn't expanded,
> second because \luaescapestring modifies its argument so that you get what
> you want. Forgetting it leads to Lua reading
>
> tex.print("$\alpha$")
>
> which you might find sensible but to Lua it means ``print the dollar
> character, then a bell, then the `lpha'$ string.'' I say ``a bell'' because
> \a is an escape sequence that refers to this character, which let's admit
> isn't the most often used nowadays. On the other hand the sequence with
> \luaescapestring returns this to Lua:
>
> tex.print("$\\alpha$")
>
> which means ``print a dollar, a backslash `alpha', and a dollar'' and that's
> correctly interpreted by TeX. (Note that I'm using LuaTeX v.0.6, hopefully
> it'll change nothing.)
>
Yes, everything works as you say. Thanks for the schooling. However, I
don't want to have to add anything to the string that I pass to Lua.
I guess what I'm looking for is ConTeXt's \startluacode ...
\stopluacode, but in plain-TeX. So for my second attempt I took some
code from tex/context/base/luat-ini.mkiv and pieced the following
together:
--------------------------------------------------------------------------------
\def\obeylualines
{\obeylines
\obeyspaces}
%The above was
% \def\obeylualines
% {\obeylines \let\obeyedline \outputnewlinechar
% \obeyspaces \let\obeyedspace\space }
\def\obeyluatokens % todo: make this a proper catcode table, use let's
{\catcode`\%=12 \catcode`\#=12
\catcode`\_=12 \catcode`\^=12
\catcode`\&=12 \catcode`\|=12
\catcode`\{=12 \catcode`\}=12
\catcode`\~=12 \catcode`\$=12
\def\\{\string\\}\def\|{\string\|}\def\-{\string\-}%
\def\({\string\(}\def\){\string\)}\def\{{\string\{}\def\}{\string\}}%
\def\'{\string\'}\def\"{\string\"}%
\def\n{\string\n}\def\r{\string\r}\def\f{\string\f}\def\t{\string\t}%
\def\a{\string\a}\def\b{\string\b}\def\v{\string\v}\def\s{\string\s}%
\def\1{\string\1}\def\2{\string\2}\def\3{\string\3}\def\4{\string\4}\def\5{\string\5}%
\def\6{\string\6}\def\7{\string\7}\def\8{\string\8}\def\9{\string\9}\def\0{\string\0}}
\long\def\dodostartluacode#1\stopluacode
{\expanded{\endgroup\noexpand\directlua{#1}}}
%The above was
%\long\def\dodostartluacode#1\stopluacode
% {\normalexpanded{\endgroup\noexpand\directlua\zerocount{#1}}}
\long\def\dostartluacode
{\begingroup
\obeylualines
\obeyluatokens
\dodostartluacode}
\def\startluacode{\dostartluacode}
% this was
%\unexpanded\def\startluacode{\dostartluacode}
\startluacode
tex.print([[$\int f(x)\,dx$]]) %thanks Manuel for pointing out [[ ]]
\stopluacode
\bye
--------------------------------------------------------------------------------
And running this in plain luatex seems to work as I want. But I
dropped and modified some stuff as noted, so maybe there's some
gotchas lurking in there. In particular, I as yet can't find the
definition of \zerocount, so I just left it out.
I also realize that I should be using catcode tables, and I will look
into this later today.
- Steve
More information about the luatex
mailing list