[Dev-luatex] callbacks newbie question: extracting the hyphenation

Mojca Miklavec mojca.miklavec.lists at gmail.com
Tue May 18 22:43:52 CEST 2010

Dear lua experts,

For our repository of hyphenation patterns I would like to create a
document that:
- reads in a file with hyphenation patterns
- reads in plain text file (say one word per line)
- creates output such as "hy{\nicehyphen}phen{\nicehyphen}ation" for each word

I'm testing eshyph-test.tex by Javier Bezos from
http://www.ctan.org/tex-archive/language/spanish/hyphen/base/ (trying
to run it with ConTeXt :), but I don't understand how exactly the
callbacks work. For example, I cannot get the following code to work
in ConTeXt (but it works with luatex in TL 09):

	function(h, groupcode)
		return true

! LuaTeX error ...text/tex/texmf-context/tex/context/base/luat-cbk.lua:39:
attempt to call global 'format' (a nil value)
stack traceback:
	...text/tex/texmf-context/tex/context/base/luat-cbk.lua:39: in
function <...text/tex/texmf-context/tex/context/base/luat-cbk.lua:38>
	(tail call): ?
	<\directlua >:1: in main chunk.
l.8 }


Here's the code that runs in luatex (it's all just a simplified
Javier's code) and prints hyphenated words to terminal. Is there some
more elegant way to do it? Is there a way to print it back to the
document (I understand the problem why the currect approach would fail
to work directly)? And why does it fail in ConTeXt?

Thanks a lot for any hints,

% one needs to create an arbitrary file words.txt, even if it just
contains two words
local glyph = node.id('glyph')
local disc = node.id('disc')
local glue = node.id('glue')
 function(h, groupcode)
  word = ''
  for t in node.traverse(h) do
   if node.id(t.id) == glyph and t.subtype == 0 then
    word = word .. unicode.utf8.char(t.char)
   elseif node.id(t.id) == disc then
    word = word .. '-'
   elseif node.id(t.id) == glue then
    word = word .. ' '
  % texio.write_nl('NODE type=' ..  node.type(t.id) .. ' subtype=' ..
t.subtype )
  % if t.id == glyph then
  %  texio.write(' font=' .. t.font .. ' char=' .. unicode.utf8.char(t.char))
  % end
  texio.write_nl(' -- ' .. word)
  return true

% \pdfnoligatures


\def\p#1{#1\setbox0\vbox{\hsize0pt #1}}

  local words = io.open('words.txt')
  for w in words:lines() do
    tex.print('\\p{' .. w .. '}')


More information about the dev-luatex mailing list