并列 minipage 和 varwidth

并列 minipage 和 varwidth

我正在寻找一种将 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为了便于直观显示,小页面被包含在内。

A

\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}

相关内容