我想要将生成的框的内容\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
。