
生成されたボックスの内容を取得し\begin{lrbox} ... \end{lrbox}
てファイルに書き込みたいと思います。
ユースケースは質問と回答の環境で、回答を収集してドキュメント内の別の場所に示す必要があります。さらに、質問の横に回答を表示したいと思います。そのため、質問をボックスにまとめ、このボックスの内容は環境内でも、外部ファイルへのデータの保存にも使用できると想定しています。しかし、最後の部分がこの質問の理由です。
これまで私が使用してきたアプローチは、newfile
以下のパッケージとコードです。問題は、test3.commentに書かれている内容が次のとおりであることです。
\unhbox \voidb@x \copy \myboxquestion \relax
ほぼ動作するコード
\documentclass{article}
\usepackage{newfile}
\newoutputstream{comment}
\openoutputfile{\jobname.comment}{comment}
\newsavebox{\myboxquestion}
\newenvironment{question}{%
\begin{lrbox}{\myboxquestion}\begin{minipage}{\linewidth}}{%
\end{minipage}\end{lrbox} \par\usebox{\myboxquestion}
% What to do here?
\addtostream{comment}{\usebox{\myboxquestion}}}
\setlength{\parindent}{0.0cm}
\begin{document}
Testing
\begin{question}
What is 3 + 4
\end{question}
\section{Collected}
\input{\jobname.comment}
\end{document}
答え1
TeX には、アクセス可能なボックス構造のシリアル化がなく、特にファイルに書き込むことはできません。再利用のためにボックスを TeX メモリ内に保存するか、ボックスを保存する代わりに、テキストを構成するトークンを取得してファイルに書き込み、ファイルが読み込まれたときにリセットされるようにする必要があります。これが、目次と文末脚注パッケージがドキュメントの最初または最後にセクションの見出しまたは脚注を繰り返す仕組みです。
以下は、外部ファイルではなくグローバル ボックス レジスタを使用する MWE です。
\documentclass{article}
\newsavebox{\myboxquestion}
\newbox\savedqns
\setbox\savedqns\vbox{}
\newenvironment{question}{%
\begin{lrbox}{\myboxquestion}\begin{minipage}{\linewidth}}{%
\end{minipage}\end{lrbox} \par\noindent\usebox{\myboxquestion}
\global\setbox\savedqns\vbox{%
\unvbox\savedqns
\bigskip
\filbreak
\noindent\usebox{\myboxquestion}}}
\setlength{\parindent}{0.0cm}
\begin{document}
Testing
\begin{question}
What is 3 + 4
\end{question}
Testing again
\begin{question}
What is 3 + 3
\end{question}
\section{Collected}
\unvbox\savedqns
\end{document}
答え2
David がすでに述べたように、ボックスの内容はファイルに書き込むことはできません。ただし、環境の内容はパッケージを使用して取得しenviron
、呼び出してファイルに書き込むこともできるマクロに保存できます。
ちなみに、出力ストリームを読み取る前に、まず閉じる必要があります。
\documentclass{article}
\usepackage{newfile}
\newoutputstream{comment}
\openoutputfile{\jobname.comment}{comment}
\usepackage{environ}
\NewEnviron{question}{%
\BODY
\addtostream{comment}{\detokenize\expandafter{\BODY}}%
% \detokenize prevents macro expansion
}
\setlength{\parindent}{0cm}
\begin{document}
Testing
\begin{question}
What is 3 + 4?
\end{question}
\section{Collected}
\closeoutputstream{comment}
\input{\jobname.comment}
\end{document}
結果:
この方法の欠点は、環境の内容がそのまま記述されることです。これは、環境の内容をそのままキャッチすることで解決できます。この形式では、ファイルに書き込むことができます。キャッチした環境は、 の助けを借りて設定できます\scantokens
。