Am 06.01.2011 um 21:05 schrieb Paul Isambert:

> Le 06/01/2011 20:50, Philipp Stephani a écrit :
>> Am 06.01.2011 um 20:06 schrieb Luis Rivera:
>> 
>>> "tables and functions". So how would you set a table for the six
>>> special characters of esperanto (^c, ^g, ^h, ^j, ^s, ^u)?
>> \catcode`\^=12
>> \begingroup
>> \catcode`\%=12
>> \gdef\percentchar{%}
>> \endgroup
>> \directlua{%
>>   local translate = {
>>     c = "ĉ",
>>     g = "ĝ",
>>     h = "ĥ",
>>     j = "ĵ",
>>     s = "ŝ",
>>     u = "û"
>>   }
>>   function texperanto(text)
>>     result = text:gsub("\percentchar^(\percentchar a)", translate)
>>     tex.sprint(result)
>>   end
>> }
>> \def\texperanto#1{\directlua{texperanto([[#1]])}}
>> \input luaotfload.sty
>> \font\rm={name:DejaVu Sans:}\relax
>> \rm
>> \texperanto{^a ^b ^c ^d ^e ^f ^g ^h ^i ^j ^s ^u}
>> \bye
>> 
> 
> A small simplification: again, the catcode change for "^" is unnecessary,

In this example it is necessary because otherwise you get errors (but only 
because I used ^b and other unmodified sequences to test the functions)

> and you could as well use \direclua in the group and use "%" as is (i.e. 
> without \percentchar), since \directlua is immune to TeX groups.

Indeed, I have forgotten that (the luacode environment does the same).

> 
> 
>>> I thought of a macro package independent solution. This one works for
>>> LuaLaTeX, but Patrick's should also work for plain LuaTeX.
>> of course that's possible, but a bit more awkward since you have to e.g. 
>> escape percent characters. "macro package independence" is even harder with 
>> LuaTeX than with pdfTeX, since you need lots of external packages to e.g. 
>> load fonts. Luaotfload works with LaTeX and plain, but probably not with 
>> ConTeXt, which is completely different anyway.
> 
> Luaotfload should work with ConTeXt, since the code is ConTeXt's code. And 
> format-independance should be enforced as often as possible (a personal 
> hobby): when it comes to Lua, it's rather easy, since Lua code doesn't give a 
> damn about formats (unless you use format-dependant Lua function, that is).

Maybe in this simple example, but in general I think it is quite hard (but I 
have to admit that I've never written format-independent code).

> 
>>> What occurs to me is to use a babel-like solution: make ^ active in
>>> textual context, and define it in terms of Lua functions so that it
>>> may check the following character and apply a conversion on a match:
>>> otherwise, typeset the original two character string.
>> Never do this if you have LuaTeX, it is completely obsolete and causes many 
>> issues. If you are sure to run on LuaTeX, do everything in Lua, and avoid 
>> catcode changes and the like.
> 
> Indeed, the solution with catcodes would be ok with anything but LuaTeX, and 
> you actually don't need any Lua function.

But making ^ active disables ^^-escapes:

\def\normalcircumflex{^}
\edef\twonormalcircumflexes{\normalcircumflex\normalcircumflex}
\catcode`\^=\active
\def^{\futurelet\next\dotexperanto}
\def\dotexperanto{%
  \ifx\next g%
    \let\next\dodotexperanto
  \else
    \ifx\next^%
      \let\next\twonormalcircumflexes
    \else
      \let\next\normalcircumflex
    \fi
  \fi
  \next
}
\def\dodotexperanto#1{\^#1}
g ^g h
^^J
\bye


Reply via email to