使用“write”一词作为标签会导致编译崩溃

使用“write”一词作为标签会导致编译崩溃

我花了一整晚(确实)才弄明白。

编译两次中有一次失败,原始错误如下(第 12 行):“空间因子错误 (0)”。

这太疯狂了,因为语法中没有任何内容使得这一行与其他类似的例子有任何不同。

我最终明白了,问题在于我在上一行中使用了“写”这个词作为标签(我曾有点怀疑这一点,但最初认为这个假设太牵强,所以忽略了它)。

该问题出在“Philex”包的 \lb(x) 命令的内部结构中。

老实说,大家应该知道这一点,因为如果你不了解这一点,找到问题的根源就非常困难,而且无论如何,你都会浪费很多宝贵的时间。所以这也是我花时间写这篇文章的原因。

下面的代码编译得很好,因为我使用“Write”而不是“write”,但其他每次运行都会失败 - PDFtex,Xetex 或 Luatex)。

\documentclass{report}
\usepackage{philex}

\begin{document}

\lb{wripo}{
\lba{wripoa}{
\lba{writing}{I read all of John's writings.}
\lbz{poem}{I read all of John's poems.}}
\lbz{wripob}{
\lba{Write}{I read all of what John wrote.}  % Using “write” as a label causes compilation failure every other run. => “Bad space factor (0). ...ized}{I read all of what John poetized.}}}”
\lbz{poetized}{\oddity{*}I read all of what John poetized.}}}
    
\end{document}

在此处输入图片描述

所以我的问题是:是否有其他我应该避免用作标签的词语,是否存在一种特定的方法可以将“特殊词语”视为普通词语,即“逃避”它们的编码属性?

非常感谢。

答案1

当你使用\lba{something}philex包时,基本上会写入辅助文件

  \gdef\something{\ref{#2}}

这意味着它将破坏任何同名的命令。在您的示例中,它破坏了原始\write命令,但例如\lba{section}在两次编译之后会将输出更改\section{Hallo}为:

在此处输入图片描述

7 故障排除中的文档中提到了这个问题,其中说

尤其是对于短标签,有时会发生生成的标签与 TeX、LaTeX 或某些文档类或包定义的控制序列相吻合的情况

在我看来,这是相当轻描淡写的说法。定义这样的命令是非常糟糕的编码,我不会使用这样做的包。但如果你必须使用它:使用带有前缀和特殊字符的标签,例如vincent!write?。发生冲突的可能性就会小得多。

相关内容