Como ocultar um ambiente Listings ou Verbatim usando um comando \newif enable

Como ocultar um ambiente Listings ou Verbatim usando um comando \newif enable

Para facilitar a vida pretendo criar uma ficha de exercícios para uma palestra incluindo as soluções correspondentes. Portanto defini um \newifpara controlar se a solução deveria ser incluída ou não. Isso funcionou bem até que eu precise de um lstlistingou um verbatimambiente nele. O código a seguir é o exemplo mínimo do erro e também funciona verbatim.

\documentclass[a4paper,10pt]{article}
\usepackage[utf8]{inputenc}
\usepackage{listings}

\newif\ifsolution 
\solutionfalse

\ifsolution
\newcommand{\solution}[1]{#1}
\else
\newcommand{\solution}[1]{}
\fi

\begin{document}
This is always shown. 
\solution{The listing is only shown if ifsolution is true.
\begin{lstlisting}
 Test
\end{lstlisting}
}
\end{document}

Definir solutioncomo verdadeiro produz o erro. Como posso definir um comando ou ambiente com esta função?

Responder1

Minha primeira avaliação estava errada, mas como Gonzalo gentilmente observou

material literal não pode aparecer no argumento dos comandos padrão

Uma solução que funciona é não usar argumentos:

\ifsolution
\def\solution{\relax}
\else
\newcommand{\solution}[1]{}
\fi

Mas você também pode usar o commentpacote. Ele fornece a capacidade de definir facilmente um determinado ambiente como comment.

\documentclass[a4paper,10pt]{article}
\usepackage[utf8]{inputenc}
\usepackage{listings}

\usepackage{comment}
\excludecomment{solution}
%\includecomment{solution}

\begin{document}
This is always shown. 
\begin{solution}
    The listing is only shown if ifsolution is true.
\begin{lstlisting}
 Test
\end{lstlisting}
\end{solution}

\end{document}

Com \excludecomment{solution}as soluções não serão mostradas e quando você escrever \includecomment{solution}, elas serão mostradas.

informação relacionada