PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Text auf Baseline ausrichten



peyo
18-10-2011, 12:36
Hallo,

habe folgendes Problem, wenn ich eine Box erstelle und dort dann Text platziere, ist beispielsweise bei Kleinbuchstaben die Höhe kleiner als bei Großbuchstaben. Gibt es eine Möglichkeit den Text auf einer "Baseline" auszurichten?

\documentclass[12pt,a4paper]{article}
%\documentclass{scrartcl}
\usepackage{array}
\usepackage[ngerman]{babel}
\usepackage{graphicx}
\usepackage{lastpage}
\usepackage{color}
\usepackage{tabularx}
\usepackage{paralist}
\usepackage{enumitem}
\usepackage{multirow}
\usepackage[none]{hyphenat}
\usepackage[dvips,pdftex,top=0pt,bottom=-10pt,left=-10pt,right=0pt]{geometry}
\usepackage{xltxtra}
\scrollmode
\usepackage{hyperref}
\definecolor{cmykblack}{cmyk}{0,0,0,1}
\begin{document}
\setlength{\unitlength}{1cm}
\begin{picture}(21,29.7)(0.4,0)
\put(2,29.7){\raisebox{-\height}[Bl]{}}
\put(2,29.7){\raisebox{-\height}[Bl]{äa}}
\put(3,29.7){\raisebox{-\height}[Bl]{Aj}}
\put(2,28.7){\raisebox{-\height}[Bl]{Ac}}
\put(3,28.7){\raisebox{-\height}[Bl]{}}
\put(4,28.7){\raisebox{-\height}[Bl]{Ad}}
\put(4,29.7){\raisebox{-\height}[Bl]{As}}
\end{picture}
\end{document}

Danke für eure Antworten,
LG

peyo

Schweinebacke
18-10-2011, 12:40
Man kann zum einen \makebox(Breite,Höhe)[Ausrichtung]{Text} verwenden, zum anderen gibt es noch die unsichtbare Stütze \strut, die man dem Text voranstellen kann, um ihm einen definierte Höhe und Tiefe zu geben.

peyo
18-10-2011, 12:46
Soll ich dann anstatt raisebox eine makebox machen? oder die makebox in die raisebox mit gleicher höhe und breite platzieren?
also bspw.

\put(2,29.7){\raisebox{-\height}{\makebox(2,29.7)[Bl]{text}}} <--- so klappt das leider nicht

?

u_fischer
18-10-2011, 13:08
Was macht denn dieses [Bl] in deinem Code? Und wieso schiebst du deinen Text von der Grundlinie weg, wenn du das gar nicht willst?

peyo
18-10-2011, 13:19
Mit dem [B] wollte ich eigentlich sagen, dass der Text sich auf der Baseline ausrichten soll.
Ich mache das -height, weil der Bezugspunkt links oben sein soll und sich die Box quasi von oben nach unten aufbauen muss. Das Problem besteht eben nur, wenn beispielsweise in einer Box Kleinbuchstaben vorkommen und in der daneben Großbuchstaben oder Umlaute. Dann sind die Kleinbuchstaben eben viel höher wie die Großbuchstaben.

u_fischer
18-10-2011, 13:29
Nun, mir sind die Angaben "Bl" nur beim origin-Key \rotatebox bekannt. Dass sie bei \raisebox funktionieren sollen, wäre mir neu. Und ich bekomme auch lauter Fehlermeldungen:


! Missing number, treated as zero.
<to be read again>
B
l.24 \put(2,29.7){\raisebox{-\height}[Bl]{}}

Vielleicht solltest du mal \scrollmode abschalten. Ich würde auch empfehlen, dieses Enginedurcheinander (dvips, pdftex, xltxtra=xetex) aufzuräumen.

u_fischer
18-10-2011, 13:33
Ich mache das -height, weil der Bezugspunkt links oben sein soll und sich die Box quasi von oben nach unten aufbauen muss.

Das macht doch keinen Sinn, deine \raisebox kann doch nur einzeiligen Text aufnehmen. Nimm stattdessen \parbox[t]{Breite}{Text} oder eine tabular mit Option [t].

peyo
18-10-2011, 13:34
Hab das mit [Bl] nicht gewusst. Nur mal ausprobiert.
Hast du noch ne Idee wie ich das hin bekomme? Ich weiß gar ned ob das überhaupt geht, hab aber die konkreten Vorgaben, dass sie die Box von oben nach unten aufbauen muss und dass sich die Buchstaben auf einer Linie orientieren sollen :(

LG
peyo

peyo
18-10-2011, 13:35
Nimm stattdessen \parbox[t]{Breite}{Text} oder eine tabular mit Option [t].


okay ich probiere das mal aus

peyo
18-10-2011, 13:45
Hallo,

habe das jetzt ausprobiert und das klappt jetzt so, dass die Buchstaben auf einer Linie sind. Allerdings wenn ich bsp. eine feste Breite von 3 angebe, dann bricht der Text leider nicht um sondern schreibt über die Breite hinaus.
Wie krieg ich das in den Griff?

\put(2,28.7){\parbox[t]{3}{äaaaaaaaaaaabbbbbbbbbbbbbbcccccccccccccccddddd ddddddddddeeeeeeeeeeeeeeeefffffffffff}}

Danke =)

