상자의 내용을 파일에 쓰기

상자의 내용을 파일에 쓰기

\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.

관련 정보