LaTeX Beamer中等高并排minipages实现方案问询
LaTeX Beamer中实现等高并排minipages的方案与命令优化
需求背景
需要在LaTeX Beamer中实现仅用minipages实现并排布局(明确不使用columns或其他多列环境),现有自定义\SideBySide命令,但希望两个minipages始终保持等高,同时寻求命令的优化建议。
现有命令代码
\def \MinSideBySideGap {0.02} % 左右部分之间的最小间距比例 \newcommand{\SideBySide}[3][0.5] { % \ifthenelse{\isempty{#1}}% {\FPeval{\leftwidth}{0.5-\MinSideBySideGap/2}% \FPeval{\rightwidth}{\leftwidth}% }% 如果#1为空 {\FPeval{\leftwidth}{min(#1-\MinSideBySideGap/2,1.0)}% \FPeval{\rightwidth}{max(1.0-\leftwidth-\MinSideBySideGap,0.0)} }% 如果#1不为空 % % 左侧部分 \begin{minipage}{\leftwidth\textwidth} #2 \end{minipage}% \hfill% % 右侧部分 \begin{minipage}{\rightwidth\textwidth} #3 \end{minipage}% }
早期基于columns的版本
\newcommand{\SideBySide}[2] { \begin{columns}[T] % 对齐列顶部 \begin{column}{.48\textwidth} #1 \end{column}% \hfill% \begin{column}{.48\textwidth} #2 \end{column}% \end{columns} }
实现等高minipages的方法
方法1:使用adjustbox包(推荐)
利用adjustbox的height和valign选项,让两个minipage高度取两者的最大值,同时顶部对齐:
- 先导入依赖包:
\usepackage{calc} \usepackage{adjustbox} - 修改命令中的minipage部分:
% 左侧部分 \begin{adjustbox}{valign=t,height=\maxof{\heightof{#2}}{\heightof{#3}}} \begin{minipage}[t]{\leftwidth\textwidth} #2 \end{minipage} \end{adjustbox}% \hfill% % 右侧部分 \begin{adjustbox}{valign=t,height=\maxof{\heightof{#2}}{\heightof{#3}}} \begin{minipage}[t]{\rightwidth\textwidth} #3 \end{minipage} \end{adjustbox}%
方法2:底层TeX盒命令
用TeX原生命令测量内容高度,再将内容放入等高盒子,无需额外包:
% 临时存储左右内容,测量高度 \setbox0=\vbox{\begin{minipage}{\leftwidth\textwidth}#2\end{minipage}} \setbox1=\vbox{\begin{minipage}{\rightwidth\textwidth}#3\end{minipage}} % 计算最大高度 \edef\maxheight{\the\maxof{\ht0}{\ht1}} % 输出等高盒子 \vbox to \maxheight{\box0\vfill}% \hfill% \vbox to \maxheight{\box1\vfill}%
命令优化建议
替换
FPeval为calc包:FPeval依赖fp包,calc是LaTeX标准工具包,语法更简洁且效率更高,修改宽度计算逻辑:\usepackage{calc} \def\MinSideBySideGap{0.02\textwidth} % 直接用长度单位,避免比例换算 \newcommand{\SideBySide}[3][0.5\textwidth] { \def\leftwidth{#1 - \MinSideBySideGap/2} \def\rightwidth{\textwidth - \leftwidth - \MinSideBySideGap} % 边界校验:确保宽度不超出范围 \ifdim\leftwidth>\textwidth \def\leftwidth{\textwidth - \MinSideBySideGap} \def\rightwidth{0pt} \fi \ifdim\rightwidth<0pt \def\rightwidth{0pt} \def\leftwidth{\textwidth - \MinSideBySideGap} \fi % 后续等高minipage代码... }简化空参数判断:
用TeX原生\ifx判断可选参数是否为空,比ifthenelse更轻量:\newcommand{\SideBySide}[3][0.5] { \ifx\relax#1\relax % 可选参数为空时的宽度计算 \FPeval{\leftwidth}{0.5-\MinSideBySideGap/2} \FPeval{\rightwidth}{\leftwidth} \else % 可选参数不为空时的宽度计算 \FPeval{\leftwidth}{min(#1-\MinSideBySideGap/2,1.0)} \FPeval{\rightwidth}{max(1.0-\leftwidth-\MinSideBySideGap,0.0)} \fi % 后续代码... }增加对齐控制参数:
给命令添加可选参数控制minipage的对齐方式(顶部/底部/居中),提升命令灵活性。
内容的提问来源于stack exchange,提问作者TheWhitestOfFangs
相关产品推荐
相关产品推荐

