需要有关 \openout、\write 和 \closeout 的帮助

需要有关 \openout、\write 和 \closeout 的帮助

有没有办法测试一个 token 是否已经与 关联writer?像这样:

\def\do@write#1{%
  \immediate\write\mywriter{something: #1}%
}
\def\@writesomething#1{%
  {\if@isopen\mywriter{%
    \do@write{#1} }%
   {\immediate\openout\mywriter=myfile.txt%
    \do@write{#1} }%
  }
}

如果\mywriter不与输出文件关联,\openout则调用该语句;否则,将被忽略。

另外,是否存在任何机制可以让我当 LaTeX 到达\end{document}语句时自动关闭所有打开的句柄?

答案1

没有对打开的写入流进行检查。在尝试写入之前,您必须始终确保写入流已打开。

但是你可以用条件来模拟检查:

\newif\if@mywriteopen % initially false

\def\@writesomething{%
  \if@mywriteopen\else
    \global\@mywriteopentrue
    \immediate\openout\mywriter=myfile.txt\relax
  \fi
  \do@write}

请注意,\relax文件名后面不应加%, 因为 TeX 在读取文件名时会扩展标记;\relax则会停止扩展,变得不可扩展。

TeX 运行结束时,所有写入和读取流都会自动关闭。

笔记。没必要\@writesomething用参数来定义,只要\do@write是就可以。

相关内容