保护环境免受表格模式的影响

保护环境免受表格模式的影响

给定环境的语义要求,minipage如果在 中使用,则必须在 内排版tabular。如果我使用 为环境中的“内部”模式添加 minipage 声明以进行正面检查\ifinner,则它会起作用:仅在 模式下才会添加 minipage tabular。(这可以在输出中看到,因为 minipage 不会扩展到整个文本宽度。)我有以下问题:

  1. kframe为什么当环境关闭时,内部模式检查会成功?TeX 在minipage环境内部处于“内部”模式吗?
  2. 有没有更可靠的方法来进行这种检测?检测结果完全正确吗?

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}

MWE 编译结果

答案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

相关内容