
我想獲取生成的框中的內容\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
正如大衛已經說過的,盒子的內容不能寫入文件。但是,可以使用套件捕獲環境的內容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
。