我正在寻找一种将 minipage 和 varwidth 环境并排结合的方法,以便 minipage 的宽度自动适应 varwidth 的宽度,以填充整行。
\begin{minipage}{\linewidth-\varwidth}
Content of minipage.
\end{minipage}\hfill%
\begin{varwidth}{.5\linewidth}
Content of varwidth.
\end{varwidth}
可能需要两步编译,但感谢您的任何建议。我不知道如何获取 varwidth 的宽度。
答案1
第一种可能性
\documentclass{article}
\usepackage{varwidth}
\usepackage{lipsum}
\ExplSyntaxOn
\NewDocumentEnvironment{doubleminipage}{+b}
{
\mbfore_doubleminipage:n { #1 }
}{}
\seq_new:N \l__mbfore_doubleminipage_parts_seq
\cs_new_protected:Nn \mbfore_doubleminipage:n
{
\seq_set_split:Nnn \l__mbfore_doubleminipage_parts_seq { \BREAK } { #1 }
\hbox_set:Nn \l_tmpa_box
{
\begin{varwidth}{0.5\linewidth}
\seq_item:Nn \l__mbfore_doubleminipage_parts_seq { 2 }
\end{varwidth}
}
\noindent
\begin{minipage}{\dim_eval:n { \linewidth - \box_wd:N \l_tmpa_box - 1em }}
\seq_item:Nn \l__mbfore_doubleminipage_parts_seq { 1 }
\end{minipage}
\hfill
\box_use:N \l_tmpa_box
}
\ExplSyntaxOff
\begin{document}
\begin{doubleminipage}
\lipsum[1][1-4]
\BREAK
Some contents \\
on the right
\end{doubleminipage}
\end{document}
第二种可能性
\documentclass{article}
\usepackage{varwidth}
\usepackage{lipsum}
\ExplSyntaxOn
\NewDocumentEnvironment{doubleminipage}{m}
{
\__mbfore_doubleminipage:n { #1 }
\noindent
\begin{minipage}{\dim_eval:n { \linewidth - \box_wd:N \l_tmpa_box - 1em }}
}
{
\end{minipage}\hfill\box_use:N \l_tmpa_box
}
\cs_new_protected:Nn \__mbfore_doubleminipage:n
{
\hbox_set:Nn \l_tmpa_box
{
\begin{varwidth}{0.5\linewidth}
#1
\end{varwidth}
}
}
\ExplSyntaxOff
\begin{document}
\begin{doubleminipage}{
Some contents \\
on the right
}
\lipsum[1][1-4]
\end{doubleminipage}
\end{document}
两者的输出
笔记
我使用了 1em 的间距来分隔两个盒子。
答案2
该\MeasureVarwidth[<maximum width of varwidth>]{<text>}
命令将测量 a 的自然宽度text
并保存内容以供日后使用。
如果测量的内容text
大于可选<maximum width of varwidth>
(默认值= 0.5\linewidth
),则该部分的宽度varwidth
将设置为该值。
然后将设置宽度minipage
来填充整行。
\fbox
为了便于直观显示,小页面被包含在内。
\documentclass{article}
\usepackage{showframe} % show the margins
\usepackage{calc}% needed
\usepackage{varwidth}
\newsavebox{\ToVarwidth}
\newlength{\WidthofVarwidth}
\newlength{\miniwidth}
% save box and measure its width
\newcommand{\MeasureVarwidth}[2][0.5\linewidth]{% #1 optional max width of varwidth, #2 varwidth text
\savebox{\ToVarwidth}{#2}%
\settowidth{\WidthofVarwidth}{\usebox{\ToVarwidth}}%
\setlength{\miniwidth}{\linewidth-\WidthofVarwidth}%
\ifdim\WidthofVarwidth>#1%
\savebox{\ToVarwidth}{\parbox{#1}{#2}}%
\setlength{\miniwidth}{\linewidth-#1}%
\fi
}
\begin{document}
\setlength{\fboxsep}{0pt}% only for \fbox
\MeasureVarwidth{Some text}
\noindent\fbox{%% \fbox only to visualize
\begin{minipage}{\miniwidth}
Content of minipage.
\end{minipage}%
}\hfill
\begin{varwidth}{\linewidth}
\usebox{\ToVarwidth}
\end{varwidth}
\bigskip
\MeasureVarwidth{Some text Some text Some text}
\noindent\fbox{%
\begin{minipage}{\miniwidth}
Content of minipage.
\end{minipage}%
}\hfill
\begin{varwidth}{\linewidth}
\usebox{\ToVarwidth}
\end{varwidth}
\bigskip
\MeasureVarwidth{Some text Some text Some text Some text Some text Some text Some text }
\noindent\fbox{%
\begin{minipage}{\miniwidth}
Content of minipage.
\end{minipage}%
}\hfill
\begin{varwidth}{\linewidth}
\usebox{\ToVarwidth}
\end{varwidth}
\bigskip
Changing the maximum width of \verb|varwidth| \medskip
\MeasureVarwidth[0.7\linewidth]{Some text Some text Some text Some text Some text Some text Some text }
\noindent\fbox{%
\begin{minipage}{\miniwidth}
Content of minipage.
\end{minipage}%
}\hfill
\begin{varwidth}{\linewidth}
\usebox{\ToVarwidth}
\end{varwidth}
\end{document}