是否可以定义一个像 一样工作的命令\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
加在一起,其他所有内容都放在一个从未设置的框中捕获。第二次,框会设置内容。如果需要,可以将其修改为仅设置已捕获的内容。