Font Basislinie + Grösse, wie findet man die untere Position?
Philipp Hasenfratz
- grafik
Halihallo Forumer
Nach der Suche im Archiv bin ich auf folgenden Eintrag gestossen:
In http://forum.de.selfhtml.org/archiv/2002/12/31537/#m170584
hat Christian ganz schön aufgezeichnet, was die Fonts in PDF für Eigenschaften haben.
Ich beschäftige mich im Moment auch mit der automatischen Generierung von PDF-Files und
habe mir darüber auch den "Kopf zerbrochen". Mein Problem ist primär, dass ich
verschiedene Texte dynamisch positionieren muss (entweder über top-left oder bottom-
left). Das geht nur nicht ohne die Information "Abstand Basislinie - unterste px-Linie",
da die Basislinie in PDF zur Ausrichtung herangezogen wird, nicht jedoch die oberste
oder unterste "Pixel-Linie" des Fonts.
Mich quält jetzt die Frage, wie man die absolute Höhe von Basislinie zu unterstem Pixel
berechnet. Diese Information ist nötig, sodass ich einen Text nach der top-left Position
ausrichten könnte. Christians Tipp mit 1/5 der Schriftgrösse mag eine gute Näherung sein,
aber wie geht dies exakt? - Leider gibt es in PDF::API2::Font (Perl's API2 Interface
für PDF-Dateien von Alfred Reibenschuh) keine Methode um diese Information zu gewinnen.
Da ich annehme, dass dies ebenfalls von der Schriftart selber abhängt, müsste es
im Sinne eines vollständigen Moduls eigentlich über das Font-Modul abrufbar sein...
Fragen:
- Gibt es eine allgemeine (fontunabhängige) mathematische Formel?
- Ist diese Information im TTF-Font-Konzept allgemein festgehalten? - Oder ist diese
Information gar nicht wichtig (andere Möglichkeiten, wie z.B. allgemeine Formel)?
- Wie bekomme ich in Perl zu dieser Information?
- Wie ist eigentlich Zeilenabstand "definiert"? - Normaler Zeilenabstand ist einfach
ein Zeilenvorschub mit der Höhe des Fonts (sieht zumindest richtig aus). Was aber ist
1.5 facher Zeilenabstand ($font_size *= 1.5 ?)
Viele Grüsse
Philipp
Hallo.
- Gibt es eine allgemeine (fontunabhängige) mathematische Formel?
Ja, seit dem Fotosatz gibt es eine solche Formel.
- Ist diese Information im TTF-Font-Konzept allgemein festgehalten? - Oder ist diese
Information gar nicht wichtig (andere Möglichkeiten, wie z.B. allgemeine Formel)?
Ja, diese Information ist in den Spezifikationen aller modernen Schriftarten-Konzepte festgehalten. Und gerade im Zusammenspiel mit fremdländischen Schriften ist dieser Themenbereich von besonderer Wichtigkeit (http://partners.adobe.com/asn/tech/type/opentype/base.jsp).
- Wie bekomme ich in Perl zu dieser Information?
Ist die Programmiersprache hierfür tatsächlich maßgeblich?
- Wie ist eigentlich Zeilenabstand "definiert"? - Normaler Zeilenabstand ist einfach
ein Zeilenvorschub mit der Höhe des Fonts (sieht zumindest richtig aus). Was aber ist
1.5 facher Zeilenabstand ($font_size *= 1.5 ?)
Der Zeilenabstand ist keine Basisinformation einer Schriftart, sondern wird individuell durch den Gestalter oder -- schlechter -- durch seine Software vorgenommen. Bei einem Zeilenabstand in Schriftgröße spricht man von einem "kompressen" Satz. Hierbei muss damit gerechnet werden, dass sich Versalakzente und Unterlängen berühren. Außerdem gilt er als leseunfreundlich und es ist vielmehr so, dass durch einen großzügig bemessenen Zeilenabstand auch eine geringe Schriftgröße besser lesbar ist.
MfG, at
Halihallo at
- Gibt es eine allgemeine (fontunabhängige) mathematische Formel?
Ja, seit dem Fotosatz gibt es eine solche Formel.
Hm, du widersprichst dir selber? - Es ist doch fontabhängig, diese Formel wäre demnach
nur eine Annäherung.?
- Ist diese Information im TTF-Font-Konzept allgemein festgehalten? - Oder ist diese
Information gar nicht wichtig (andere Möglichkeiten, wie z.B. allgemeine Formel)?
Ja, diese Information ist in den Spezifikationen aller modernen Schriftarten-Konzepte festgehalten. Und gerade im Zusammenspiel mit fremdländischen Schriften ist dieser Themenbereich von besonderer Wichtigkeit (http://partners.adobe.com/asn/tech/type/opentype/base.jsp).
Vielen Dank. Ich habe inzwischen etwas für Perl gefunden:
Font::AFM
Eine Schnittstelle zu Adobe Font Metrics
Da gibt es Methoden für "Ascender", "Descender", "XHeight", welche jeweils die y-Offsets
für verschiedene Positionen angeben, daraus liesse sich bestimmt die gesuchte Anzahl
Pixel von Baseline zu unterstem Pixel des Glyphs finden.
Als ich das in der Beschreibung zu Font::AFM gefunden habe, habe ich auch das Äquivalent
für PDF::API2 gefunden. Die Methoden existieren auch in PDF::API2::CoreFont.
Leider gibt es dies nur für die Adobe CoreFonts, aber immerhin... Für TTF-Fonts habe ich
leider noch nichts entsprechendes gefunden. Wenn es denn sowas für Perl nicht gäbe,
würde ich eben einen fixen Faktor einsetzen, oder eine eigene Tabelle mit fixen Faktoren
für jede Schrift erstellen.
- Wie bekomme ich in Perl zu dieser Information?
Ist die Programmiersprache hierfür tatsächlich maßgeblich?
Sicherlich nicht (allgemein), aber für eine explizite Perl Lösung muss man auch die
Module die es für Perl gibt beachten, deshalb der Hinweis.
Der Zeilenabstand ist keine Basisinformation einer Schriftart, sondern wird individuell durch den Gestalter oder -- schlechter -- durch seine Software vorgenommen. Bei einem Zeilenabstand in Schriftgröße spricht man von einem "kompressen" Satz. Hierbei muss damit gerechnet werden, dass sich Versalakzente und Unterlängen berühren. Außerdem gilt er als leseunfreundlich und es ist vielmehr so, dass durch einen großzügig bemessenen Zeilenabstand auch eine geringe Schriftgröße besser lesbar ist.
OK, dann häng ich halt noch ein paar Pixel dran :-)
Eine allgemeine Definition gibt es also nicht. Gibt es "gängige" Vorschläge?
Viele Grüsse
Philipp
Hallo.
- Gibt es eine allgemeine (fontunabhängige) mathematische Formel?
Ja, seit dem Fotosatz gibt es eine solche Formel.Hm, du widersprichst dir selber? - Es ist doch fontabhängig, diese Formel wäre demnach
nur eine Annäherung.?
Für den Sprachraum der lateinischen und verwandten Schriften, gibt es eine allgemeingültige Formel, damit die Schriftunterkante nicht springt. Gute Bücher zum Thema erhältst du bei http://www.urw.de/
Der Zeilenabstand ist keine Basisinformation einer Schriftart, sondern wird individuell durch den Gestalter oder -- schlechter -- durch seine Software vorgenommen. Bei einem Zeilenabstand in Schriftgröße spricht man von einem "kompressen" Satz. Hierbei muss damit gerechnet werden, dass sich Versalakzente und Unterlängen berühren. Außerdem gilt er als leseunfreundlich und es ist vielmehr so, dass durch einen großzügig bemessenen Zeilenabstand auch eine geringe Schriftgröße besser lesbar ist.
OK, dann häng ich halt noch ein paar Pixel dran :-)
Eine allgemeine Definition gibt es also nicht. Gibt es "gängige" Vorschläge?
Vielleicht helfen dir die Standardeinstellungen der gängigen Textverarbeitungen weiter, indem du den Abstand auf die Einheit Punkt umstellst.
Mein persönlicher Favorit für Lesegrößen ist der sehr weite Abstand von 17,008 Punkt, aber das hat andere technische und gestalterische Gründe (Seitenraster).
MfG, at
Halihallo
[...]
Wie für Adobe CoreFonts, gibt es auch für TTF-Fonts eine Möglichkeit:
In PDF::API2::TTF:Vhea und Font::TTF::Vhea (Font-TTF Modulsammlung
http://search.cpan.org/dist/Font-TTF/) kann man auf die vertikale Headertabelle
des Fonts zugreifen. Ich schätze mal, damit komme ich weiter und sonst Frage ich
nochmal :-)
Viele Grüsse
Philipp
Halihallo
So, bin leider noch immer nicht wirklich weiter und langsam werde ich sauer :-)
Leider konnte ich auf die vertical-Headertabelle nicht bei jedem Font zugreifen, also
bin ich auf den Header der TTF zurückgegangen. Dort gibt es zwei Attribute, yMin und yMax
deren Sinn ich eigentlich nur erraten kann (Doku nicht wirklich hilfreich). Bei
Arial haben sie z.B. folgende Werte:
xMax: 4154
xMin: -1361
yMax: 2060
yMin: -665
unitsPerEm: 2048 (na, dann können wir das mal in Em umrechnen, s. ff...)
Calculated to em:
xMax: 2.0283203125
xMin: -0.66455078125
yMax: 1.005859375
yMin: -0.32470703125
calculated Font-information:
Size: 400 px (given)
yMax: 402.34375 px (naja, die BottomLine des Fonts + 402.3 px = TopLine?)
yMin: -129.8828125 px (Hm. BottomLine des Fonts = BaseLine - 129.882px ?)
(wird ausgegeben, beim starten meines Test-Programms, s. unten)
also yMin = -0.3247... tja, das stimmt schon mal etwa mit Christians 1/5 überein.
dann yMax = 1.0058... Hä? - Ein Buchstabe grösser als das totale selber? - Kann mir
das jemand erklären, was das soll?
Egal, kurz ein PDF-generierer geschrieben und mit den Werten rumgespielt, Resultat:
Disaster. Zumindest bei Arial ist das "H" grösser als die berechnete Top-linie des
Fonts... Schaut es euch selber an:
Arial: http://www.emedias.ch/fonttest/arial.pdf
TTF: http://www.emedias.ch/fonttest/arial.ttf
Times: http://www.emedias.ch/fonttest/times.pdf
TTF: http://www.emedias.ch/fonttest/times.ttf
Das Script liegt unter http://www.emedias.ch/fonttest/font.txt
Folgende "Formeln" habe ich verwendet:
Y-Achse der Top-Linie:
TopLineY = BaseLineY - (yMax+yMin) * FontSize
= something - (1.0058-0.3247) * 400 (in den PDF's)
Y-Achse der Bottom-Linie:
BotLineY = BaseLineY - (yMin) * FontSize
= something - 0.3247 * 400 (also etwa BaseLine-130px)
Y-Achse der Base-Line:
Äm, da wird der Font ausgerichtet, kann man also selber ganz einfach festlegen...
---
Liebe Leute, ich hab den Überblick verlohren... Ich weiss weder was ich will (OK, dass
ich eine richtige, saubere Darstellung kriege), noch wie ich es erreiche...
Fakt ist, dass entweder meine Berechnungen falsch sind, die yMin/yMax nicht dem
entsprechen, was ich glaube dass sie sind, oder dass meine TTF-Fonts korrupt sind...
Nun, vielleicht hat jemand von euch eine Idee?
Allgemeine Zielsetzung ist übrigens schlicht: Die Y-Position der TopLine und der Bottom-
Line des Fonts zu berechnen (BaseLine gegeben).
Viele Grüsse
Philipp
Hallo.
Kennst du http://www.microsoft.com/typography/specs/default.htm?
In http://www.microsoft.com/typography/tt/ttf_spec/ttch01.doc
heißt es:
"
While in the days of metal type, glyphs could not extend beyond the em square, digital typefaces are not so constrained. The em square may be made large enough to completely contain all glyphs, including accented glyphs. Or, if it proves convenient, portions of glyphs may extend outside the em square. TrueType fonts can handle either approach so the choice is that of the font manufacturer.
"
Das bedeutet, dass es dir leider gar nichts nutzt, die Grundlinie zu finden, weil die Buchstaben aus unerfindlichen Gründen offenbar nach Gutdünken der Hersteller über die eigentliche Grundfläche hinausragen dürfen :-(
Aber warum bindest du nicht einfach LaTex ein?
MfG, at
Halihallo at
Kennst du http://www.microsoft.com/typography/specs/default.htm?
In http://www.microsoft.com/typography/tt/ttf_spec/ttch01.doc
heißt es:
Danke für die Links! - Sehr interessant.
Das bedeutet, dass es dir leider gar nichts nutzt, die Grundlinie zu finden, weil die Buchstaben aus unerfindlichen Gründen offenbar nach Gutdünken der Hersteller über die eigentliche Grundfläche hinausragen dürfen :-(
Oha :-)
Naja, zumindest macht yMax/yMin doch Sinn. Nun, einiges kann ich mir noch immer nicht
erklären. Da wäre z.B. das "H" in Arial, welches über das berechnete Top hinausragt,
oder das viel zu tief angelegte Bottom (nicht mal das unterste Pixel vom "gp" erreicht
diese, gibt es denn einen Buchstaben in Arial, der noch tiefer runter geht?).
Aber warum bindest du nicht einfach LaTex ein?
Naja, leider wäre ich dann auf externe Programme angewiesen und zweitens:
Würde es denn mein Problem lösen? - Schliesslich wird LaTeX mit denselben Problemen
zu kämpfen haben; entweder sind diese Probleme lösbar oder nicht, wenn sie lösbar sind,
finde ich sie auch (mit der Zeit kommt Rat) :-)
Ich kenne LaTeX zwar nur wenig (aber selbst ich habe schon Mathe-Zusammenfassungen auf
LaTeX geschrieben und kenne die Vorteile gegenüber dem Formeleditor von Winword *g*),
weiss jedoch, dass es _das_ DesktopPublishing Tool ist (und somit sicher den nötigen
Funktionsumfang hätte).
Viele Grüsse und Danke für Deine Antworten
Philipp
Halihallo at
Aber warum bindest du nicht einfach LaTex ein?
Weitere Argumentation: Mir geht es sekundär um das Verständnis. Natürlich könnte ich dies
anders lösen. Warum geht man noch in Physik-Stunden, wenn doch alles in der
Formelsammlung steht? - Es geht a) um das Verständnis und b) um die Fähigkeit anzulernen,
durch eigene Gedanken auf das Ergebnis zu kommen und nicht zuletzt c) das nötige Grund-
wissen anzueignen. Analog geht es mir bei dieser Font-Problematik. Ein Umsetzen über
LaTeX wäre nichts anderes, als wenn ich in der Prüfung die Formeln auf einem Spick stehen
hab :-)
Viele Grüsse
Philipp
Hallo.
Dann empfehle ich dir die Literatur von Adobe (Postscript, OpenType, PDF), Microsoft (TrueType, OpneType), Apple (TrueType), Agfa/Monotype, Heidelberg/Linotype, Berthold und URW. Und natürlich die Fontographer-Handbücher von Macromedia.
Einen ganzen Schwung Bücher könntest du bei der Auflösung von Cassidy & Green ergattern. Dieses für seine Mac-Tools bekannte Unternehmen, das vor kurzem die Einstellung seiner Aktivitäten bekannt gab, war nämlich der allererste Hersteller von Postscript-Schriften (CG Times etc.).
Mir wird das aber zu technisch ;-)
Ich wünsche dir noch viel Spaß sowie natürlich den hochverdienten Erfolg.
MfG, at
Halihallo at
Dann empfehle ich dir die Literatur von Adobe (Postscript, OpenType, PDF), Microsoft (TrueType, OpneType), Apple (TrueType), Agfa/Monotype, Heidelberg/Linotype, Berthold und URW. Und natürlich die Fontographer-Handbücher von Macromedia.
Halleluja, ich hoffe ich hab in meinem Bücherregal noch genügend Platz :-)
Mir wird das aber zu technisch ;-)
Mir ehrlich gesagt auch :-)
(verflixt, ich will doch nur die Ober- und Unterlinie *g*)
Ich wünsche dir noch viel Spaß sowie natürlich den hochverdienten Erfolg.
Danke. Danke auch für die Links und Tipps.
Viele Grüsse
Philipp