次のような環境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}