将框的内容写入文件

将框的内容写入文件

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

相关内容