我如何使用 morewrites 和 memoize?

我如何使用 morewrites 和 memoize?

考虑以下我用 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.styadvice.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 引擎),这两者都不是不可能想象会发生的,但实际上并没有做到。

相关内容