我维护一个包(morewrites
) 需要临时辅助文件才能运行(立即写入和读取)。此辅助文件当前名为\jobname.mw
,并且用户要求我允许自定义,因为此扩展与其他工具冲突。
我的第一个想法是提供一个形式的界面\morewritessetup{file=...}
,其中...
用用户想要使用的名称替换。
但是,我担心用户会\morewritessetup{file=\jobname}
犯错误。当我的代码写入文件时\jobname
,它会破坏源文件\jobname.tex
,用户会非常不高兴。这实际上是一个更大的问题:最好确保我没有破坏用户的任何现有文件。不幸的是,我无法在写入文件之前简单地检查文件是否是新的,因为只有在第一次对文件运行 TeX 时才会出现这种情况。
什么是安全的方法?
答案1
当 TeX 被要求开始写入文件时,它本身不会做任何检查。这可能会带来不良后果。
例如,使用会导致覆盖已有的同名书目数据库。在一个我不愿提及的操作系统上,这样做\begin{filecontents}{references.bib}
会导致 的破坏,因为系统不允许在文件名中使用多个句点,并且当 TeX 尝试在 上写入时,操作系统会丢弃第二个扩展名。\usepackage{filecontents}
\include{file.tex}
file.tex
file.tex.aux
第一个问题可以通过以下方法解决避免 \usepackage{filecontents}
除非确信它不会覆盖必要的文件。第二个问题可以通过修复来解决,\include
这样当参数包含.tex
扩展名时它就会停止(在这种情况下,无论如何都不应该使用扩展名)。
每次写出辅助文件时都会出现问题。在我的gmp
包中,使用的文件名\jobname+mp<number>
应该足够安全;因为imakeidx
我依赖.idx
、.ind
和.ilg
扩展名。
解决您问题的一个可能方法是查看将被覆盖的文件的前几行(如果该文件已经存在)。如果它们与某种模式匹配,您几乎可以肯定该文件是您的包在上次运行时创建的。