Para facilitar a vida pretendo criar uma ficha de exercícios para uma palestra incluindo as soluções correspondentes. Portanto defini um \newif
para controlar se a solução deveria ser incluída ou não. Isso funcionou bem até que eu precise de um lstlisting
ou um verbatim
ambiente 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 solution
como 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 comment
pacote. 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.