
我知道我們可以透過以下方式獲得幾個盒子的最大寬度或高度:
\setbox0=\vbox{\hbox{a}\hbox{b}\hbox{c}}
The maximum width is \the\wd0
\setbox0=\hbox{\hbox{a}\hbox{b}\hbox{c}}
The maximum height is \the\ht0
但如何獲得最小寬度或高度呢?
答案1
這個想法很簡單:設置盒子並測量它們。
\documentclass{article}
\makeatletter
\newcommand{\settominwidth}[1]{\saltyegg@settomin{\wd}{#1}}
\newcommand{\settominheight}[1]{\saltyegg@settomin{\ht}{#1}}
\newcommand{\settomindepth}[1]{\saltyegg@settomin{\dp}{#1}}
\newcommand{\saltyegg@settomin}[3]{%
#2\maxdimen
\@for\next:=#3\do{%
\sbox\z@{\next}%
\ifdim#1\z@<#2%
#2=#1\z@
\fi}%
}
\makeatother
\newlength{\saltyeggtest}
\begin{document}
\settominwidth{\saltyeggtest}{a,b,c,f}
\the\saltyeggtest
\settominheight{\saltyeggtest}{a,b,c,f}
\the\saltyeggtest
\settomindepth{\saltyeggtest}{a,b,c,f}
\the\saltyeggtest
\end{document}
答案2
這裡至少有一種直接的方法,無需抽象化為巨集:
\newdimen\minwd
% what needs to happen in order to find the minimum width inner hbox in:
% \hbox{\hbox{first}\hbox{second}\hbox{third}}
\leavevmode % otherwise hboxes stack
\setbox0\hbox{first}%
\minwd=\wd0
\box0
\setbox0\hbox{second}%
\ifdim\wd0<\minwd \minwd=\wd0 \fi
\box0
\setbox0\hbox{third}%
\ifdim\wd0<\minwd \minwd=\wd0 \fi
\box0
minwd = \the\minwd
\bye
在另一個答案我為類似的事情製作了一個巨集。
答案3
如果您需要可擴展的解決方案,並且盒子已經存在(從而避免將一些材料放入盒子中的不可擴展步驟),請使用e-TeX
啟用了擴展的 tex 引擎:
% compile with etex (or pdftex, etc...) as this requires e-TeX extensions
%
\input xint.sty
\def\minimalwidthofboxes #1{%
\dimexpr\xintiMinof {\xintApply{\number\wd\firstofone}{#1}}sp\relax }
\long\def\firstofone #1{#1}% \long in case \firstofone already exists and was
% declared long
% why \firstofone? because \xintApply\macro{{item1}..{item2}} does
% \macro{item1}, hence here this would give \number\wd{\bA} which is illicit, we
% want \number\wd\bA without braces (besides, on the other hand, it doesn't
% matter if the list contains the single token \bA or the braced token {\bA})
%% EXAMPLES
\newbox\bA
\newbox\bB
\newbox\bC
\setbox\bA\hbox{Aah}
\setbox\bB\hbox{BB}
\setbox\bC\hbox{CCC}
\the\minimalwidthofboxes {\bA\bB\bC}\ % or equivalently {{\bA}{\bB}{\bC}}
is the minimal width among \the\wd\bA, \the\wd\bB, \the\wd\bC.
\newbox\bD \setbox\bD\hbox{bb}
\the\minimalwidthofboxes {{\bA}{\bB}{\bC}{\bD}}
is the minimal width among \the\wd\bA, \the\wd\bB, \the\wd\bC\ and \the\wd\bD.
\bye