Ein von mir verwendeter Font hat zwei verschiedenen Glyphen für die Eins. Die von mir präferierte kann ich mit XeTeXglyph466 erzeugen - ich verwende XeLaTeX. Wie kann ich diese Alternative mit dem Namen "one.alt001" (laut otfinfo -g ScalaPro-Bold.otf) immer verwenden, wenn Text mit diesem Font gesetzt wird? Damit das folgende Beispiel läuft, habe ich die Fontauswahl auskommentiert, also nicht wundern, wenn das Zeichen in der Mitte keine 1 ist. Open in Online-Editor
\documentclass{article} \usepackage{fontspec} %\setromanfont[Extension=.otf,UprightFont= *Regular]{ScalaPro-} \begin{document} 1 \XeTeXglyph466{} 1 \end{document} Ich habe es bereits mit StylisticSet (und Werten von 0 bis 3) versucht, allerdings ohne Erfolg (3 verändert lediglich das s): Open in Online-Editor
\documentclass{article} \usepackage{fontspec} \setromanfont[Extension=.otf,UprightFont= *Bold,StylisticSet=3]{ScalaPro-} \begin{document} 1 \XeTeXglyph466{} 1 s \end{document} Dass die 1 (wie ich sie mir wünsche) im Font enthalten ist, zeigt RawFeature=+aalt, allerdings wird da wohl die erstbeste Alternative von jedem Zeichen gewählt. Open in Online-Editor
\documentclass{article} \usepackage{fontspec} \setromanfont[Extension=.otf,UprightFont= *Bold,RawFeature=+aalt]{ScalaPro-} \begin{document} 1 \XeTeXglyph466{} 12 s \end{document} Hier gibt es übrigens Informationen zum Font: http://myfonts.us/td-M3Gn4N Mir liegt hier Version 7.504 vor. gefragt 30 Mär '16, 17:13 kwoid |
luatex: Feature FileAm einfachsten geht es mit LuaLaTeX und einem Feature-File. Zeichen ersetzen geht dabei mit Hilfe einer Ligatur. Man kennt Ligaturen normalerweise daher, dass zum Beispiel Open in Online-Editor
feature liga { sub one by one.alt001; } liga; Eine ausführliche Dokumentation zur Syntax von Feature-Files gibt es auf der Seite von Adobe. Open in Online-Editor
\documentclass{article} \begin{filecontents*}{scala-one.fea} # Script and language coverage languagesystem DFLT dflt; languagesystem latn dflt; # Ligature formation feature liga { sub one by one.alt001; } liga; \end{filecontents*} \usepackage{fontspec} \setromanfont[Extension=.otf,UprightFont= *Regular,FeatureFile=scala-one.fea]{ScalaPro-} \begin{document} 01234 \end{document} xetex: Character ClassesIn XeTeX gibt es das Konzept der Character Classes. Jedes Zeichen gehört standardmäßig zur Character Class 1 (mit einigen Ausnahmen, z.B. bei CJK, siehe Docs). Die Wortgrenzen, also Leerraum jeder Art, sind aus Class 255. Mit Open in Online-Editor
\newXeTeXintercharclass\aalt \XeTeXcharclass`1=\aalt Nun fügen wir zwischen allen Zeichen der Klasse 0 und Open in Online-Editor
\XeTeXinterchartoks 0 \aalt = {\begingroup\addfontfeatures{RawFeature=+aalt}} \XeTeXinterchartoks 255 \aalt = {\begingroup\addfontfeatures{RawFeature=+aalt}} \XeTeXinterchartoks \aalt 0 = {\endgroup} \XeTeXinterchartoks \aalt 255 = {\endgroup} Das bedeutet, dass wenn eine 1 im Text gefunden wird, wird davor Open in Online-Editor
\XeTeXinterchartokenstate=1
Möchte man die Funktionalität kurz deaktivieren, so setzt man die Variable einfach auf 0. Open in Online-Editor
\documentclass{article} \pagestyle{empty} \usepackage{fontspec} \setromanfont[Extension=.otf,UprightFont= *Regular]{ScalaPro-} \newXeTeXintercharclass\aalt \XeTeXcharclass`1=\aalt \XeTeXinterchartoks 0 \aalt = {\begingroup\addfontfeatures{RawFeature=+aalt}} \XeTeXinterchartoks 255 \aalt = {\begingroup\addfontfeatures{RawFeature=+aalt}} \XeTeXinterchartoks \aalt 0 = {\endgroup} \XeTeXinterchartoks \aalt 255 = {\endgroup} \XeTeXinterchartokenstate=1 \begin{document} 01234 \end{document} beantwortet 30 Mär '16, 19:21 Henri Danke schonmal für die Mühe. In welche Richtung müsste ich schauen, um das auch in XeLaTeX zu realisieren? Die gewünschte Eins heißt übrigens "one.alt001".
(30 Mär '16, 20:20)
kwoid
@kwoid Ich habe meine Antwort vor einiger Zeit aktualisiert mit einer Lösung für XeTeX, habe aber vergessen Bescheid zu sagen.
(07 Apr '16, 10:41)
Henri
Danke. Das funktioniert. Ich hatte zunächst eine Zwischenlösung benutzt, die tatsächlich die 1 an den betreffenden Stellen durch \XeTeXglyph466{} austauscht (meine Dokumente werden ohnehin generiert). Aber so ist es natürlich eleganter.
(14 Apr '16, 11:43)
kwoid
|
Ich habe die Schriftdatei mit Fontforge geöffnet. Im Fenster Schriftinformationen (Ctrl+Shift+f, Menu: Element>Schrift-Eigenschaften) habe ich unter Lookups mit "Add Lookup" (Type: Single Substitution, Funktion "ss04") und "Add Subtable" eine neue Stilgruppe erzeugt, die aus dem Base Glyph Name (Spaltenüberschrift) "one(1)" den Replacment Glyph Name "one.alt001" macht. Mit Datei > Fonts herstellen habe ich den neuen Font gespeichert. Wenn ich nun mein zweites Beispiel mit geändertem Font-Namen und "StylisticSet=4" laufen lasse, erhalte ich die gewünschte Eins. Mir wäre eine XeLaTeX-Lösung ohne Eingriff in den Font lieber, aber so funktioniert das für mich. beantwortet 30 Mär '16, 21:07 kwoid 1
Ich kann vor solchen Lösungen nur warnen. Das Dokument ist damit nämlich nicht mehr ohne weiteres auf einen anderen Rechner übertragbar. So etwas macht deshalb leicht Ärger. Jemand anderem den geänderten Font zu geben, ist IMO lizenzrechtlich eventuell auch dann bedenklich, wenn derjenige eine Lizenz für den Originalfont hat.
(30 Mär '16, 21:11)
saputello
Guter Punkt. Habe aber einen Tag mit dem Problem verbracht und keine bessere Lösung gefunden.
(30 Mär '16, 21:21)
kwoid
|
Man kann bei XeTeX ein Mapping definieren, das beispielsweise ein Zeichen von einer Unicode-Position auf eine andere verschiebt. Da ich über den von Dir verwendeten Font nicht verfüge, sei hier stattdessen beispielhaft jede Open in Online-Editor
; TEckit mapping to output 2 instead of every 1 LHSName "oneistwo" RHSName "UNICODE" pass(Unicode) U+0031 > U+0032 Anschließen wandelt man diese Datei mit » Open in Online-Editor
\documentclass{article} \usepackage{fontspec} \setmainfont[Mapping=oneistwo]{Latin Modern Roman} \begin{document} 12345 \end{document} mit Die Die generelle Syntax der Eine etwas sinnvollere Anwendung als die obige wäre eventuell, mit Open in Online-Editor
; oldstylenumber.map ; TEckit mapping old style number digits to normal numbers LHSName "oldstylenumbers" RHSName "UNICODE" pass(Unicode) U+0030 <> U+F730 U+0031 <> U+F731 U+0032 <> U+F732 U+0033 <> U+F733 U+0034 <> U+F734 U+0035 <> U+F735 U+0036 <> U+F736 U+0037 <> U+F737 U+0038 <> U+F738 U+0039 <> U+F739 ein Mapping zu erzeugen, bei dem mit beantwortet 30 Mär '16, 21:59 saputello Coole Sache. Funktioniert bei mir schonmal grundsätzlich. Nur habe ich bei der Ansteuerung von meiner Eins ein Problem. Was muss in der map-Datei bei XXXXX stehen, damit ich meine Eins bekomme, für die mir Fontforge folgende Infos gibt: 65537 (0x10001) U+???? one.alt001 U+0031 > XXXXX ; 1 (oldstyle) -> alternative1
(30 Mär '16, 23:41)
kwoid
@kwoid: Wie gesagt, habe ich den Font nicht, kann deshalb damit nicht testen und auch keine Aussagen dazu treffen. Ich kann nur die generelle Möglichkeit erwähnen. Außerdem habe ich mich auch nur aufgrund Deiner Frage mit dem Fontmapping von XeTeX beschäftigt. Die einzige XeTeX-spezifische Doku dazu gibt es in den Quellen im Bereich
(31 Mär '16, 09:03)
saputello
Das funktioniert für die gewünschte Anwendung leider nicht, weil die Alternate Glyphs den gleichen Unicode-Slot haben. Man müsste innerhalb des Mappings die Font Features setzen, damit es funktioniert, also sowas wie
(31 Mär '16, 10:15)
Henri
|