我如何才能自动强制两种并排的任意类型浮点数(包括文本)具有(大约)相同的高度?

我如何才能自动强制两种并排的任意类型浮点数(包括文本)具有(大约)相同的高度?

我经常使用 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*\ht1a*\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其中ab是图像和文本的宽度(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}

相关内容