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's gravatar image

kwoid
36114
Akzeptiert-Rate: 0%

bearbeitet 30 Mär '16, 20:15


luatex: Feature File

(Malipivo, 2014)

Am 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 ff durch ersetzt wird. Dieser Mechanismus erlaubt es jede beliebige Kombination von Zeichen durch eine andere zu ersetzen. Hier ersetzen wir one durch one.alt001.

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}

alt text

xetex: Character Classes

(egreg, 2011)

In 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 \XeTeXinterchartoks lässt sich zu Laufzeit Material zwischen Zeichen beliebiger Klassen einfügen. Wir erstellen zunächst eine neue Klasse und fügen das Zeichen 1 hinzu.

Open in Online-Editor
\newXeTeXintercharclass\aalt
\XeTeXcharclass`1=\aalt

Nun fügen wir zwischen allen Zeichen der Klasse 0 und \aalt sowie 255 und \aalt Material ein.

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 \begingroup\addfontfeatures{RawFeature=+aalt} und danach \endgroup eingefügt. Wir schalten also lokal das Feature +aalt an. Zu guter Letzt müssen wir die \XeTeXinterchartoks noch aktivieren. Das geht mit

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}

alt text

Permanenter link

beantwortet 30 Mär '16, 19:21

Henri's gravatar image

Henri
15.7k133943
Akzeptiert-Rate: 46%

bearbeitet 31 Mär '16, 10:32

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.

Permanenter link

beantwortet 30 Mär '16, 21:07

kwoid's gravatar image

kwoid
36114
Akzeptiert-Rate: 0%

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 1 in einem Dokument durch eine 2 ersetzt. Dazu speichert man zunächst die folgende Textdatei im Dokumentverzeichnis als oneistwo.map:

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 »teckit_compile oneistwo.map -i oneistwo.tec« in ein tec-Datei um. Verarbeiten wir nun

Open in Online-Editor
\documentclass{article}
\usepackage{fontspec}
\setmainfont[Mapping=oneistwo]{Latin Modern Roman}
\begin{document}
12345
\end{document}

mit xelatex, so erhalten wir:

alt text

Die 1 im Quellcode wurde also in der Ausgabe durch eine 2 ersetzt.

Die generelle Syntax der map-Dateien und damit auch die Möglichkeiten der Ersetzungen findet sich in der TECkit Language Reference.


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 Mapping=oldstylenumbers alle Ziffern durch ihre oldstyle-Variante zu ersetzen.

Permanenter link

beantwortet 30 Mär '16, 21:59

saputello's gravatar image

saputello
11.1k174365
Akzeptiert-Rate: 51%

bearbeitet 31 Mär '16, 09:04

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 teckit. Das ist etwas mager. Ich habe auch leider nicht die Zeit, um mich tiefer rein zu hängen. Daher kann ich nicht wirklich sagen, was tatsächlich damit alles möglich ist, ob man beispielsweise Zeichen auch über ihren Glyph-Namen ansprechen kann.

(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 U+0031 > U+0031 (+aalt). Ich weiß allerdings nicht, ob es sowas gibt.

(31 Mär '16, 10:15) Henri
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:

×14
×10
×9
×2

gestellte Frage: 30 Mär '16, 17:13

Frage wurde gesehen: 10,159 Mal

zuletzt geändert: 14 Apr '16, 11:43