
Ich weiß, dass TeX den Inhalt von hbox nicht in eine Hilfsdatei schreiben kann (Den Inhalt eines Box-Registers erneut analysieren).
Das bedeutet, dass
\newwrite\foo
\immediate\openout\foo=\jobname.txt
\setbox0=\hbox{bar}
\immediate\write\foo{\box0}
kann nicht schreiben Aber kann LuaTeX das? Ich habe gefunden
\directlua{
n = tex.getbox(0)
}
Ich verstehe jedoch nicht, was n
das darstellt und ob ich es verwenden könnte, um den Boxinhalt in eine Datei zu schreiben.
Antwort1
Bearbeiten: hier ist ein neuer Code, der für Ligaturen funktioniert:
\documentclass{article}
\usepackage{fontspec}
\begin{document}
\setbox0=\hbox{Příliš žluťoučký \textit{kůň} úpěl \hbox{ďábelské} ódy, diffierence, difference}
\directlua{
% local fontstyles = require "l4fontstyles"
local char = unicode.utf8.char
local glyph_id = node.id("glyph")
local glue_id = node.id("glue")
local hlist_id = node.id("hlist")
local vlist_id = node.id("vlist")
local disc_id = node.id("disc")
local minglue = tex.sp("0.2em")
local usedcharacters = {}
local identifiers = fonts.hashes.identifiers
local function get_unicode(xchar,font_id)
local current = {}
local uchar = identifiers[font_id].characters[xchar].tounicode
for i= 1, string.len(uchar), 4 do
local cchar = string.sub(uchar, i, i + 3)
print(xchar,uchar,cchar, font_id, i)
table.insert(current,char(tonumber(cchar,16)))
end
return current
end
local function nodeText(n)
local t = {}
for x in node.traverse(n) do
% glyph node
if x.id == glyph_id then
% local currentchar = fonts.hashes.identifiers[x.font].characters[x.char].tounicode
local chars = get_unicode(x.char,x.font)
for _, current_char in ipairs(chars) do
table.insert(t,current_char)
end
% glue node
elseif x.id == glue_id and node.getglue(x) > minglue then
table.insert(t," ")
% discretionaries
elseif x.id == disc_id then
table.insert(t, nodeText(x.replace))
% recursivelly process hlist and vlist nodes
elseif x.id == hlist_id or x.id == vlist_id then
table.insert(t,nodeText(x.head))
end
end
return table.concat(t)
end
local n = tex.getbox(0)
print(nodeText(n.head))
local f = io.open("hello.txt","w")
f:write(nodeText(n.head))
f:close()
}
\box0
\end{document}
Ergebnis in hello.txt
:
Příliš žluťoučký kůň úpěl ďábelské ódy, diffierence, difference
Ursprüngliche Antwort:
Die Variable n
in Ihrem Beispiel ist eine Knotenliste. Es gibt verschiedene Knotentypen, z. B. glyphs
für Zeichen, glue
für Abstände oder hlist
welchen Typ Sie für Ihr erhalten \hbox
. hlist
enthält untergeordnete Knoten, die im n.head
Attribut zugänglich sind. Sie können diese untergeordnete Liste dann für Glyphen und Klebstoffe schleifen.
Jeder Knotentyp ist durch den Attributwert unterscheidbar n.id
. Bestimmte Knotentypen und mögliche Attribute werden im Kapitel „8 Knoten“ beschrieben. In diesem speziellen Beispiel müssen wir nur glyph
und glue
Knoten verarbeiten, aber Sie sollten bedenken, dass Knotenlisten rekursiv sind und verschiedene Knoten untergeordnete Listen enthalten können, wie hlist
, , usw. Sie können sie durch rekursive Aufrufe des aktuellen Knotenattributs vlist
unterstützen .nodeText
head
In Bezug auf Glyphenknoten char
enthält das Attribut nur dann einen Unicode-Wert, wenn Sie OpenType- oder TrueType-Schriftarten verwenden. Wenn Sie alte 8-Bit-Schriftarten verwenden, enthält es nur einen 8-Bit-Wert, dessen tatsächliche Kodierung von der verwendeten Schriftkodierung abhängt und nicht einfach in Unicode konvertiert werden kann.
\documentclass{article}
\usepackage{fontspec}
\begin{document}
\setbox0=\hbox{Příliš žluťoučký \textit{kůň} úpěl \hbox{ďábelské} ódy}
\directlua{
local fontstyles = require "l4fontstyles"
local char = unicode.utf8.char
local glyph_id = node.id("glyph")
local glue_id = node.id("glue")
local hlist_id = node.id("hlist")
local vlist_id = node.id("vlist")
local minglue = tex.sp("0.2em")
local usedcharacters = {}
local identifiers = fonts.hashes.identifiers
local function get_unicode(xchar,font_id)
return char(tonumber(identifiers[font_id].characters[xchar].tounicode,16))
end
local function nodeText(n)
local t = {}
for x in node.traverse(n) do
% glyph node
if x.id == glyph_id then
% local currentchar = fonts.hashes.identifiers[x.font].characters[x.char].tounicode
table.insert(t,get_unicode(x.char,x.font))
local y = fontstyles.get_fontinfo(x.font)
print(x.char,y.name,y.weight,y.style)
% glue node
elseif x.id == glue_id and node.getglue(x) > minglue then
table.insert(t," ")
elseif x.id == hlist_id or x.id == vlist_id then
table.insert(t,nodeText(x.head))
end
end
return table.concat(t)
end
local n = tex.getbox(0)
print(nodeText(n.head))
local f = io.open("hello.txt","w")
f:write(nodeText(n.head))
f:close()
}
\box0
\end{document}
nodeText
Die Funktion gibt den in der Knotenliste enthaltenen Text zurück. In diesem Beispiel wird sie verwendet, um \hbox
Inhalte auf dem Terminal auszudrucken und in eine Datei zu schreiben .hello.txt
Für grundlegende Informationen zum Schriftstil können Sie versuchen,l4SchriftartenModul, wie folgt:
local fontstyles = require "l4fontstyles"
...
if x.id == glyph_id then
table.insert(t,char(x.char))
local y = fontstyles.get_fontinfo(x.font)
print(y.name,y.weight,y.style)