Schweinebacke
18-10-2011, 13:54
Wenn Du Trennung im ersten Wort haben willst, dann musst \hspace{0pt} davor setzen. \parbox erwartet übrigens beim Breiten-Parameter AFAIK auch innerhalb von picture eine Einheit.

peyo
20-10-2011, 08:34
Hallo schweinebacke,

Danke für deine Anwort. Jedoch versteh ich das noch nicht ganz.
Egal wo ich \hspace{0pt} hinschreibe, der hält die Grenzen einfach nicht ein.


\parbox erwartet übrigens beim Breiten-Parameter AFAIK auch innerhalb von picture eine Einheit.

Was genau meinst du damit?


\begin{document}
\setlength{\unitlength}{1cm}
%\color{cmykblack}
\begin{picture}(21,29.7)(0.4,0)
\put(2,28.7){\parbox[t]{1}{}}
\put(2,28.7){\parbox[t]{3}{\hspace{0pt}äaaaaaaaaaaabbbbbbbbbbbbbbccccc ccccccccccdddddddddddddddeeeeeeeeeeeeeeeefffffffff ff}}
\put(3,28.7){\parbox[t]{1}{Aj}}
\put(2,27.7){\parbox[t]{1}{Ac}}
\put(3,27.7){\parbox[t]{1}{}}
\put(4,27.7){\parbox[t]{1}{Ad}}
\put(4,28.7){\parbox[t]{1}{As}}
\end{picture}
\end{document}

