I am using the mechanism outlined in this answer to generate a text-only version of a fairly complex document for spell-checking. This is my first attempt to use lualatex, so this might be littered with issues, but for the most part it does what I want it to do:
\documentclass{article}
\usepackage{luatexbase}
\usepackage{lipsum}
\usepackage{filecontents}
\usepackage{ifluatex}
\begin{filecontents*}{luaFunctions.lua}
-- clear the file
file = io.open("output.txt", "w")
file:write()
exportParagraph = false
function exportText (head)
if exportParagraph == false then
--if you return nil no pdf will be created
-- return nil
return head
end
-- open the file in append-modus
local out = io.open("output.txt", "a")
local wordCounter = 0
-- loop over all hboxes in the current paragraph
for line in node.traverse_id (node.id("hlist"), head) do
-- loop over each element in the line
for item in node.traverse (line.list) do
-- check if the element is a char
if item.id == node.id("glyph") then
out:write(string.char(item.char))
-- check if the element is a 'space'
elseif item.id == node.id("glue") then
wordCounter = wordCounter + 1
out:write(" ")
end
end
-- a newline in the file after each (tex)line
out:write("\n")
end
wordCounter = wordCounter - 1
out:write("Words: "..wordCounter.."\n")
-- a newline in the file after each paragraph
out:write("\n")
assert(out:close())
exportParagraph = false
--if you return nil no pdf will be created
-- return nil
return head
end
function disableLigatures(head)
-- disable ligatures
end
function SetExportParagraph(export)
exportParagraph = export
end
luatexbase.add_to_callback("ligaturing", disableLigatures, "disableLigatures")
luatexbase.add_to_callback("post_linebreak_filter", exportText, "exportText")
\end{filecontents*}
\ifluatex
\directlua{dofile("luaFunctions.lua")}
\fi
\def\exportParagraph{%
\ifluatex
\directlua{SetExportParagraph(true)}
\fi
}
\begin{document}
\exportParagraph
ff fi Lorem ipsum dolor sit amet, \textbf{consectetuer adipiscing elit. Ut purus elit,
vestibulum ut, placerat ac, adipiscing vitae, felis.} Curabitur dictum gravida
mauris. Nam arcu libero, nonummy eget, consectetuer id, vulputate a, magna.
Donec vehicula augue eu neque. Pellentesque habitant morbi tristique senectus
et netus et malesuada fames ac turpis egestas. Mauris ut leo. Cras viverra
metus rhoncus sem. Nulla et lectus vestibulum urna fringilla ultrices. Phasellus
eu tellus sit amet tortor gravida placerat. Integer sapien est, iaculis in, pretium
quis, viverra ac, nunc. Praesent eget sem vel leo ultrices bibendum. Aenean
faucibus. Morbi dolor nulla, malesuada eu, pulvinar at, mollis ac, nulla. Cur-
abitur auctor semper nulla. Donec varius orci eget risus. Duis nibh mi, congue
eu, accumsan eleifend, sagittis quis, diam. Duis eget orci sit amet orci dignissim
rutrumrutrumrutrumrutrumrutrumrutrumrutrumrutrumrutrumrutrumrutrumrutrumrutrumrutrum.
Nam dui ligula, fringilla a, euismod sodales, sollicitudin vel, wisi. Morbi
auctor lorem non justo. Nam lacus libero, pretium at, lobortis vitae, ultricies et,
tellus. Donec aliquet, tortor sed accumsan bibendum, erat ligula aliquet magna,
vitae ornare odio metus a mi. Morbi ac orci et nisl hendrerit mollis. Suspendisse
ut massa. Cras nec ante. Pellentesque a nulla. Cum sociis natoque penatibus et
magnis dis parturient montes, nascetur ridiculus mus. Aliquam tincidunt urna.
Nulla ullamcorper vestibulum turpis. Pellentesque cursus luctus mauris.
\exportParagraph
Nulla malesuada porttitor diam. Donec felis erat, congue non, volutpat at,
tincidunt tristique, libero. Vivamus viverra fermentum felis. Donec nonummy
pellentesque ante. Phasellus adipiscing semper elit. Proin fermentum massa
ac quam. Sed diam turpis, molestie vitae, placerat a, molestie nec, leo. Mae-
cenas lacinia.
Nam ipsum ligula, eleifend at, accumsan nec, suscipit a, ipsum.
Morbi blandit ligula feugiat magna. Nunc eleifend consequat lorem. Sed lacinia
nulla vitae enim. Pellentesque tincidunt purus vel magna. Integer non enim.
Praesent euismod nunc eu purus. Donec bibendum quam in tellus. Nullam cur-
sus pulvinar lectus. Donec et mi. Nam vulputate metus eu enim. Vestibulum
pellentesque felis eu massa.
\end{document}
In the generated output, the nonsense word rutrumrutrumrutrumrutrumrutrumrutrumrutrumrutrumrutrumrutrumrutrumrutrumrutrumrutrum
at the end of the first paragraph will be hyphenated:
[...]
ac, nulla. Cur- abitur auctor semper nulla. Donec varius orci eget risus. Duis
nibh mi, congue eu, accumsan eleifend, sagittis quis, diam. Duis eget orci sit
amet orci dignissim rutrumrutrumrutrumrutrumrutrumrutrumrutrumrutrum-
rutrumrutrumrutrumrutrumrutrumrutrum.
Words: 134
This happens throughout my entire text and makes spell-checking the text rather hard. Is there a way to disable hyphenation for this hack (I'm hesitant to call it a solution) entirely?
detex
with very disappointing results and haven't really found any satisfying out-of-the-box solution to extract the textual content of a document for further processing.pre_linebreak_filter
to do this, because this callback is called before hyphenation and some additional information about node list origin is passed. I am working on a solution