NewEnviron,\BODY 和 lstlisting

NewEnviron,\BODY 和 lstlisting

我试图理解 egreg 的回答隐藏内容以便稍后显示,我注意到在egreg 提出的环境内使用lstlistingtcblisting环境时出现了一些问题,而其他环境如或似乎运行良好。solutionfigureproof

我查看了几个相关问题(例如使用 \newenvironment 的 environ 环境如何删除算法包中定义的\BODY?),我认为(但不确定)冲突来自listing可能定义\BODY命令的包,就像 一样environ

例如,一个最小的非工作示例如下:

\documentclass[10pt]{book}
\usepackage{environ}
\usepackage{listings}

\NewEnviron{solution}{\BODY}

\begin{document}

\begin{solution}
This is an environment containing code.
\begin{lstlisting}
My code
\end{lstlisting} 
\end{solution}


\end{document}

使用此代码,我出现以下错误:列表开始后文本丢失

此错误从何而来?我该如何避免?我的目标是拥有一个solution用 定义的环境\NewEnviron,并且可以包含lstlistingtcblisting环境。

注意:我知道在我定义的代码中,我可以使用\newenvironment而不是\NewEnviron,但我想要的环境(这正是egreg对的回答中的一个)隐藏内容以便稍后显示) 确实需要 的功能\NewEnviron,尤其是\BODY宏,因为我想存储 的内容\solution以便稍后显示它。

答案1

如果您能够接受verbatim未语法高亮且不需要分页的代码,则可以将其放置在verbatimbox进入新定义的环境之前solution

当然,到那时,它就在一个盒子里,并且不能以文本形式使用。

\documentclass[10pt]{book}
\usepackage{environ}
%\usepackage{listings}
\usepackage{verbatimbox}
\NewEnviron{solution}{\BODY}

\begin{document}

\begin{verbbox}
c My code
      i = 0
      do while(i .lt. 10)
        print *, i
        i = i + 1
      end do
      stop
\end{verbbox}
\begin{solution}
This is an environment containing code.

\theverbbox
\end{solution}


\end{document}

在此处输入图片描述

相关内容