考虑以下我用 pdfTeX 编译的 MNWE:
\documentclass{article}
\usepackage{morewrites}
\usepackage{memoize}
\usepackage{tikz}
\begin{document}
\begin{tikz}
\draw (0,0) -| (1,1);
\end{tikz}
\end{document}
编译失败,错误如下
! I can't write on file `{.//prawf.700EB6A4550C47FDDA18E01DBED7CCDC.memo}'.
<to be read again>
\scan_stop:
l.229 \draw (0,0) -| (1,1);
(Press Enter to retry, or Control-D to exit; default file extension is `.tex')
Please type another output file name:
\write16
我猜这可能与in的使用有关memoize.sty
,advice.sty
因为morewrites.pdf
TEXhackers 指出:修改后的
\newwrite
分配流编号从 19 开始。这可能会破坏一些预期流编号小于 16 的代码。
但是,\write16
在这两种情况下,代码中都会调用,据我所知,这是为了跟踪目的,默认情况下是关闭的。所以我不确定这是否是问题所在。
尽管如此,我还是尝试添加,例如,
\makeatletter
\def\advice@trace#1{\immediate\write\@unused{[tracing advice] #1}}
\def\mmz@trace#1{\immediate\write\@unused{[tracing memoize] #1}}
\makeatother
但这显然是个愚蠢的想法,因为它根本没有任何区别。也就是说,以下代码可以编译:
\documentclass{article}
%\usepackage{morewrites}
\usepackage{memoize}
\usepackage{tikz}
\makeatletter
\def\advice@trace#1{\immediate\write\@unused{[tracing advice] #1}}
\def\mmz@trace#1{\immediate\write\@unused{[tracing memoize] #1}}
\makeatother
\begin{document}
\begin{tikz}
\draw (0,0) -| (1,1);
\end{tikz}
\end{document}
但是,一旦我取消对 的调用的注释morewrites
,编译就会中断并出现上面报告的错误。
所以我不清楚这是否只是的用法\write16
,是否我错过了不太明显的用法\write16
,或者这里是否存在进一步的不兼容性。
我知道使用 luaTeX 可能会避免使用morewrites
,但我需要的文档已经足够依赖于 pdfTeX,如果使用它需要切换引擎,morewrites
我可能会避免使用它。memoize
什么原因导致了错误?有没有办法在 pdfTeX 中解决该错误?
在有人问我是否真的需要之前morewrites
,David Carlislemorewrites
几年前在对 LaTeX 进行一些更改后就告诉我我需要它。
[也就是说,我是否有机会鱼与熊掌兼得?一种可以自我延续的蛋糕……]
答案1
编辑 1/2024:使用最新版本的 morewrites 它应该可以工作。
======
问题是这个morewrites
包相当老了。它不知道各种文件原语现在允许使用括号参数。这意味着如果你编译这个
\documentclass{article}
\newwrite\mywrite
\immediate\openout\mywrite{./blub.txt}
\begin{document}
\immediate\write\mywrite{blub}
\immediate\closeout\mywrite
bluba
\end{document}
然后它在 texlive 2023 中工作正常并写入文件,但在 texlive 2017 中出现错误,因为它尝试使用括号(哪种工作)和内部斜杠(操作系统不允许)blub.txt
写入文件并且无法解决这个问题:{./blub.txt}
! I can't write on file `{./blub.txt}'.
memoize
使用新语法,而其重新定义morewrites
恢复“旧”语法则会导致类似的错误:
\immediate\openout\mmz@out{\mmz@cmemo@path}% doesn't work in older tex systems.
另请参阅错误报告:https://github.com/blefloch/latex-morewrites/issues/19
答案2
Ulrike 已经解释了这个问题,但如果你真的需要morewrites
(通常不需要),并且您不想跟踪两个包以使它们保持一致,您可以执行以下操作(只要您的操作系统允许)/
请注意,这是朝着解决方法迈出的一步,可以避免错误,但不会产生可用的输出
mkdir "{."
然后当morewrites
尝试写入
{./example.700EB6A4550C47FDDA18E01DBED7CCDC.memo}
包括括号,而不是给出错误,它会写入文件
example.700EB6A4550C47FDDA18E01DBED7CCDC.memo}
在目录(文件夹)中{.
因此,您最终会得到一个以 结尾的奇怪名称的文件,以及}
一个以 开头的奇怪名称的目录{
,但它确实有效。
注意这允许 \input{./foo}
错误,并且具有foo}
目录的新解释{.
。不幸的是,memoize
还使用了较新的原语,这些原语始终接受括号形式,例如,\pdf@mdfivesum{./foo}
因此它们指的是当前目录中的目标(但现在不存在)文件foo
。因此,上述方法避免了错误,但memoize
在各个方面都失败了。真正的解决方法是更新morewrites
(或 pdftex 引擎),这两者都不是不可能想象会发生的,但实际上并没有做到。