Gibt es in LuaLaTeX ein Pendant zum Befehl \XeTeXglyph, um ein einzelnes Schriftzeichen aus der Zeichenpalette auszuwählen? Zwar existiert in LuaLaTeX der Befehl char, der allerdings greift nicht wie \XeTeXglyph auf die Glyph ID eines Schriftzeichens, sondern auf die Zeicheninformation zu.

\documentclass[12pt]{article}
\usepackage{fontspec}
\usepackage{unicode-math}
\begin{document}
\XeTeXglyph500
\end{document}

In XeLaTeX erhalte ich nun dieses Zeichen ”, während ich in LuaLaTeX, wenn ich \XeTeXglyph500 durch \char500 ersetze, dieses Zeichen Ǵ erhalte.

gefragt 24 Jun '13, 10:00

Seve's gravatar image

Seve
2224612
Akzeptiert-Rate: 100%

bearbeitet 25 Jun '13, 11:32

cgnieder's gravatar image

cgnieder
22.1k243463


\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 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.

Permanenter link

beantwortet 24 Jun '13, 10:45

saputello's gravatar image

saputello
11.1k154365
Akzeptiert-Rate: 51%

bearbeitet 25 Jun '13, 12:36

Danke für die schnelle und ausführliche Antwort. Dann werde ich mich wohl noch etwas gedulden müssen.

(24 Jun '13, 11:08) Seve
2

@Seve: Wenn Du das bald benötigst, solltest Du Dich eventuell an die LuaTeX-Mailingliste (<mailto:luatex@tug.org>) wenden. Der Hinweis, dass entweder \char sich nochmal ändern wird oder ein \glyph benötigt wird, war nämlich bereits in der Anleitung zu LuaTeX-0.70.1 enthalten. Manchmal beschleunigen sich Dinge erst, wenn man gezielt danach fragt.

(24 Jun '13, 11:57) saputello

Du kannst dir die Funktion nachbauen, da LuaTeX ja eine Zuordnung Glyph<->Unicodenummer erstellt:

\documentclass[12pt]{article}
\usepackage{fontspec}
\usepackage{luacode}
\def\LuaTeXglyph#1#2{\directlua{Luaglyph(#1,#2)}}
\begin{luacode}
function Luaglyph(font,i) 
  local fontWithDir=kpse.find_file(font,"opentype fonts")
  local f = fontloader.open(fontWithDir)
  local g = f.glyphs[i]
  if g then
    tex.sprint("\\char" .. g.unicode)
    print("Unicodenummer: " .. g.unicode)
  end
  fontloader.close(f)
end
\end{luacode}

\begin{document}
\Huge
\LuaTeXglyph{"lmroman12-regular.otf"}{500}
\LuaTeXglyph{"lmroman12-regular.otf"}{100}

\end{document}
Permanenter link

beantwortet 24 Jun '13, 13:18

Herbert's gravatar image

Herbert
5.1k34
Akzeptiert-Rate: 31%

Vielen Dank, so etwas hatte ich gesucht.

(25 Jun '13, 10:35) Seve
Deine Antwort
Vorschau umschalten

Folgen dieser Frage

Per E-Mail:

Wenn sie sich anmelden, kommen Sie für alle Updates hier in Frage

Per RSS:

Antworten

Antworten und Kommentare

Markdown-Grundlagen

  • *kursiv* oder _kursiv_
  • **Fett** oder __Fett__
  • Link:[Text](http://url.com/ "Titel")
  • Bild?![alt Text](/path/img.jpg "Titel")
  • nummerierte Liste: 1. Foo 2. Bar
  • zum Hinzufügen ein Zeilenumbruchs fügen Sie einfach zwei Leerzeichen an die Stelle an der die neue Linie sein soll.
  • grundlegende HTML-Tags werden ebenfalls unterstützt

Frage-Themen:

×76
×27
×9

gestellte Frage: 24 Jun '13, 10:00

Frage wurde gesehen: 11,268 Mal

zuletzt geändert: 25 Jun '13, 12:36