Umgebungsinhalte verschieben

Umgebungsinhalte verschieben

Ich möchte eine Umgebung foound einen Befehl erstellen \listfoo, sodass:

  • Der Inhalt der fooUmgebung ist verborgen.
  • Der Befehl \listfoolistet den gesamten Text auf, der in einer fooUmgebung enthalten war.

Mit anderen Worten, der folgende Code:

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

sollte die folgende Ausgabe erzeugen:

Probe

Ich bin für alle Vorschläge zum weiteren Vorgehen sehr dankbar. Danke!

Antwort1

Hierbei wird ein Makro verwendet \foocollectund \NewEnvironanstelle von \newenvironmentwerden \foocollectdie vorherigen \foocollectVersionen und dann die lokale Version \BODYder aktuellen Umgebung erweitert.

Bildbeschreibung hier eingeben

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

Update mit Speicherung in einer Datei statt im Speicher

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

Antwort2

Eine Alternative mit dem scontentsPaket:

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

mit der gleichen vorgeschlagenen Ausgabe: Ausgabe

verwandte Informationen