我的问题与“无法访问”有关。我已经搜索过了,但发现几乎没有信息可以帮助我。我的代码对于 MWE 来说太长太复杂了,所以我必须自己去寻找。因此,我寻求指导,看看在哪里可以找到。
该错误与数学模式的入口有关。一旦遇到$
,编译就会停止,并指出$
无法访问。如果我改用,也会发生这种\(
情况。无论后面是什么$
。甚至在文档主体中遇到$ $
第一个时也会抛出错误。$
我使用的是带有 fontspec 的 lualatex 2017,但错误不是由未使用我的代码的测试文档产生的。因此,错误肯定出在我自己的代码中。此外,如果我在使用自己的代码时避免使用数学模式,则不会产生任何错误。所以,这限制了可能性。我没有任何专门针对数学模式的宏。
我检查了一下,就在 之前$
, 的 catcode$
是 3,正如预期的那样。我还询问了一下,\show$
它告诉我这是数学模式转换,正如预期的那样。
根据 TeX 错误消息,以及此处的先前问题,inacessible
当代码包含错误语法(例如,\def{somecommand}{something}
而不是正确的)时,可能会抛出\def\somecommand{something}
。我已经检查了我的代码,没有这样的错误。日志文件没有说明我的情况。
那么,还有哪些其他因素可能导致inaccessible
消息?考虑到某些可能性,我将不得不自己寻找答案。我希望我提出的这个问题能够引起大家的兴趣。
进一步编辑:之前,我在这里保存了日志文件的一部分,但它太过局部,不会引起普遍关注。相关部分涉及数学模式字体定义方式的错误。错误总是潜伏着,但直到进入数学模式才会抛出。导致错误的是我自己对字体相关代码的操作,这种方式对普通文本模式无害。
我接受了 David 的回答,因为他的回复(在聊天中继续)帮助我将问题缩小到代码的某个特定部分。Barbara 的回答也很有帮助。当我删掉那段代码时,数学模式就可以工作了。现在,我要做的就是找出原因。原因并不完全是上述那个(错误使用\def
),而是与我自己对命令的重新定义有关。有很多方法可以弄乱重新定义,这些方法在本论坛的许多其他问题中都有充分讨论。其中的可能性包括\let
在应该是的时候使用\LetLtxMacro
,或者重新定义最初在 ExplSyntax 中的命令以使其不再使用该语法。
指导要点:错误使用\def
(或\edef
诸如此类)并不是弄错宏定义的唯一方法。
最终(?) 编辑:问题解决了!在我的代码中,我这样做了:\let\textfont\rmfamily\relax
。那是旧代码,我忘了为什么这样做(没有实际用途)。所以我摆脱了它,现在一切都好了。事实证明\textfontN
(其中 N 是一个数字)被字体加载器使用。所以,我的代码破坏了字体加载器,而这恰好捕获了加载数学字体的部分。错误仅在进入数学模式时出现,因为那是调用错误定义字体的唯一位置。如果错误是在序言期间由字体加载器直接抛出的,我就会发现它。
答案1
如果每次数学运算都插入一个不可访问的控制序列,那么在经典 tex 中,你几乎肯定会得到类似的东西
\everymath{\def z{}}
blah $x$
\bye
产生
! Missing control sequence inserted.
<inserted text>
\inaccessible
<to be read again>
z
<everymath> \def z
{}
<to be read again>
x
l.6 blah $x
$
?
您可以在 luatex 中执行相同的操作,但在 luatex 中,可以通过 Lua 回调而不是通过寄存器插入错误生成代码\everymath
。
自从发布这个答案以来,日志就被添加到问题中,并且它证实了这基本上就是发生的事情。
LaTeX 加载数学字体(每个字体大小第一次使用数学),\everymath
并且由于各种原因,它以在显示命令名称时不使用反斜杠的模式处理字体加载代码。
由于某种原因(从显示的日志片段中看不清楚),部分内容\math@fonts
似乎被错误地双重扩展了,因此下次执行时,而不是
\def\encoding{TU}
确实如此
\def TU{TU}
因为 \encoding 已经扩展
所以\def
看到T
并且......
答案2
大卫的评论和回答给了我一个想法。
尝试使用任意口味的乳胶:
\documentclass{article}
\newcommand{z}{xxx}
\begin{document}
xxx
\end{document}
我明白
! Missing control sequence inserted.
<inserted text>
\inaccessible
l.2 \newcommand{z}{xxx}
这意味着您可能试图定义一个没有初始反斜杠的命令。当然还有其他可能性,但这应该是相对容易找到的。