
Я хочу сделать фигуру, составленную из двух изображений разного размера. Я хочу разместить их рядом так, чтобы они имели одинаковую высоту и чтобы они в целом занимали, скажем, 90% ширины линии.
Легко сделать так, чтобы они имели одинаковую фиксированную высоту (скажем, в см), но как сделать так, чтобы эта общая высота автоматически подстраивалась под желаемую общую ширину? Ручной метод проб и ошибок отнимает много времени, является приблизительным и ненадежным.
Решение с использованием или без использования subfigure
другого пакета LaTeX приемлемо.
решение1
Вы можете включить их в одну и ту же (более или менее произвольную) высоту, а затем масштабировать их вместе до желаемой ширины.
\documentclass{article}
\usepackage{graphicx}% images from mwe package
\begin{document}
\noindent X\dotfill X
\begin{center}
\resizebox{.9\textwidth}{!}{%
\includegraphics[height=3cm]{example-image-a}%
\quad
\includegraphics[height=3cm]{example-image-16x9}%
}
\end{center}
\end{document}
решение2
Вы можете использовать subcaption
пакет и выполнить вычисления, как предложил Дэвид.
\documentclass{article}
\usepackage{graphicx}% images from mwe package
\usepackage{subcaption}
\newlength{\twosubht}
\newsavebox{\twosubbox}
\begin{document}
\noindent\hrulefill The text width\hrulefill
\begin{center}
\makebox[.9\textwidth]{\hrulefill 90\% of text width\hrulefill}
\end{center}
\begin{figure}[htp]
% preliminary
\sbox\twosubbox{%
\resizebox{\dimexpr.9\textwidth-1em}{!}{%
\includegraphics[height=3cm]{example-image-a}%
\includegraphics[height=3cm]{example-image-16x9}%
}%
}
\setlength{\twosubht}{\ht\twosubbox}
% typeset
\centering
\subcaptionbox{First\label{f}}{%
\includegraphics[height=\twosubht]{example-image-a}%
}\quad
\subcaptionbox{Second\label{s}}{%
\includegraphics[height=\twosubht]{example-image-16x9}%
}
\caption{The caption}
\end{figure}
\end{document}
решение3
\documentclass[a4paper,12pt]{article}
\usepackage{graphicx}
\usepackage{adjustbox}
\usepackage{fp}
\usepackage{subcaption}
\newlength{\totalimgwidth}
\newlength{\imgspacingwidth}
\newlength{\firstimgorigwidth}
\newlength{\firstimgorigheight}
\newlength{\secondimgorigwidth}
\newlength{\secondimgorigheight}
\newlength{\firstimgwidth}
\newlength{\secondimgwidth}
\newcommand{\setsubfloatwidths}[2]{%set the total width you want the images take and the spacing between them
\setlength{\totalimgwidth}{#1}%
\setlength{\imgspacingwidth}{#2}%
\addtolength{\totalimgwidth}{-\imgspacingwidth}%
}
\begin{document}
\setsubfloatwidths{0.9\textwidth}{1ex} %set the total width of figure and spacing inbetween
\begin{figure}
\adjincludegraphics[gstore width=\firstimgorigwidth,gstore height=\firstimgorigheight,gobble]{img1}%
\adjincludegraphics[gstore width=\secondimgorigwidth,gstore height=\secondimgorigheight,gobble]{img2}%
\makeatletter%
\FPdiv\firstaspectratio{\strip@pt\firstimgorigheight}{\strip@pt\firstimgorigwidth}%
\FPdiv\secondaspectratio{\strip@pt\secondimgorigheight}{\strip@pt\secondimgorigwidth}%
\FPeval\firstfactor{\secondaspectratio / (\firstaspectratio + \secondaspectratio)}%
\FPeval\secondfactor{\firstaspectratio / (\firstaspectratio + \secondaspectratio)}%
\makeatother%
\begin{subfigure}{\firstfactor\totalimgwidth}
\includegraphics[width=\textwidth]{img1}
\end{subfigure}
\hspace*{\imgspacingwidth}
\begin{subfigure}{\secondfactor\totalimgwidth}
\includegraphics[width=\textwidth]{img2}
\end{subfigure}
\end{figure}
\end{document}
Вы задаете общую ширину, которую должны иметь изображения, и расстояние между ними с помощью \setsubfloatswidths
, затем вызываете \adjincludegraphics
внутреннюю figure
среду с двумя файлами изображений в качестве аргументов и, наконец, используете подфигуры, как обычно.
\firstfactor
содержит коэффициент, который масштабирует первое изображение и \secondfactor
делает то же самое для второго.
Более простым решением было бы задать высоту изображения, но \subcaption
среда subfigure
принимает в качестве аргументаширинасубфлота.