推迟环境内容

推迟环境内容

我想创建一个环境foo和一个命令\listfoo以便:

  • 环境的内容foo是隐藏的;并且
  • 该命令\listfoo列出了环境中包含的所有文本foo

换句话说,以下代码:

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

应该产生以下输出:

样本

如果您能提供任何关于如何进行的建议,我们将不胜感激。谢谢!

答案1

这使用了一个宏\foocollect,而\NewEnviron不是\newenvironment\foocollect扩展了以前的\foocollect版本,然后扩展了\BODY当前环境的本地版本。

在此处输入图片描述

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

更新存储到文件而不是内存中

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

答案2

使用该包的替代方法scontents

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

具有相同的建议输出: 输出

相关内容