![需要有关 \openout、\write 和 \closeout 的帮助](https://linux22.com/image/245094/%E9%9C%80%E8%A6%81%E6%9C%89%E5%85%B3%20%5Copenout%E3%80%81%5Cwrite%20%E5%92%8C%20%5Ccloseout%20%E7%9A%84%E5%B8%AE%E5%8A%A9.png)
有没有办法测试一个 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
是就可以。