Ich habe eine Tabelle, in der eine Grafik und ein Text steht. Nun möchte ich, dass beide vertikal oben ausgerichtet wird. Wie ist das möglich? Ich habe bereits viele verschiedene Dinge probiert, jedoch ohne Erfolg. Der Text ist leider immer unten ausgerichtet.
Hier ein Minimalbeispiel:
Wichtige Vorausetzung: Die Grafik ist natürlich größer als eine Zellehöhe.
\documentclass[11pt, ngerman]{scrartcl} \usepackage{graphicx} \usepackage{longtable} \usepackage{babel} \begin{document} \begin{longtable}[l]{|p{0.5\textwidth}|p{0.5\textwidth}|} \hline \textbf{Spalte 1} & \textbf{Spalte 2} \\ Text & \includegraphics{grafik.png} \\ \hline \end{longtable} \end{document}
Mehrere Dinge
Zunächst brauchst Du für ein Minimalbeispiel des Problems weder graphicx, noch longtable oder babel. Dann ist anzumerken, dass eine Tabelle mit zwei Spalten, bei der jede Spalte 0,5
\textwidth
breit ist, insgesamt breiter als\textwidth
ist, weil zur reinen Spaltenbreite noch der Spaltenabstand kommt und zwar vor und nach jeder Spalte. Deshalb meldet TeX auchoverfull \hbox
.Als nächstes sind die beiden Zellen tatsächlich gar nicht unten ausgerichtet, sondern oben, auch wenn der Anschein das Gegenteil vermuten lässt. Tatsächlich ist es aber so, dass bei Abbildungen der Referenzpunkt unten links liegt. Dieser wird auf der Grundlinie ausgerichtet. Die Abbildung hat also eine große Höhe und keine Tiefe. Der Text hat dagegen eine kleine Höhe und – je nach Text &ndash auch noch ein wenig Tiefe. Das ist auch der Grund, warum
\rule
so einfach als Ersatz für eine Abbildung verwendet werden kann. Diese hat ebenfalls nur Höhe und keine Tiefe.Wenn man das erst einmal weiß, dann ist die Lösung vergleichsweise einfach. Man muss nur dafür sorgen, dass die Abbildung die maximale Höhe einer Textzeile bekommt und der Rest zu Tiefe wird. Die maximale Höhe einer Textzeile ist die Höhe der Box, die von der unsichtbaren Stütze
\strut
gesetzt wird. Die Box heißt\stutbox
. Die Höhe einer Box ist\ht<em><Box></em>
. Zum vertikalen Verschieben gibt es die Anweisung\raisebox{<em><Verschiebung></em>}{<em><zu verschiebender Inhalt></em>}
(die Anweisung hat auch noch optionale Argumente, die Du bitte in einer LaTeX-Einführung nachschlägst). Die Gesamthöhe (Höhe + Tiefe) des Inhalts von\raisebox
ist in\totalheight
zu finden. Um nun also die Gesamthöhe abzüglich der maximalen Zeilenhöhe zu erhalten, muss man entweder über eine Hilfslänge mit den mageren LaTeX-Mitteln rechnen, oder man verwendet das Paket calc:oder aber man rechnet schlicht und einfach mit Hilfe der Möglichkeiten, die e-TeX bietet:
Inzwischen bevorzuge ich die letzte Möglichkeit. Falls Du ebenfalls e-TeX-Features nutzen willst, lies diese bitte im e-TeX-Manual nach.
Vielen Dank
Vielen Dank für deine ausführliche Erklärung!
Zugegeben finde ich die Lösung zwar sehr gut nachvollziehbar, aber da es sich meiner Meinung nach nicht um eine außergewöhnliche Anforderung handelt, halte ich die Vorgehensweise dennoch für recht aufwändig.
Mit Hilfe eines eigenen Kommandos lässt sich das natürlich leicht vereinfachen, aber ich hätte einen einfacheren Weg vermutet.
Ich habe außerdem eine Frage zur Berechnung der Spaltenbreite für Tabellen. In deinem Minimalbeispiel funktioniert die Berechnung einwandfrei, so dass es zu keiner übervollen Box kommt. Verwende ich diese Tabelle hingegen in meinem Dokument, kommt es dennoch zu einer übervollen Box.
Hast du eine Idee, woran das liegen könnte?
Ich verwende diesen Code in meinem Dokument:
Nochmals vielen Dank für deine Hilfe!
\noindent vergessen?
Da Du nur den Codeschnipsel beigefügt hast, der in meinem Beispiel einwandfrei funktioniert, kann ich nur raten. Vermutlich wird die Tabelle mit normalem Absatzeinzug gesetzt. Dann bekommst Du eine
overfull \hbox
im Bereich von 1 em, also je nach Grundschrift ca. 10 pt–12 pt. Im Beispiel habe ich den Absatzeinzug mit\noindent
verhindert.Das ist es wohl nicht...
Nein, das ist es wohl nicht. Wenn ich
\noindent
vor der Tabelle einfüge, ändert das nichts im Ergebnis.Stelle ich den draft-Modus ein sehe ich, dass die Tabelle nach rechts hin breiter ist als bspw. die Linie der Kopfzeile.
Könnte es evtl. an einer der folgenden Einstellungen aus der Konfiguration liegen?
Jain
Mit Option
parskip
darf die letzte Zeile eines Absatzes nicht voll sein. Wenn der Absatz nur aus einer Tabelle besteht, führt das aber dazu, dass die Tabelle gleichzeitig die letzte Zeile ist. Das erklärt eineoverfull \hbox
. Man kann das vermeiden, indem man die Tabelle\raggedright
setzt oder aber lokal\parskipfill
ändert.Die Option erklärt aber nicht, warum die Tabelle breiter als die Kopfzeile ist. Das kann ich mir wirklich nicht erklären.
Ich fürchte, ohne vollständiges Minimalbeispiel kann ich Dir nicht helfen.
Problem mit Tabellen-Paketen?
Es scheint an den Tabellenpaketen zu liegen. Sobald ich im unten angegebenen Beispiel das Paket
verwende, kommt es zu diesem Effekt. Werden diese Pakete nicht verwendet, sieht es (optisch) in Ordnung aus, auch wenn dann immer noch eine Warnung kommt.
Das erklärt es
Das Paket array setzt die vertikale Linie nicht in den Abstand der Spalten, sondern zwischen den Abstand der Spalten. Es muss also noch die Breite der drei vertikalen Linien weg:
Super!
Vielen Dank für die Hilfe!
Und als kleine Ergänzung noch:
Auch wenn es typografisch vermutlich besser ist, dies nicht zu tun, kann man sich mit
parksip-
einen beträchtlichen Teil dieses Codes sparen.Noch ein Problem...
Da die Schreibweise zugegeben sehr gewöhnungsbedürftig ist, würde ich gerne ein neues Kommando bzw. einen neuen Spaltentyp definieren, um die Spaltenbreiten zu setzen.
Das Ganze soll dann z.B. über einen neuen Spaltentyp so funktionieren:
Der erste Parameter gibt die prozentuale Breite der Spalte an (zwischen 0 und 1), der zweite gibt die Anzahl der Spalten an. Mit dieser soll Breite der senkrechten Linien abgezogen werden ([Anzahl+1]/Anzahl).
Leider funktioniert dies nicht. Ich habe mehrere Varianten ausprobiert, auch über ein neues Kommando mittels
\newcommand
.Bitte beachten: Die Berechnung zur Subtrakation der Liniendicke ist noch nicht eingebaut, da es bereits zuvor einen Fehler gibt.