Adiando o conteúdo do ambiente

Adiando o conteúdo do ambiente

Gostaria de criar um ambiente fooe um comando \listfoopara que:

  • O conteúdo do fooambiente está oculto; e
  • O comando \listfoolista todo o texto contido em um fooambiente.

Em outras palavras, o seguinte 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}

deve produzir a seguinte saída:

Amostra

Qualquer sugestão sobre como proceder seria muito apreciada. Obrigado!

Responder1

Isso usa uma macro \foocollecte , \NewEnvironem vez de \newenvironment, expande as versões \foocollectanteriores e depois o local do ambiente atual.\foocollect\BODY

insira a descrição da imagem aqui

\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}

Atualização com armazenamento em um arquivo em vez de memória

\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}

Responder2

Uma alternativa usando o scontentspacote:

\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}

com a mesma saída proposta: saída

informação relacionada