
Zunächst einmal ist dies mein erster Beitrag hier auf tex.stackexchange.com. Ich bin neu in der Tex-Welt und brauche ein wenig Ihre Hilfe.
Ich versuche, Text relativ zu einer Abbildung auszurichten. So soll es am Ende aussehen:
an a4 paper
_______________________________________________
| _______________ |
| | | |
| desc | a figure | desc |
| |_____________| |
| _______________ |
| | | |
| desc | a figure | desc |
| |_____________| |
| _______________ |
| | | |
| desc | a figure | desc |
| |_____________| |
| _______________ |
| | | |
| desc | a figure | desc |
| |_____________| |
| 0 5 15 30 min |
| |
| Figure 1: A caption |
| |
| |
| |
|_____________________________________________|
Die Beschreibungen rechts und links sind unterschiedlich lang. Auch die Länge der einzelnen Bilder ist unterschiedlich. Die Bilder selbst haben die gleiche Größe. Die Abbildungen sollten jedoch in der Mitte der Seite bleiben, d. h. die Bildunterschrift sollte horizontal mittig unter den Abbildungen stehen.
Die Abbildungen liegen im PNG-Format vor. Ich verwende pdfLatex.
Ich habe versucht, dieses Problem mit mehreren Ansätzen zu lösen, darunter das Platzieren der PNGs in einer EPS-Datei mit PSFrag-Referenzpunkten für den Text. Dabei habe ich jedoch keine Möglichkeit gesehen, das eigentliche Bild zu zentrieren, da mit PSFrag der Text mit variabler Länge in das Bild eingefügt wird und auch die Linksausrichtung des Erdrutschtexts nicht möglich war. Siehe Beispiel 1.
Ich habe versucht, mit dem Floatrow-Paket den Text als Untertitel links neben der Abbildung zu platzieren. Das hat nie wirklich funktioniert und ich habe noch nicht einmal damit begonnen, den Text auf der rechten Seite der Abbildung zu platzieren.
Ich habe die Abbildungen also in einer Tabelle platziert, aber wieder habe ich Probleme, die Bilder zentriert auszurichten. Siehe Beispiel 2 für eine allgemeine tabellarische Vorstellung. Siehe Beispiel 3 für die zentrierte Ausrichtung der Flecken.
Die Idee der Tabelle besteht darin, die Breite der ersten Zeile auf .33\Textbreite einzustellen, damit das Bild immer zentriert auf der Seite beginnt [EDIT: logischer Fehler -> siehe Kommentar, ich denke, es sollte .33\Textbreite-.5{Breite der Abbildung in der zweiten Zeile der Tabelle} sein]. In der zweiten Zeile steht die Abbildung, in der dritten Zeile die andere Beschreibung. Ich möchte nicht, dass die Beschriftung auf der linken Seite rechtsbündig ist, da die Beschreibung der Abbildung immer diesem Format folgen würde: IP irgendwas WB irgendwas, also sollte die IP vertikal ausgerichtet sein.
Beispiel 3 kommt dem nahe, ist aber nicht perfekt ... und die Einrichtung ist sehr umständlich, also gibt es vielleicht einen einfacheren Ansatz? Ich habe an so etwas gedacht, aber es funktioniert nicht richtig?
Die verwendeten Zahlen sehen wie folgt aus:
png
eps
\begin{tabularx}{\textwidth}{XlMl}
\multicolumn{2}{p{.333\textwidth}}{} \\
&Ip EphA2 Wb PTEN &\includegraphics[width=4cm]{gfx/blots/test.png} & -- \SI{100}{\kilo\dalton} \\
\end{tabularx}
Beispiel 1
\documentclass[11pt]{article}
\usepackage{blindtext}
\usepackage[]{auto-pst-pdf}
\usepackage{psfrag}
\begin{document}
\blindtext
\begin{figure}[bth]
\footnotesize
\psfragfig{gfx/test}
\caption{Some Blots.}
\label{fig:blot}
\end{figure}
\end{document}
Die entsprechende Datei test-psfrag.tex enthält diesen Code:
\psfrag{1}[br]{IP EphA2 WB EphA2}
\psfrag{2}[br]{IP NHERF1 WB Cbl}
\psfrag{3}[br]{IP pPTEN WB pTyr}
\psfrag{4}[br]{IP EphA2 WB NHERF1}
\psfrag{a}[bl]{-- \SI{110}{\kilo\dalton}}
\psfrag{b}[bl]{-- \SI{120}{\kilo\dalton}}
\psfrag{c}[bl]{-- \SI{130}{\kilo\dalton}}
\psfrag{d}[bl]{-- \SI{140}{\kilo\dalton}}
\psfrag{w}[l]{0}
\psfrag{x}[l]{5}
\psfrag{y}[l]{15}
\psfrag{z}[l]{30}
Beispiel 2:
\documentclass{scrartcl}
\usepackage{array}
\usepackage{showframe}
\usepackage{tabularx}
\usepackage{siunitx}
\usepackage{graphicx}
\newcolumntype{y}{>{\centering\arraybackslash}X}
\newcolumntype{M}{>{\centering\arraybackslash}m{4cm}}
\begin{document}
\begin{figure}
\centering
\begin{tabularx}{\linewidth}{lMX}
{\begin{tabularx}{.333\textwidth}{Xl}&Ip EphA2 Wb pPTEN\\\end{tabularx}}&\includegraphics[width=4cm]{gfx/blots/test.png} &-- \SI{110}{\kilo\dalton} \\
&{\begin{tabularx}{4cm}{yyyy}0 & 5 & 15 & 30\end{tabularx}} & min \\
\end{tabularx}
\caption{Some Blots}
\end{figure}
\end{document}
Beispiel 3:
\documentclass[11pt]{scrartcl}
\usepackage{blindtext}
\usepackage{tabularx}
\usepackage{array}
\usepackage{multirow}
\usepackage{graphicx}
\usepackage{showframe}
\newcolumntype{y}{@{}>{\centering\arraybackslash}X@{}}
\newcolumntype{M}{@{}>{\centering\arraybackslash}m{4cm}@{}}
\begin{document}
\blindtext
\begin{figure}
\centering
\begin{tabular}{l@{ }M@{ }l}
Ip EphA2 Wb PTEN &\includegraphics[width=4cm]{gfx/blots/test.png} & -- \SI{100}{\kilo\dalton} \\
&{\begin{tabularx}{4cm}{yyyy}
0 & 5 & 15 & 30
\end{tabularx}} & min \\
\end{tabular}
\caption{Some Blots}
\label{fig:ppf}
\end{figure}
\end{document}
Beispiel 4
\documentclass{article}
\usepackage{graphicx}
\usepackage{array}
\usepackage{tabularx}
\newcolumntype{C}{%
>{\llap\bgroup}c<{\egroup\hskip 1em}%
@{}>{$\vcenter\bgroup\hbox\bgroup}c<{\egroup\egroup$}@{}
>{\hskip 1em\hbox to 0pt\bgroup}c<{\egroup}%
}%
\newcommand{\myblotsize}{3cm} %devine blotsize
\newcommand{\myblot}[1]{\includegraphics[width=\myblotsize]{#1}}
\newcolumntype{y}{%
@{}>{$\vcenter\bgroup\centering\bgroup}X<{\egroup\egroup$}@{}
}%
\newcommand{\stimulation}[4]{%
&\begingroup
\begin{tabularx}{\myblotsize}{yyyy}
#1 & #2 & #3 & #4\\
\end{tabularx}\endgroup
&min
} %
\begin{document}
\begin{figure}
\small
\centering
\renewcommand\arraystretch{2}
\begin{tabular}{C}
IP EphA2 WB EphA2 &\myblot{gfx/test} &-- 130 kDa \\
IP EphA2 WB pPTEN &\myblot{gfx/test} &-- 54 kDa \\
IP EphA2 WB PTEN &\myblot{gfx/test} &-- 54 kDA \\
IP EphA2 WB Cbl &\myblot{gfx/test} &-- 118 kDa \\
\stimulation{--}{5}{15}{30}\\
\end{tabular}
\caption{A caption}
\label{fig:figure1}
\end{figure}
\end{document}
Endgültiger Code:
\documentclass{article}
\newcommand{\myblotsize}{4cm} %Change the width of all blots in the document here
\newcommand{\myblottextsize}{\scriptsize} %tiny, scriptsize, footnotesize, small, normalsize
\newlength\widestLeftEntryLength %needed for left alignment of left describtion
\usepackage{graphicx}
\usepackage{array}
\usepackage{booktabs} %better management of spaze between rows
\usepackage{tabularx} %already loaded previously
\newcolumntype{C}{% blotcolumns centered on blot
% >{\llap\bgroup}c<{\hskip 1em\egroup} %right alignment of left describtion ATTENTION to \hskip 3.2 in last column
@{}>{\llap\bgroup\hbox to \widestLeftEntryLength\bgroup}c<{\hss\egroup\egroup}@{}%left alignment of left describtion
@{}>{$\vcenter\bgroup\hbox\bgroup}c<{\egroup\egroup$}@{}
@{}>{\hskip 3.2pt\hbox to 0pt\bgroup}c<{\egroup}@{}%
}%
\newcommand{\myblot}[3]{#1&\includegraphics[width=\myblotsize,]{#2}&-- \SI{#3}{\kilo\dalton}\\}
\newcolumntype{y}{%
@{}>{$\vcenter\bgroup\centering\bgroup}X<{\egroup\egroup$}@{}
}%
\newcommand{\stimulation}[4]{%
&\begingroup
\begin{tabularx}{\myblotsize}{yyyy}
#1 & #2 & #3 & #4\\
\end{tabularx}\endgroup
&min
} %
\begin{document}
\centering\rule{\myblotsize}{3pt} %test the horizontal alignment of the following table
\begin{figure}
\myblottextsize
\centering
\settowidth\widestLeftEntryLength{IP EphA2 WB pPTEN\hskip 3pt} %
\begin{tabular}{C}
\myblot{IP EphA2 WB EphA2}{gfx/test}{130}\addlinespace
\myblot{IP EphA2 WB pPTEN}{gfx/test}{54}\addlinespace
\myblot{IP EphA2 WB PTEN}{gfx/test}{54}\addlinespace
\myblot{IP EphA2 WB Cbl}{gfx/test}{118}
\stimulation{--}{5}{15}{30}
\end{tabular}
\caption{A caption}
\label{fig:figure1}
\end{figure}
\end{document}
Antwort1
Der Trick besteht darin, Ihre Grafiken in eine \vcenter
Box zu packen. Der Rest ist bloße Bürokratie: \vcenter
erfordert den Mathematikmodus und \hbox
verhindert, dass das Bild die gesamte Linienbreite einnimmt.
\documentclass{article}
\usepackage{graphics}
\newcommand\myincludegraphics[1]{%
\ensuremath{\vcenter{\hbox{\includegraphics{#1}}}}%
}
\begin{document}
\begin{figure}
\centering
\renewcommand\arraystretch{3}
\begin{tabular}{rcl}
description&\myincludegraphics{gfx/test}&description\\
description&\myincludegraphics{gfx/test}&description\\
description&\myincludegraphics{gfx/test}&description\\
description&\myincludegraphics{gfx/test}&description\\
&0\hfill 5\hfill\hfill 15\hfill\hfill\hfill 30&min
\end{tabular}
\caption{A caption}
\label{fig:figure}
\end{figure}
\end{document}
BEARBEITEN: Diese Version befasst sich mit Beschreibungen unterschiedlicher Länge und hält die Bilder in jedem Fall horizontal zentriert.
Die Hauptidee besteht darin, die linken Beschreibungen in ein \llap
(sodass es nach links herausragt, aber vorgibt, 0pt
breit zu sein) und die rechten Beschreibungen in ein \hbox to 0pt
(diese geben vor, breit zu sein 0pt
, ragen aber nach rechts heraus – \rlap
funktioniert in diesem Fall übrigens nicht gut) einzufügen.
Der Rest dient der Benutzerfreundlichkeit. Mit dem Paket array
können Sie Ihre Einträge automatisch, aber beliebig codieren, indem Sie <
und verwenden >
. Darüber hinaus können Sie neue Spaltentypen definieren. Ich habe also die ganze \llap
und- \hbox
Magie in den Spaltentyp gepackt C
und auch die vertikale Positionierungsmagie dort integriert. Dies sollte die Benutzerfreundlichkeit erhöhen.
Da der Typ der mittleren Spalte neu definiert wurde, funktionierte die alte Zeitleiste nicht mehr, also \multicolumn
setzte ich den Typ der mittleren Spalte für die letzte Zeile auf ein einfaches zurück c
. Dabei habe ich alles in ein Makro gepackt, um mir weiteres Tippen zu sparen. (Vielleicht sollten wir es noch etwas schicker machen, indem wir LaTeX die Zahlen automatisch auf der Zeitleiste positionieren lassen? :-))))
\documentclass{article}
\usepackage{graphicx}
\usepackage{array}
\newcolumntype{C}{%
>{\llap\bgroup}c<{\egroup}%
>{$\vcenter\bgroup\hbox\bgroup}c<{\egroup\egroup$}
>{\hbox to 0pt\bgroup}c<{\egroup}%
}%
\newcommand\timeline[1]{&\multicolumn{1}{c}{#1}&min}
\begin{document}
\begin{figure}
\centering
\renewcommand\arraystretch{3}
\begin{tabular}{C}
description long&\includegraphics{gfx/test}&desc\\
description&\includegraphics{gfx/test}&description very very extremely long\\
description&\includegraphics{gfx/test}&desc\\
description&\includegraphics{gfx/test}&descript\\
\timeline{0\hfill 5\hfill\hfill 15\hfill\hfill\hfill 30}
\end{tabular}
\caption{A caption}
\label{fig:figure1}
\end{figure}
\begin{figure}
\centering
\renewcommand\arraystretch{3}
\begin{tabular}{C}
description long&\includegraphics{gfx/test}&desc\\
description very very extremely long&\includegraphics{gfx/test}&desc\\
description&\includegraphics{gfx/test}&desc\\
description&\includegraphics{gfx/test}&descript\\
\timeline{%
\makebox[0pt][c]{0}\hfill
\makebox[0pt][c]{5}\hfill\hfill
\makebox[0pt][c]{15}\hfill\hfill\hfill
\makebox[0pt][c]{30}}
\end{tabular}
\caption{A caption}
\label{fig:figure2}
\end{figure}
\end{document}
UPDATE 2: Automatische Platzierung der Häkchen (zum Spaß) und fester Spaltenabstand (wirklich):
\documentclass{article}
\usepackage{graphicx}
\usepackage{array}
\newcolumntype{C}{%
>{\llap\bgroup}c<{\egroup\hskip 1em}%
@{}>{$\vcenter\bgroup\hbox\bgroup}c<{\egroup\egroup$}@{}
>{\hskip 1em\hbox to 0pt\bgroup}c<{\egroup}%
}%
\usepackage{etoolbox}
\newcommand\timeline[1]{%
&\multicolumn{1}{@{}c@{}}\begingroup
\global\let\do\firstT
\docsvlist{#1}%
\endgroup&min%
}
\def\firstT#1{\makebox[0pt][c]{#1}\xdef\previousT{#1}\global\let\do\otherTs}
\def\otherTs#1{%
\count0=#1\relax \advance\count0-\previousT\relax
\loop\ifnum\count0>0 \typeout{\the\count0}\advance\count0-1 \hfill\repeat
\makebox[0pt][c]{#1}\xdef\previousT{#1}%
}
\begin{document}
\begin{figure}
\centering
\renewcommand\arraystretch{3}
\begin{tabular}{C}
description long&\includegraphics{gfx/test}&desc\\
description&\includegraphics{gfx/test}&description very very extremely long\\
description&\includegraphics{gfx/test}&desc\\
description&\includegraphics{gfx/test}&descript\\
\timeline{0,5,15,30}\\
\timeline{0,10,20,30}\\
\timeline{0,20,25,30}\\
\end{tabular}
\caption{A caption}
\label{fig:figure1}
\end{figure}
\begin{figure}
\centering
\renewcommand\arraystretch{3}
\begin{tabular}{C}
description long&\includegraphics{gfx/test}&desc\\
description very very extremely long&\includegraphics{gfx/test}&description\\
description&\includegraphics{gfx/test}&desc\\
description&\includegraphics{gfx/test}&descript\\
\timeline{0,2,4,6,8,10,20,30}
\end{tabular}
\caption{A caption}
\label{fig:figure1}
\end{figure}
\end{document}
UPDATE: linksbündige linke Beschreibung
Ich weiß nicht, wie man das automatisch machen kann, weil man die Breite der breitesten linken Beschreibung im Voraus kennen muss. Eine halbautomatische Lösung besteht darin, diese Länge im Voraus festzulegen, direkt vor der tabular
Umgebung --- die Spaltendefinition fügt dann die linke Beschreibung in eine Spalte \hbox
mit der angegebenen Breite ein.
\documentclass{article}
\usepackage{graphicx}
\usepackage{array}
\newlength\widestLeftEntryLength
\newcolumntype{C}{%
>{\llap\bgroup\hbox to \widestLeftEntryLength\bgroup}c<{\hss\egroup\egroup\hskip 1em}%
@{}>{$\vcenter\bgroup\hbox\bgroup}c<{\egroup\egroup$}@{}
>{\hskip 1em\hbox to 0pt\bgroup}c<{\egroup}%
}%
\begin{document}
\begin{figure}
\centering
\renewcommand\arraystretch{3}
\settowidth\widestLeftEntryLength{description very very extremely long}
\begin{tabular}{C}
description long&\includegraphics{gfx/test}&desc\\
description very very extremely long&\includegraphics{gfx/test}&description\\
description&\includegraphics{gfx/test}&desc\\
description&\includegraphics{gfx/test}&descript\\
\end{tabular}
\caption{A caption}
\label{fig:figure2}
\end{figure}
\end{document}
Antwort2
Zum Vergleich: So kann man eine ähnliche Tabelle in ConTeXt setzen. Horizontal ist die erste Spalte rechtsbündig, die zweite mittig und die dritte linksbündig; vertikal sind alle Spalten zentriert ( lohi
Schlüsselwort).
\useMPlibrary[dum] % For dummy figures
\startsetups table:align
\setupTABLE[frame=off]
\setupTABLE[column][1][align={flushright,lohi}]
\setupTABLE[column][2][align={middle,lohi}]
\setupTABLE[column][3][align={flushleft,lohi}]
\stopsetups
\starttext
\startTABLE[setups={table:align}]
\NC long desc \NC \externalfigure[dummy][width=3cm, height=3\lineheight] \NC desc \NC \NR
\NC desc \NC \externalfigure[dummy][width=3cm, height=3\lineheight] \NC desc \NC \NR
\NC desc \NC \externalfigure[dummy][width=3cm, height=3\lineheight] \NC desc \NC \NR
\NC desc \NC \externalfigure[dummy][width=3cm, height=3\lineheight] \NC long desc \NC \NR
\stopTABLE
\stoptext
was gibt
Der Standardabstand zwischen den Zellen kann mit der offset
Taste geändert werden.
BEARBEITEN: Wenn Sie möchten, dass der Text in der ersten Spalte linksbündig angezeigt wird, ändern Sie einfach die erste Zeile wie startsetups
folgt:
\startsetups table:align
\setupTABLE[frame=off]
\setupTABLE[column][5][align={flushleft,lohi}]
\setupTABLE[column][6][align={middle,lohi}]
\setupTABLE[column][7][align={flushleft,lohi}]
\stopsetups
was gibt
Wenn Sie lange Zeilen haben, können Sie festlegen, dass die mittlere Spalte nur so viel Platz wie nötig einnimmt ( width=fit
) und die erste und zweite Spalte den verbleibenden Platz gleichmäßig unter sich aufteilen ( width=broad
). Beispiel:
\startsetups table:align
\setupTABLE[frame=off]
\setupTABLE[column][9][align={flushright,lohi}, width=broad]
\setupTABLE[column][10][align={middle,lohi}, width=fit,]
\setupTABLE[column][11][align={flushleft,lohi}, width=broad]
\stopsetups
(Ich habe den Seitenrahmen mit angezeigt, \showframe
damit klar ist, dass die Tabelle optisch auf der Seite zentriert ist)
Beachten Sie, dass ConTeXt standardmäßig versucht, beide Zeilen in der ersten Zelle gleich lang zu machen. Wenn Ihnen das nicht gefällt, können Sie broad
dem Schlüsselsatz Schlüsselwörter hinzufügen align
, und ConTeXt macht jede Zeile so lang wie möglich. Zum Beispiel:
\startsetups table:align
\setupTABLE[frame=off]
\setupTABLE[column][13][align={flushright,broad,lohi}, width=broad]
\setupTABLE[column][14][align={middle,lohi}, width=fit,]
\setupTABLE[column][15][align={flushleft,lohi}, width=broad]
\stopsetups
gibt