leider klappt das immer noch nicht :(

Vielen Dank für eure Hilfe!!

Liebe Grüße

LuPi
20-10-2011, 09:42
Was genau meinst du damit?

\parbox[t]{1}{bar} ist keine korrekte Syntax, es sollte \parbox[t]{1cm}{bar}
oder so heißen. Gibt das bei Dir keine Fehlermeldung (Illegal unit of measure)?
Deine Angabe \setlength{\unitlength}{1cm} bezieht sich hier nicht auf
\parbox!


Ich hab' Dein Beispiel noch etwas eingedampft:


\documentclass{scrartcl}
%\usepackage[ngerman]{babel}
\begin{document}
\rule{3cm}{1ex}

\parbox{3cm}{\hspace{0pt}äaaaaaaaaaaabbbbbbbbbbbbb bccccc ccccccccccdddddddddddddddeeeeeeeeeeeeeeeefffffffff ff}
\end{document}

Vergleiche bitte das Ergebnis mit und ohne babel. Das ist leider (noch) keine
Lösung, aber vielleicht ein Schritt auf dem Weg dahin.

peyo
20-10-2011, 10:29
Hallo LuPi,

erstmal Danke für deine Hilfe. Dein Beispiel ist zwar noch nicht die richtige Lösung aber verdeutlicht auch bisschen mein Problem. Hier ist gut zu erkennen, dass bei dem put(2,27.7) und bei dem put mit (4,27.7) der Höhenunterschied von den "Klein-" bzw. "Großbuchstaben" mein Problem ist.
Wenn eine Box beispielsweise nur aus Kleinbuchstaben besteht, dann sind die immer viel weiter oben wie wenn in einer Box ein Großbuchstaben vor kommt. Wie hier bei der Ausgabe.



\documentclass[12pt,a4paper]{article}
%\documentclass{scrartcl}
\usepackage{array}
\usepackage[ngerman]{babel}
\begin{document}
\rule{3cm}{1ex}
\setlength{\unitlength}{1cm}
%\color{cmykblack}
\begin{picture}(21,29.7)(0.4,0)
\put(2,28.7){\parbox[t]{1cm}{}}
\put(2,27.7){\parbox{3cm}{\hspace{0pt}äaaaaaaaaaaa bbbbbbbbbbbbbbccccc ccccccccccdddddddddddddddeeeeeeeeeeeeeeeefffffffff ff}}
\put(3,27.7){\parbox[t]{1cm}{}}
\put(4,27.7){\parbox[t]{1cm}{A}}
\end{picture}
\end{document}

Danke für eure Hilfe!

u_fischer
20-10-2011, 10:45
Ich sehe da nur, dass du bei manchen \parbox-Befehlen die Option [t] weggelassen hast.

LuPi
20-10-2011, 10:49
Um den Unterschied zwischen Einträgen mit fehlenden Ober- und Unterlängen
(wie beispielsweise a, c, e usw.) auszugleichen, kannst Du mit \vphantom{G}
oder \vphantom{q} arbeiten. Falls ich diesen Teil Deines Problems richtig
verstehe.

peyo
20-10-2011, 11:01
Im Anhang seht ihr eine Skizze zu meinem Problem.

Wenn ich von dem Ausgangscode ausgehe mit der raisebox, dann macht die sowas.


\put(2,29.7){\raisebox{-\height}{}}
\put(2,29.7){\raisebox{-\height}{äa}}
\put(3,29.7){\raisebox{-\height}{Aj}}
\put(2,28.7){\raisebox{-\height}{c}}
\put(3,28.7){\raisebox{-\height}{}}
\put(4,28.7){\raisebox{-\height}{A}}
\put(4,29.7){\raisebox{-\height}{As}}

ich weiß, ihr habt mir da schon geholfen, aber ich komme irgendwie nicht weiter :(

Danke schonmal für eure weiter Hilfe

LuPi
20-10-2011, 11:09
Und wie gefällt Dir das?


\put(2,28.7){\raisebox{-\height}{c\vphantom{A}}}

peyo
20-10-2011, 12:01
Hallo Lupi,

das gefällt mir sehr gut.
Das einzige was noch etwas problematisch ist ist, die 2 Buchstaben müssen in 2 getrennten Boxen stehen. Diese werden dann mit Hilfe eines Algorithmus auf der Seite platziert.
Das ist leider die Vorschrift vom Arbeitgeber.

Danke nochmals.

Ps. ich arbeite mit xelatex, ich hoffe das ist kein Problem

LuPi
20-10-2011, 12:20
Gegenfrage: Welche zwei Buchstaben? Welche zwei Boxen? :confused:

xelatex sollte hier eigentlich kein Thema sein (ohne dass ich mit damit auskennen würde).

peyo
20-10-2011, 12:23
also es ist so, dass ich da Buchstaben/Texte aus einer Datenbank bekomme. Bei den Texten wird dann der Platz vermessen und dann mit Latex in eine box geschrieben. Die Box wird dann mit Hilfe von put an der richtigen Stelle im .pdf platziert.
Es gibt viele verschiedene Texte/Daten die ich bekomme und wenn in dem Datenbankeintrag nur Kleinbuchstaben stehen und in der Box die daneben platziert werden müssen Großbuchstaben, dann wird die Box mit den Kleinbuchstaben höher gesetzt als die mit den Großbuchstaben. Das ist natürlich nicht oft der Fall, aber es ist schon vorgekommen.

Schweinebacke
20-10-2011, 12:35
Und wie gefällt Dir das?


\put(2,28.7){\raisebox{-\height}{c\vphantom{A}}}
Wie ich schon erwähnt habe: \strut besorgt nicht nur eine einheitliche Höhe, sondern auch eine einheitliche Tiefe:
\put(2,28.7){\raisebox{-\height}{\strut c}}
Das \strut am besten überall einbauen, nicht nur bei den Kleinbuchstaben.

LuPi
20-10-2011, 12:48
Dazu eine Frage: Laut Herberts LaTeX-Referenz gibt \strut eine Box aus mit
"der Höhe des 0,7- und der Tiefe des 0,3-fachen von \baselineskip".
Verschiedene Schriften weisen aber unterschiedliche Ober- und Unterlängen aus.
Gibt es dann - vermutlich kaum sichtbare - Abweichungen zwischen \strut
und \vphantom?

peyo
20-10-2011, 12:52
Super! Danke!
Hat bis jetzt sehr gut geklappt mit

\put(2,29.7){\raisebox{-\height}{\strut äa}}

:)

Schweinebacke
20-10-2011, 13:25
\vphantom ist die eine Box der realen Höhe und der realen Tiefe des Inhalts und damit vom Inhalt abhängig. \strutbox ist immer eine horizontale Box der Höhe .7\baselineskip, der Tiefe .3\baselineskip und der Breite 0. Die Schriftgröße und \baselineskip sind im allgemeinen nicht gleich. Bei LaTeX ist voreingestellt, dass \baselinskip ungefähr das 1,2-fache der Schriftgröße ist.

\strut wiederum kopiert eine \strutbox bzw. eine \strutbox in die Ausgabe, wobei das im Textmodus ein wenig anders geschieht als im Mathemodus.

LaTeX selbst fügt an bestimmten Stellen die Höhe oder die Tiefe einer \strutbox ein bzw. auch \strut. Anpassungen an das Raster sind deshalb mit \strut in der Regel immer wichtig. Anpassungen mit \vphantom{Ag} sind aber nur dann passend, wenn A die richtige Höhe und g die richtige Tiefe hat. Oder ist vielleicht T höher als A oder Á höher als Ä und q tiefer als g? Wer weiß das schon. Das ist wirklich Font-abhängig. \strut ist hingegen unabhängig von der Schrift.

LuPi
20-10-2011, 13:43
Besten Dank für die Erläuterung, das war mir im Detail so bisher nicht klar!