Posponer el contenido del entorno

Posponer el contenido del entorno

Me gustaría crear un entorno fooy un comando \listfoopara que:

  • El contenido del fooentorno está oculto; y
  • El comando \listfooenumera todo el texto contenido en un fooentorno.

En otras palabras, el siguiente código:

\documentclass{article}
\usepackage{lipsum}
\newenvironment{foo}{% Some code here
}
{% Some code here
}
\newcommand{\listfoo}{
% Some code to list the content of the `foo` environments.
}

\begin{document}
\lipsum[1]

\begin{foo}
\bf Foo text 1
\end{foo}

\lipsum[2]

\begin{foo}
\bf Foo text 2
\end{foo}

\lipsum[3]

\begin{foo}
\bf Foo text 3
\end{foo}

\listfoo
\end{document}

debería producir el siguiente resultado:

Muestra

Cualquier sugerencia sobre cómo proceder sería muy apreciada. ¡Gracias!

Respuesta1

Esto utiliza una macro \foocollecty \NewEnvironen lugar de \newenvironment, \foocollectexpande las versiones anteriores \foocollecty luego la local \BODYdel entorno actual.

ingrese la descripción de la imagen aquí

\documentclass{article}
\usepackage{lipsum}

\usepackage{environ}


\def\foocollect{}

\NewEnviron{foo}{% Some code here
  \xdef\foocollect{\expandafter\unexpanded\expandafter{\foocollect}\par\expandafter\unexpanded\expandafter{\BODY}}%
}[% Some code here
]

\newcommand{\listfoo}{%
  \foocollect%
  % Some code to list the content of the `foo` environments.
}

\begin{document}
\lipsum[1]

\begin{foo}
\bfseries Foo text 1
\end{foo}

\lipsum[2]

\begin{foo}
\bfseries Foo text 2
\end{foo}

\lipsum[3]

\begin{foo}
\bfseries Foo text 3
\end{foo}

\listfoo
\end{document}

Actualización con almacenamiento en un archivo en lugar de memoria

\documentclass{article}
\usepackage{lipsum}

\usepackage{environ}
%\usepackage{morewrites}% only if you run out of filehandles    

\newwrite\collectedcontentfile

\AtBeginDocument{%
  % Automatically open the file at the beginning of the document
  \immediate\openout\collectedcontentfile=\jobname.cll
}

\NewEnviron{foo}{% Some code here
  \immediate\write\collectedcontentfile{%
    \expandafter\unexpanded\expandafter{\BODY}^^J
  }%
}[% Some code here
]

\newcommand{\listfoo}{%
  %Closing the file
  \immediate\closeout\collectedcontentfile% 
  \InputIfFileExists{\jobname.cll}{}{}
}


\begin{document}
\lipsum[1]

\begin{foo}
\bfseries Foo text 1
\end{foo}

\lipsum[2]

\begin{foo}
\bfseries Foo text 2
\end{foo}

\lipsum[3]

\begin{foo}
\bfseries Foo text 3
\end{foo}

\listfoo
\end{document}

Respuesta2

Una alternativa usando el scontentspaquete:

\documentclass{article}
\usepackage{lipsum}
\usepackage{scontents}
\newenvsc{foo}[store-env=foopost,print-env=false]

\begin{document}
\lipsum[1]

\begin{foo}
\textbf{Foo text 1
\end{foo}

\lipsum[2]

\begin{foo}
\textbf{Foo text 2}
\end{foo}

\lipsum[3]

\begin{foo}
\textbf{Foo text 3}
\end{foo}
\noindent
\foreachsc[after={\\}]{foopost}
\end{document}

con el mismo resultado propuesto: producción

información relacionada