给定环境的语义要求,minipage
如果在 中使用,则必须在 内排版tabular
。如果我使用 为环境中的“内部”模式添加 minipage 声明以进行正面检查\ifinner
,则它会起作用:仅在 模式下才会添加 minipage tabular
。(这可以在输出中看到,因为 minipage 不会扩展到整个文本宽度。)我有以下问题:
kframe
为什么当环境关闭时,内部模式检查会成功?TeX 在minipage
环境内部处于“内部”模式吗?- 有没有更可靠的方法来进行这种检测?检测结果完全正确吗?
该kframe
环境用于 knitr 生成的代码;它应该在 内部和外部工作tabular
。
\documentclass{article}
\pagestyle{empty}
\usepackage{color}
\usepackage{framed}
\newenvironment{kframe}{%
% The \ifinner check below is necessary
\ifinner\begin{minipage}{.8\textwidth}\else\fi%
\def\FrameCommand##1{\colorbox{yellow}{##1}}%
\MakeFramed{}}{%
\endMakeFramed%
% Why does this \ifinner check work?
\ifinner\end{minipage}\fi}
\begin{document}
\begin{kframe}
Any text long enough will do here.
Any text long enough will do here.
Any text long enough will do here.
\end{kframe}
\begin{tabular}{l}
\begin{kframe}
Any text long enough will do here.
Any text long enough will do here.
Any text long enough will do here.
\end{kframe}
\end{tabular}
\end{document}
答案1
这将是很奇怪的需要在minipage
表格内部,表格单元格几乎没有什么不被\mbox
(对于l
列)或\parbox
(对于p
列)共享的。
在我看来,如果在l
列或\mbox
其他受限水平模式下,您需要一个小页面,所以我认为你想要
\ifinner\ifhmode start minipage \fi\fi
这将在 tabular 中启动 minipage l
,但不会启动 tabular p
。下面的代码包含完整的实现,包括 egreg 关于关闭minipage
环境的注释。
\makeatletter
\newenvironment{kframe}{%
\def\at@end@of@kframe{}%
\ifinner\ifhmode%
\def\at@end@of@kframe{\end{minipage}}%
\begin{minipage}{.8\textwidth}%
\fi\fi%
\def\FrameCommand##1{\colorbox{yellow}{##1}}%
\MakeFramed{}}{%
\endMakeFramed%
\at@end@of@kframe}
\makeatother