在 minipage 之后,类似于 afterpage

在 minipage 之后,类似于 afterpage

是否可以定义一个像 一样工作的命令\afterpage,但仅适用于minipage环境?我想到的用法如下

\begin{minipage}
See the graph in Figure~\ref{foo}.
\afterminipage{\begin{figure}
etc.
}
\end{minipage}

此示例将导致figure环境在结束时执行minipage

答案1

试验一下——间距不太好,而且取决于用户的正确设置:

\afterminipage{...}将其参数存储到辅助宏中\@afterminipage,该宏仅在定义时在 minipage 环境结束后使用\@afterminipage。使用结束时\@afterminipage设置为\relax,因此它实际上是未定义的。除非应用了新语句,否则下次使用minipage不会\afterminipage再次添加此代码\afterminipage

\documentclass{article}

\usepackage{graphicx}
\usepackage{caption}
\usepackage{xpatch}

\usepackage{blindtext}

\makeatletter
\newcommand{\afterminipage}[1]{%
  \gdef\@afterminipagehook{#1}%
}

\AfterEndEnvironment{minipage}{%
  \@ifundefined{@afterminipagehook}{%
  }{%
    \@afterminipagehook%
  }
  \global\let\@afterminipagehook\relax
}
\makeatother

\begin{document}

\begin{minipage}[t]{\textwidth}
  See the graph in Figure~\ref{foo}.
  \afterminipage{%

    \blindtext

    \centering
    \includegraphics[scale=1]{beeduck}%
    \captionof{figure}{A figure} \label{foo}
}
\end{minipage}


\begin{minipage}{\textwidth}
  See the graph in Figure~\ref{foo}.

 \blindtext
\end{minipage}


\end{document}

在此处输入图片描述

答案2

使用environ

在此处输入图片描述

\documentclass{article}

\usepackage{environ}

\makeatletter
\newcommand{\@afterminipage}{}
\newcommand{\afterminipage}[1]{\xdef\@afterminipage{\@afterminipage#1}}

\let\oldminipage\minipage
\let\endoldminipage\endminipage

\newsavebox{\minipagesavebox}
\RenewEnviron{minipage}[2][c]{%
  \savebox{\minipagesavebox}{\BODY}%
  \let\afterminipage\@gobble
  \begin{oldminipage}[#1]{#2}
    \BODY
  \end{oldminipage}
  \@afterminipage
  \gdef\@afterminipage{}%
}
\makeatother

\begin{document}

\begin{minipage}{.5\textwidth}
Something.
\afterminipage{abc}%
def
\end{minipage}

\begin{minipage}[b]{.5\textwidth}
Something 
\afterminipage{multiple }%
completely different here that should span multiple lines of
\afterminipage{lines}%
code
\afterminipage{ of code.}%
\end{minipage}

\end{document}

这种方法的一个问题是对环境内容的双重处理minipage。第一次只将 s 提供的内容\afterminipage加在一起,其他所有内容都放在一个从未设置的框中捕获。第二次,框会设置内容。如果需要,可以将其修改为仅设置已捕获的内容。

相关内容