Überarbeitungsverlauf[Zurück]
Klicke auf Einblenden/Ausblenden von Überarbeitungen 6
Fehlerbehandlung ergänzt

25 Jun '13, 12:36

saputello's gravatar image

saputello
11.1k174365

`\XeTeXglyph` greift ja auf den *glyph slot* zu. Der ist eigentlich nicht sehr zuverlässig, da er sich bereits zwischen unterschiedlichen Versionen des gleichen Fonts ändern kann. Anders gesagt: Die Nummer unter der das Zeichen im Font gespeichert ist, ist im Gegensatz zur Unicode-Nummer des Zeichens eher zufällig. Wenn möglich würde ich also auch unter XeTeX zum *unicode character slot* mit `\char` raten. Der ändert sich von Version zu Version des Fonts nicht und ist sogar über Font-Grenzen hinweg eindeutig. Nichts desto trotz ist bei LuaTeX laut Abschnitt 6.2 der [aktuellen LuaTeX-0.76.0-Anleitung][1] ein Pedant namens `\glyph` *geplant*. Derzeit existiert dies allerdings noch nicht. Stattdessen kann es auch geschehen, dass sich die Definition von `\char` noch einmal ändert. Theoretisch könnte man über die `characters` Tabelle eines Fonts zu einem ähnlichen Ergebnis gelangen. Da aber die Tabelle nicht in der Reihenfolge der gewünschten Nummern sortiert ist, sondern diese als Element `index` in derselben gespeichert ist, muss man zunächst das passende Element suchen: \documentclass{article} \usepackage{fontspec} \usepackage{unicode-math} \usepackage{luacode} \begin{luacode} -- Setze das Zeichen zum Glyphen mit der Nummer charNo function LuaTeXglyph(charNo) -- aktuellen font holen local fontNo=font.current() local f=font.getfont(fontNo) local i local v local found=false -- Schleife über alle Zeichen im Font (kann dauern!) for i,v in pairs(f.characters) do -- Wenn die glyph-Nummer charNo ist … if v.index == charNo then -- … Zeichen ausgeben und fertig tex.print( '\\char '..i..' ' ) found=true break end end -- Fehlerbehandlung falls kein glyph gefunden: if not found then tex.error( 'font has no glyphen '..charNo ) end end \end{luacode} \newcommand*{\LuaTeXglyph}[1]{% \directlua{LuaTeXglyph(#1)} } \begin{document} \LuaTeXglyph{500} \end{document} Die Idee dazu habe ich von Herberts Antwort genommen. Allerdings funktioniert diese Lösung hier für den aktuellen Font. Die Lua-Funktion `LuaTeXglyph` lässt sich bestimmt noch optimieren. Ich bin leider alles andere als ein Lua-Experte. Zumindest liefert das in meinen Tests aber dasselbe Zeichen wie `\XeTeXglyph 500`. [1]: http://www.luatex.org/svn/trunk/manual/luatexref-t.pdf
Klicke auf Einblenden/Ausblenden von Überarbeitungen 5
Schleife bei Erfolg abbrechen und kommentiert

25 Jun '13, 10:54

saputello's gravatar image

saputello
11.1k174365

`\XeTeXglyph` greift ja auf den *glyph slot* zu. Der ist eigentlich nicht sehr zuverlässig, da er sich bereits zwischen unterschiedlichen Versionen des gleichen Fonts ändern kann. Anders gesagt: Die Nummer unter der das Zeichen im Font gespeichert ist, ist im Gegensatz zur Unicode-Nummer des Zeichens eher zufällig. Wenn möglich würde ich also auch unter XeTeX zum *unicode character slot* mit `\char` raten. Der ändert sich von Version zu Version des Fonts nicht und ist sogar über Font-Grenzen hinweg eindeutig. Nichts desto trotz ist bei LuaTeX laut Abschnitt 6.2 der [aktuellen LuaTeX-0.76.0-Anleitung][1] ein Pedant namens `\glyph` *geplant*. Derzeit existiert dies allerdings noch nicht. Stattdessen kann es auch geschehen, dass sich die Definition von `\char` noch einmal ändert. Theoretisch könnte man über die `characters` Tabelle eines Fonts zu einem ähnlichen Ergebnis gelangen. Da aber die Tabelle nicht in der Reihenfolge der gewünschten Nummern sortiert ist, sondern diese als Element `index` in derselben gespeichert ist, muss man zunächst das passende Element suchen: \documentclass{article} \usepackage{fontspec} \usepackage{unicode-math} \usepackage{luacode} \begin{luacode} -- Setze das Zeichen zum Glyphen mit der Nummer charNo function LuaTeXglyph(charNo) -- aktuellen font holen local fontNo=font.current() local f=font.getfont(fontNo) local i local v -- Schleife über alle Zeichen im Font (kann dauern!) for i,v in pairs(f.characters) do -- Wenn die glyph-Nummer charNo ist … if v.index == charNo then -- … Zeichen ausgeben und fertig tex.print( '\\char '..i '..i..' ' ) break end end end \end{luacode} \newcommand*{\LuaTeXglyph}[1]{% \directlua{LuaTeXglyph(#1)} } \begin{document} \LuaTeXglyph{500} \end{document} Die Idee dazu habe ich von Herberts Antwort genommen. Allerdings funktioniert diese Lösung hier für den aktuellen Font. Die Lua-Funktion `LuaTeXglyph` lässt sich bestimmt noch optimieren. Ich bin leider alles andere als ein Lua-Experte. Zumindest liefert das in meinen Tests aber dasselbe Zeichen wie `\XeTeXglyph 500`. [1]: http://www.luatex.org/svn/trunk/manual/luatexref-t.pdf
Klicke auf Einblenden/Ausblenden von Überarbeitungen 4
Fehlendes `\glyph` als `\LusTeXglyph` in Lua nachgebaut

25 Jun '13, 10:49

saputello's gravatar image

saputello
11.1k174365

Klicke auf Einblenden/Ausblenden von Überarbeitungen 3

24 Jun '13, 10:55

saputello's gravatar image

saputello
11.1k174365

Klicke auf Einblenden/Ausblenden von Überarbeitungen 2

24 Jun '13, 10:50

saputello's gravatar image

saputello
11.1k174365

Klicke auf Einblenden/Ausblenden von Überarbeitungen 1

24 Jun '13, 10:45

saputello's gravatar image

saputello
11.1k174365