在之前的一个问题中,我学习了以下代码来定义条件编译的文本(供教师指导)
\newtoggle{teach}
\toggletrue{teach}
\NewEnviron{teachr}
{\iftoggle{teach}{\BODY}{}}
\newcommand{\cpp}{\begin{lstlisting}[language=C++]}
如果我想在条件编译的文本中嵌入代码,就会失败。条件文本可以正常工作。
\begin{teachr}
\cpp
class foo {};
\end{lstlisting}
\end{teachr}
错误信息为:!LaTeX 错误:输入行 166 上的 \begin{teachr} 以 \end{lstlisting} 结束。
我认为这是明显的失败,但如果我应该构建一个 mwe,请告诉我,我会编辑这个问题。
答案1
您不能这样做:lstlisting
环境不能嵌套在用 定义的环境中。此外,如果您没有使用正确的标签\NewEnviron
,您就不能将环境嵌套在用 定义的环境中。\NewEnviron
\begin
\documentclass{article}
\usepackage{listings}
\usepackage{comment}
\lstnewenvironment{cpp}[1][]
{\lstset{language=C++,#1}}
{}
\newenvironment{teacher}{}{}
%\excludecomment{teacher} % uncomment to hide
\begin{document}
This always shows
\begin{cpp}
class foo {};
\end{cpp}
\begin{teacher}
The following is for teacher only
\begin{cpp}
class bar {};
\end{cpp}
\end{teacher}
\end{document}
\excludecomment
如果删除了带有 的行%
,则输出将是