我试图理解 egreg 的回答隐藏内容以便稍后显示,我注意到在egreg 提出的环境内使用lstlisting
或tcblisting
环境时出现了一些问题,而其他环境如或似乎运行良好。solution
figure
proof
我查看了几个相关问题(例如使用 \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
,并且可以包含lstlisting
或tcblisting
环境。
注意:我知道在我定义的代码中,我可以使用\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}