调整 minipage 的宽度以避免换行

调整 minipage 的宽度以避免换行

对于foobaz,返回合理/不合理的值。当环绕和widthof的宽度设置为这些数字时,两者都没有所需的宽度,即其中包含的最长行的宽度。换句话说,我希望设置的宽度,以便不会换行。minipagefoobazminipage

\documentclass[12pt]{report}
\usepackage{calc}
\usepackage{mwe}
\usepackage{xparse}
\usepackage{zebra-goodies}

\newsavebox\foo
\sbox{\foo}{%
  % 3456789
  abcdefgh
  \\abc%
}

\NewDocumentCommand{\baz}{}
{%
  % 3456789
  abcdefgh\\% "longest line"
  abc
}

\begin{document}

\noindent \texttt{foo}

% https://tex.stackexchange.com/a/37294/112708
\begin{tabular}{ll}
w & \widthof\foo \\
h & \heightof\foo \\
d & \depthof\foo
\end{tabular}

\frame{\begin{minipage}{\widthof{\foo}}
  \usebox{\foo}
\end{minipage}}

{\tiny\todo{adjust mp's width to fit exactly longest line}}

\noindent \texttt{baz}

\begin{tabular}{ll}
w & \widthof\baz \\
h & \heightof\baz \\
d & \depthof\baz
\end{tabular}

\frame{\begin{minipage}{\widthof{\baz}}
  \baz
\end{minipage}}

{\tiny\todo{adjust mp's width to fit exactly longest line}}

\end{document} 

镜头-1

答案1

作为第一步调试,您应该查看打印的内容\usebox{\foo},即

在此处输入图片描述

这是为什么呢?因为\\本质上,\hfill\break在构建水平框时,这不会产生任何效果。

如果要将长度设置为列表中最宽的单词,则可以使用tabular

\newcommand{\settowidest}[2]{% items must be separated by \\
  \settowidth{#1}{\begin{tabular}{@{}l@{}}#2\end{tabular}}%
}

例子:

\documentclass[12pt]{report}

\newcommand{\settowidest}[2]{% items must be separated by \\
  \settowidth{#1}{\begin{tabular}{@{}l@{}}#2\end{tabular}}%
}

\newcommand{\foo}{%
    % 3456789
    abcdefgh\\% "longest line"
    abc%
}

\newlength{\foolen}
\AtBeginDocument{%
  \settowidest{\foolen}{\foo}%
}

\begin{document}

\fbox{\begin{minipage}{\foolen}\foo\end{minipage}}

\end{document} 

在此处输入图片描述

另一方面,您可以直接使用 来避免所有测量,tabular就像 的定义一样\settowidest。或者您可以使用varwidth(在网站上查找)。

相关内容