3

How can one hide/display all descriptions in a description environment at the same time.

\documentclass[]{article}

\begin{document}

\begin{description}
\item[Keep This] Discard This
\item[Keep This] Discard This
\end{description}

\end{document}
  • it's not clear what your question is really, you just have one begin end pair around each answer, so given latex syntax that's "normal" rather than "painstaking" isn't it? What markup do you want? – David Carlisle Dec 18 '14 at 21:32
  • You may have to consider capturing the contents between \item and another \item (with special care taken for the last one). However, how do you handle [A] and [B] in the above case? Do you include both the problem and the answer in the same \item? Perhaps we need to see a more comprehensive example... – Werner Dec 18 '14 at 21:32
  • [A] and [B] should always be there, whereas the answers should selectively be there. One option (perhaps?) would be a modified description environment where item labels are always visible, but the items themselves can be selectively (as a group!) hidden or displayed. – Henry Dec 18 '14 at 21:36
  • @DavidCarlisle in the same way a description environment simplifies writing a typical list of items and their description, I'm sure an environment exists or can be created to do precisely the same thing where the descriptions can be hidden en masse... – Henry Dec 18 '14 at 21:38
  • @Henry: Do you have anything following [A] or [B] that does not belong inside the answer environment? – Werner Dec 18 '14 at 21:43
2

One option would be to redefine the way description works, capturing all its \item[<stuff>] content and disregarding everything else. This catch-and-release is possible through a local redefinition of \item and placing the entire environment inside a box. That way things are not set to the page, but you can process the environment.

The above brief discussion is implemented below:

enter image description here

\documentclass{article}

\let\olddescription\description% Store \description (\begin{description})
\let\endolddescription\enddescription% Store \enddescription (\end{description})
\newsavebox{\descriptionbox}
\makeatletter
\newcommand{\discarddescription}{%
  \renewenvironment{description}
    {\gdef\descriptionlist{}% Clear description list
     \begingroup% Begin local scope
     \def\item[####1]{\g@addto@macro\descriptionlist{\item[####1]}}% Redefine \item[.] to capture its argument
                                                                   % and store it in \descriptionlist
     \begin{lrbox}{\descriptionbox}}% Start capturing elements
    {\end{lrbox}% End capturing elements
     \endgroup% Close local scope
     \begin{olddescription}\descriptionlist\end{olddescription}}% Set captured items in regular description
}
\newcommand{\restoredescription}{%
  \let\description\olddescription% Restore \description (\begin{description})
  \let\enddescription\endolddescription% Restore \enddescription (\end{description})
}
\makeatother

\begin{document}

\begin{description}
  \item[Keep this] Definitely keep this
  \item[Keep that] Definitely keep that
\end{description}

\discarddescription

\begin{description}
  \item[Keep this] Discard this
  \item[Keep that] Discard that
\end{description}

\restoredescription

\begin{description}
  \item[Keep this] Definitely keep this
  \item[Keep that] Definitely keep that
\end{description}

\end{document}

Switches are provided to discard description content (via \discarddescription) and restore its original functionality (via \restoredescription).

4

If you want to completely hide all description environments you can simply redefine the description environment to ignore anything in its body via the environ package. So with \RenewEnviron{description}{}{}: you obtain:

enter image description here

If you still want the \item labels form the description environments then you can hide the answer environment in the same manner via \RenewEnviron{answer}{}:

enter image description here

Then, when you want the ansers you can use \NewEnviron{answer}{\BODY} to obtain:

enter image description here

Code: Hide description environment

\documentclass[]{article}
\usepackage{environ}
\usepackage{comment}

%\excludecomment{answer}
\includecomment{answer}

\RenewEnviron{description}{}{}

\begin{document}
Some text before.
\begin{description}
\item[A]
    \begin{answer}
    Answer A
    \end{answer}
\item[B]
    \begin{answer}
    Answer B
    \end{answer}
\end{description}
Some text after.
\end{document}

Code: Hide answer environment

\documentclass[]{article}
\usepackage{environ}

\NewEnviron{answer}{}%       <--- Use this to hide the answer environment
%\NewEnviron{answer}{\BODY}% <--- Use this if you want the answer environment

\begin{document}
Some text before.
\begin{description}
\item[A]
    \begin{answer}
    Answer A
    \end{answer}
\item[B]
    \begin{answer}
    Answer B
    \end{answer}
\end{description}
Some text after.
\end{document}
  • Hi Peter, I may have been unclear - I want [A] and [B] labels to remain (so a list of bold A, B, ... should be the result). – Henry Dec 18 '14 at 21:50
  • @Henry: As you still want the labels, I have updated solution to hide just the answer environment. – Peter Grill Dec 18 '14 at 21:53
  • I'm sorry ok I'm going to update my question to be as clear as possible on this one!! – Henry Dec 18 '14 at 21:54
  • please see my updated question. The 'answer' environment was just my attempt (I tried to show my approach, but really I should have started with just my original problem). – Henry Dec 18 '14 at 21:56
  • @Henry: The alternate solution (which does not use the comment pacakge) already provides for this (but does requite the \item content to be an environment). – Peter Grill Dec 18 '14 at 22:00
2

You can switch easily between different definitions of a command, added a % and deleting another one. I do this a lot, to change layout. Think of your tex document as a kind of database, keeping as much formatting information as possible in the header.

\documentclass[]{article}

%\newcommand*{\thing}[2]{\item[#1] #2}
\newcommand*{\thing}[2]{\item[#1]}

\begin{document}


\begin{description}
\thing{A}{A}
\thing{B}{B}
\end{description}

\end{document}
2

This exploits the fact that in a description one has to specify the optional argument. It's better to give personal environments a name different from the generic one anyway, so I defined an answers environment; each item is introduced by \answer.

\documentclass{article}
\usepackage{environ}

\newif\ifshowanswers
%\showanswerstrue % uncomment for showing answers

\NewEnviron{answers}{%
  \begin{description}
  \ifshowanswers
    \let\answer\item
    \BODY
  \else
    \expandafter\processitems\BODY\answer\processitems
  \fi
  \end{description}
}

\makeatletter
\long\def\processitems\answer[#1]#2\answer#3\processitems{%
  \item[#1]%
  \if\relax\detokenize{#3}\relax
    \expandafter\@gobble
  \else
    \expandafter\@firstofone
  \fi
  {\processitems\answer#3\processitems}% restart the recursion
}

\begin{document}

\begin{answers}
\answer[A] Discard answer text A
\answer[B] Discard answer text B
\end{answers}

% this is by way of example
\showanswerstrue

\begin{answers}
\answer[A] Discard answer text A
\answer[B] Discard answer text B
\end{answers}

\end{document}

enter image description here

  • This is an incredibly good answer, unfortunately I don't feel qualified to judge which one of the several is the 'best'. Thank you! – Henry Dec 19 '14 at 3:19

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.