
Прежде всего, это мой первый пост на tex.stackexchange.com. Я новичок в мире tex и мне нужна небольшая помощь.
Я пытаюсь выровнять текст относительно рисунка. Как это должно выглядеть в итоге:
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 |
| |
| |
| |
|_____________________________________________|
Описания справа и слева различаются по длине. Они также различаются по длине для разных изображений. Сами изображения будут иметь одинаковый размер. Однако рисунки должны оставаться в середине страницы, что означает, что подпись должна оказаться в горизонтальном центре под рисунками.
Рисунки в формате .png. Я использую pdfLatex.
Я пробовал использовать несколько подходов к этой проблеме, включая размещение png-файлов внутри eps с опорными точками psfrag для текста, однако таким образом я не увидел возможности центрировать фактическое изображение, поскольку с psfrag текст переменной длины будет размещен внутри изображения, а также выравнивание текста оползня по левому краю было невозможно. Смотрите пример 1.
Я пытался использовать пакет floatrow, чтобы разместить текст в качестве субтитров слева от рисунка. Это так и не сработало, и я даже не начинал размещать текст справа от рисунка.
Итак, я в конечном итоге поместил фигуры в таблицу, но у меня снова возникли проблемы с выравниванием картинок по центру. См. пример 2 для общей идеи таблицы. См. пример 3 для центрального выравнивания пятен.
Идея таблицы заключается в том, чтобы установить ширину первой строки на .33\textwidth, чтобы изображение всегда начиналось по центру страницы [ПРАВКА: логическая ошибка -> см. комментарий, я думаю, это должно быть .33\textwidth-.5{ширина рисунка во втором ряду таблицы}]. Во втором ряду находится рисунок, в третьем ряду — другое описание. Я не хочу, чтобы метка слева была сдвинута вправо, потому что описание рисунка всегда будет соответствовать этому формату: IP что-то WB что-то, поэтому IP должен быть выровнен по вертикали.
Пример 3 близок, но не идеален... и его очень неудобно настраивать, так что, может быть, есть более простой подход? Я думал о чем-то подобном, но это не работает должным образом?
Использованные фигуры можно найти в следующем виде:
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}
Пример 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}
Соответствующий test-psfrag.tex содержит следующий код:
\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}
Пример 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}
Пример 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}
Пример 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}
Окончательный код:
\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}
решение1
Хитрость в том, чтобы поместить графику в \vcenter
коробку. Остальное — просто бюрократия: \vcenter
требует математического режима и \hbox
не позволяет изображению занять всю ширину линии.
\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}
ПРАВКА: Эта версия работает с описаниями разной длины, сохраняя горизонтальное центрирование изображений в любом случае.
Основная идея состоит в том, чтобы поместить левые описания в a \llap
(так они будут выступать влево, притворяясь 0pt
широкими), а правые описания в a \hbox to 0pt
(они будут притворяться 0pt
широкими, но выступать вправо — кстати, \rlap
в данном случае это не очень хорошо работает).
Остальное — сделать вещи простыми в использовании. Пакет array
позволяет вам автоматически, но произвольный код вокруг ваших записей с помощью <
и >
. Кроме того, он позволяет вам определять новые типы столбцов. Поэтому я поместил всю магию \llap
и \hbox
в тип столбца C
и включил туда же магию вертикального позиционирования. Это должно сделать вещи простыми в использовании.
Поскольку тип среднего столбца был переопределен, старая временная шкала больше не работала, поэтому я обычно \multicolumn
сбрасывал тип среднего столбца для последней строки обратно на простой c
. Пока я этим занимался, я упаковал все это в макрос, чтобы сэкономить время на вводе. (Может быть, нам стоит сделать его максимально навороченным, заставив LaTeX автоматически позиционировать числа на временной шкале? :-))))
\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}
ОБНОВЛЕНИЕ 2: Автоматическая расстановка галочек (для развлечения) и фиксированный интервал между столбцами (на самом деле):
\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}
ОБНОВЛЕНИЕ: выровненное по левому краю левое описание
Я не знаю, как сделать это автоматически, потому что нужно знать ширину самого широкого левого описания заранее. Полуавтоматическое решение — установить эту длину заранее, прямо перед окружением tabular
— затем определение столбца помещает левое описание в \hbox
заданной ширины.
\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}
решение2
Для сравнения, вот как можно набрать похожую таблицу в ConTeXt. По горизонтали первый столбец выровнен по правому краю, второй — по центру, а третий — по левому; по вертикали все столбцы выровнены по центру ( lohi
ключевое слово).
\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
который дает
Расстояние между ячейками по умолчанию можно изменить с помощью offset
клавиши.
РЕДАКТИРОВАТЬ: Если вы хотите, чтобы текст в первом столбце остался выровненным, просто измените первую строку следующим startsetups
образом:
\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
который дает
Если у вас длинные строки, то вы можете указать, что средний столбец занимает ровно столько места, сколько необходимо ( width=fit
), а первый и второй столбцы делят оставшееся пространство поровну между собой ( width=broad
). Например:
\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
дает (я показал рамку страницы, используя , \showframe
чтобы было ясно, что таблица визуально центрирована на странице)
Обратите внимание, что по умолчанию ConTeXt пытается сделать обе строки в первой ячейке одинаковой длины. Если вам это не нравится, вы можете добавить broad
ключевое слово в набор align
ключей, и ConTeXt сделает каждую строку максимально длинной. Например,
\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
дает