我经常使用 minipage 环境将两个浮动内容并排放置:可以是两段文本(通常是书籍或新闻文章的摘录)、两张图片(一张地图、一张照片或一张图表)或各一张(例如,一张地图和一段新闻文章的摘录)。
我遇到的一个反复出现的问题是设置这两个小页面的高度,以便整体\textwidth
使用和高度尽可能接近。这是一个繁琐的反复试验过程,我希望可以实现自动化。
我已经在这个网站上看到了几种解决该问题的解决方案,这些解决方案针对的是那些你事先知道尺寸和比例的图形(通常是图片),但针对的是文本。
这是 MWE,其中有两个例子,我认为它们的高度足够相似。
\documentclass {article}
\usepackage{mwe}
\begin{document}
\begin{figure}
\begin{minipage}[t]{.58\linewidth}
\lipsum[1][1-8]
\caption{Some caption}
\end{minipage}\hfill
\begin{minipage}[t]{.38\linewidth}
\lipsum[1][1-5]
\caption{Some other caption}
\end{minipage}\hfill
\end{figure}
\begin{figure}
\begin{minipage}[t]{.53\linewidth}
\strut\vspace*{-\baselineskip}\newline\includegraphics[width=\linewidth]{example-image-a}
\caption{Third caption}
\end{minipage}\hfill
\begin{minipage}[t]{.43\linewidth}
\lipsum[1][1-8]
\caption{Fourth caption}
\end{minipage}
\end{figure}
\end{document}
答案1
如果您只想重新缩放图像,没问题。只需测量图像的高度并求解a*\ht0=b*\ht1
和a*\wd0+b*\wd1=\textwidth
。
\documentclass {article}
\usepackage{adjustbox}
\usepackage{graphicx}
\usepackage{pgfmath}
\begin{document}
\begin{figure}
\sbox0{\includegraphics{example-image-16x10}}%
\sbox1{\includegraphics{example-image-10x16}}%
\pgfmathsetmacro{\sclB}{\textwidth/((\ht1/\ht0)*\wd0+\wd1)}%
\pgfmathsetmacro{\sclA}{\textwidth/(\wd0+(\ht0/\ht1)*\wd1)}%
\begin{minipage}[t]{\sclA\wd0}
\scalebox{\sclA}{\usebox0}
\caption{Some caption}
\end{minipage}%
\begin{minipage}[t]{\sclB\wd1}
\scalebox{\sclB}{\usebox1}
\caption{Some other caption}
\end{minipage}
\end{figure}
\end{document}
文本更难处理。我们假设文本的总面积保持(大约)恒定。因此高度和宽度成反比。然而,这个过程非常非线性,需要一个循环才能收敛。
\documentclass {article}
\usepackage{pgfmath}
\usepackage{lipsum}
\usepackage{showframe}
\begin{document}
\begin{figure}
\setlength{\dimen0}{\dimexpr 0.5\textwidth-0.5\columnsep}%
\dimen1=\dimen0
\loop
\sbox0{\begin{minipage}[b]{\dimen0}
\lipsum[1]\strut
\caption{Some caption}
\end{minipage}}%
\sbox1{\begin{minipage}[b]{\dimen1}
\lipsum[2]\strut
\caption{Some other caption}
\end{minipage}}%
\count1=\numexpr \ht0/\baselineskip\relax
\count2=\numexpr \ht1/\baselineskip\relax
\ifnum\count1=\count2 \else
\pgfmathsetmacro{\areaA}{(\ht0/\baselineskip)*\wd0}%
\pgfmathsetmacro{\areaB}{(\ht1/\baselineskip)*\wd1}%
\pgfmathparse{(\textwidth-\columnsep)/(1+(\areaA/\areaB))}%
\dimen1=\pgfmathresult pt\relax
\pgfmathparse{(\textwidth-\columnsep)/(1+(\areaB/\areaA))}%
\dimen0=\pgfmathresult pt\relax
\addtocounter{figure}{-2}%
\repeat
\usebox0\hfill\usebox1
\end{figure}
\end{document}
第三种情况是尝试将图像缩放到与文本相同的高度。必须求解ra=A/b
其中a
和b
是图像和文本的宽度(a+b=\mywidth
),r
是图像的纵横比(高度/宽度),A是文本的面积。这意味着求解二次方程。如果存在解,我们总是想要较小的那个。
\documentclass {article}
\usepackage{adjustbox}
\usepackage{graphicx}
\usepackage{pgfmath}
\usepackage{lipsum}
\usepackage{showframe}
\newif\ifnosolution
\newlength{\mywidth}
\begin{document}
\begin{figure}
\sbox0{\includegraphics{example-image-10x16}}%
\pgfmathsetmacro{\aspect}{\ht0/\wd0}%
\setlength{\mywidth}{\dimexpr \textwidth-\columnsep}%
\dimen0=0.5\mywidth
\dimen1=\dimen0
\nosolutionfalse
\loop
\sbox1{\begin{minipage}[b]{\dimen1}
\lipsum[2]\strut
\end{minipage}}%
\dimen3=\aspect\dimen0
\count1=\numexpr \dimen3/\baselineskip\relax
\count2=\numexpr \ht1/\baselineskip\relax
\ifnum\count1=\count2
\nosolutiontrue
\else
\pgfmathsetmacro{\area}{(\ht1/\mywidth)*(\wd1/\mywidth)}%
\pgfmathsetmacro{\square}{1-4*\area/\aspect}%
\ifdim\square pt<0pt\relax
\nosolutiontrue
\else\pgfmathparse{(1-sqrt(\square))*0.5\mywidth}%
\setlength{\dimen0}{\pgfmathresult pt}%
\setlength{\dimen1}{\dimexpr \mywidth-\dimen0}%
\fi
\fi
\ifnosolution\else\repeat
\begin{minipage}[t]{\dimen1}% align bottom of box1 and box0
\usebox1
\caption{Some caption}
\end{minipage}\hfill
\begin{minipage}[t]{\dimen0}
\resizebox{\linewidth}{!}{\usebox0}
\caption{Some other caption}
\end{minipage}
\end{figure}
\end{document}