对于foo
和baz
,返回合理/不合理的值。当环绕和widthof
的宽度设置为这些数字时,两者都没有所需的宽度,即其中包含的最长行的宽度。换句话说,我希望设置的宽度,以便不会换行。minipage
foo
baz
minipage
\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
作为第一步调试,您应该查看打印的内容\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
(在网站上查找)。