Hello, yesterday I experimented a little with \directlua, and I decided to code a sorting routine, since sorting in TeX (as i.e. implemented in the experimental LaTeX 3 code or in Bernd Raichle's paper "Sorting in TeX's mouth") is quite slow. The example is in PlainTeX. ------------------------------------- CUT ----------------------------------- % We `preload' the necessary functions into the Lua state % % Note that comments inside \directlua must be TeX comments (``%''); % Lua comments (``--'') do not work % % The sorting code has been copied from the Lua users wiki (page % ``MakingLuaLikePhp'') \directlua0{ function explode(str,div) if (div=='') then return false end local pos,arr = 0,{} % For each divider found for st,sp in function() return string.find(str,div,pos,true) end do % Attach chars left of current divider table.insert(arr,string.sub(str,pos,st-1)) % Jump past current divider pos = sp + 1 end % Attach chars right of last divider table.insert(arr,string.sub(str,pos)) return arr end function implode(t,div) return table.concat(t,div) end } % #1 = continuation (called with the sorted list as its only % parameter), #2 = delimiter, #3 = <delimiter>-separated list \def\sort#1#2#3{% \directlua0{% % We prevent expansion and then escape all characters special % to lua in the parameters. This is necessary to prevent them % from (a) executed right now and (b) being misunderstood by % Lua. % % We convert the string into a table, delimited by a % (unexpanded, escaped) delimiter: local t = explode("\luaescapestring{\unexpanded{#3}}", "\luaescapestring{\unexpanded{#2}}") % We sort the table in-place: table.sort(t) % We output the table as a string. % % We use a single call to tex.print to prevent spaces in % the output, since all tex.print calls except the last add % an \endlinechar (LuaTeX manual 4.1.10.1): tex.print("\luaescapestring{\unexpanded{#1}}{" .. implode(t," ") .. "}") }% } % Output tokens without expansion \def\typeout#1{\message{\unexpanded{[#1]}}} % Example (text taken from Wikipedia, ``Hyperreality'') \sort{\typeout}{ }{% In semiotics and postmodern philosophy, the term hyperreality characterizes the inability of consciousness to distinguish reality from fantasy, especially \in technologically advanced postmodern cultures. Hyperreality is a means of characterising the way consciousness defines what is actually `real' in a world where a multitude of media can radically shape and filter the original event or experience being depicted. Some famous theorists of hyperreality include Jean Baudrillard, \Albert Borgmann, Daniel Boorstin, and Umberto Eco. % Most aspects of hyperreality can be thought of as `reality by proxy.' For example, a viewer watching pornography begins to live in the non-existent world of the pornography, and even though the pornography is not an accurate depiction \of sex, for the viewer, the reality of `sex' becomes something non-existent. Some examples are simpler: the McDonald's `M' arches create a world with the promise of endless amounts of identical food, when in `reality' the `M' represents nothing, and the food produced is neither identical nor infinite. % Baudrillard in particular suggests that the world we live in has been replaced by a copy world, \where we seek simulated stimuli and nothing more. Baudrillard borrows, from Jorge Luis Borges (which Borges also borrowed from Lewis Carroll), the example of a society whose cartographers create a map so detailed that it covers the very things it was designed to \represent. When the empire declines, the map fades into the landscape and there is neither the representation nor the real remaining -- just the hyperreal. % Baudrillard's idea of \hyperreality was heavily influenced by phenomenology, semiotics, and Marshall McLuhan.} \bye ------------------------------------- CUT ----------------------------------- Sorting in Lua is really, really fast, even though the token list has to be converted into a table and back. At least, it is a lot faster than sorting in TeX. Caveat: In TeX, braces can be used to hide the <delimiter>; this is not possible in the above code. I plan to code a "string.findOutsideBraces" function to handle braces correctly, but I wonder if this should not be a library routine. In any case: Imagine the possibilities when using Lua not only for manipulating the node list, but also for parsing user input! Delighted, Jonathan
Jonathan Sauer wrote:
Caveat: In TeX, braces can be used to hide the <delimiter>; this is not possible in the above code. I plan to code a "string.findOutsideBraces" function to handle braces correctly, but I wonder if this should not be a library routine.
the embedded libaries and extensions are kept to the minimum, if only because we want to avoid endless discussions about what could go in there; lua is fast enough anyway; concerning braces .. watch the %b option on expressions, can be handy for nested braces
In any case: Imagine the possibilities when using Lua not only for manipulating the node list, but also for parsing user input!
this has been one of the objectives right from the start: manipulation at each level (reading dat from file, manipulating token handling, handling node liste, etc); it all depends on what you want to manipulate ... raw data stream, tokens (expansion done or not), typeset (intermediate) results, ... luatex does not implement solutions, only provides the tools so you can choose any level you want for manipulations Hans ----------------------------------------------------------------- Hans Hagen | PRAGMA ADE Ridderstraat 27 | 8061 GH Hasselt | The Netherlands tel: 038 477 53 69 | fax: 038 477 53 74 | www.pragma-ade.com | www.pragma-pod.nl -----------------------------------------------------------------
participants (2)
-
Hans Hagen
-
Jonathan Sauer