首页 文章

\ colorbox→\ NewEnviron→\ newenvironment的三重包装失败

提问于
浏览
5

我正在尝试将使用 \NewEnviron (包'environ')创建的环境包装成旧的 \newenvironment

\NewEnviron{test}{\colorbox[gray]{0.7}{\BODY}}
\newenvironment{wrapper}{\begin{test}}{\end{test}}

\begin{wrapper}
debug me
\end{wrapper}

但是,这给了我一个奇怪的错误:

LaTeX错误:输入行15上的\ begin 以\ end 结束 . LaTeX错误:输入行15上的\ begin 以\ end 结束 .

如果我用 \newenvironment{test}{aaa(}{)bbb} 替换 \NewEnviron{test}{aaa(\BODY)bbb} - 一切都按预期工作!似乎 \NewEnviron 由于某种原因未能找到它的结局 .

我将'm trying to do some magic with ' floatfig'包装成 \colorbox 所以我需要一种方法将 \colorbox 转换为环境并将其包装到另一个环境中 . 我可以定义一个新命令,但这不是一个好主意 .

2 回答

  • 6

    问题是 \NewEviron\newenvironment 以不同的方式工作 .

    1) \newenvironment{test}{aaa(}{)bbb} 定义了两个命令: \testaaa(\endtest)bbb .

    \begin{test} 扩展为 \test .

    \end{test} 扩展为 \endtest 并检查您的范围是以 begin{test} 而不是 \begin{something else} 开头,例如 \begin{wrapper} .

    2) \NewEviron{test}{aaa(\BODY)bbb} 以不同的方式定义 \test . 首先 \test 使用以下技巧捕获 \BODY

    \def\test#1\end{\def\BODY{#1}aaa(\BODY)bbb\testcontinue}
    

    (名称 \testcontinue 可能不同)并插入 aaa(\BODY)bbb . 然后 \testcontinue 检查某些输入行上的 \end\end{test} 而不是 \end{something else} 结束 . 不需要宏 \endtest ,因为它永远不会被执行 .

    看看你的代码:

    \begin{wrapper}
    debug me               
    \end{wrapper}
    

    \begin{wrapper} 扩展为 \begin{test} . 然后 \begin{test} 扩展为 \test . \test catch \BODY . 注意! \BODY 等于 debug me . 现在 \testcontionue\end{test} _结束 \end{test} 之后检查 \end . 这不是真的 . \end{test} 缺席 . 有 \end{wrapper} .

    你想说 \end{wrapper} 必须扩展到 \end{test} . 但是 \end 之前包装被吃掉了

    macro \test: #1\end{\def\BODY{#1}aaa(\BODY)bbb\testcontinue}
    

    并且无法执行 .

    我希望我成功解释 .

  • 1

    我发现了一个hacky技巧来创建一个可以包装在另一个环境中的环境 . 应该使用像这样的saveBoxes:

    \newenvironment{example}[2][]{%
        \newsavebox{\exampleStore} % Box storage
        \begin{lrbox}{\exampleStore} % Start capturing the input
        }{%
            \end{lrbox} % Stop capturing the input
        \colorbox[gray]{0.7}{%
                \usebox{\NBstorage} % Load the box's contents
                }%
            }%
        }%
    

相关问题