den Inhalt einer Hbox in eine Hilfsdatei schreiben

den Inhalt einer Hbox in eine Hilfsdatei schreiben

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 ndas 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 nin Ihrem Beispiel ist eine Knotenliste. Es gibt verschiedene Knotentypen, z. B. glyphsfür Zeichen, gluefür Abstände oder hlistwelchen Typ Sie für Ihr erhalten \hbox. hlistenthält untergeordnete Knoten, die im n.headAttribut 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 glyphund glueKnoten 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 vlistunterstützen .nodeTexthead

In Bezug auf Glyphenknoten charenthä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}

nodeTextDie Funktion gibt den in der Knotenliste enthaltenen Text zurück. In diesem Beispiel wird sie verwendet, um \hboxInhalte 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)

verwandte Informationen