“冻结”是什么意思(例如对于 catcodes)?

“冻结”是什么意思(例如对于 catcodes)?

在评论中(重点是我的)

不,它必须改变 catcodes如果他们已经被冻结,这将不起作用

回应我的评论她的回答Ulrike Fischer 提到了冻结猫代码的概念。我一生都不知道冻结猫代码是什么,所以我想写一个问题。

我仔细搜索(寻找freez和的实例froz):

  • 电子书,第326页:[...] 但里面的胶水却\hbox{...}以其自然宽度冻结。
    • 另见第 173 页:[...] 因为这些额外的括号“冻结”了子公式,[...]
  • TeX 概述:没有提及(只是 TeX 开发在 1991 年停止了)
  • 缺乏耐心的 TeX... 没有什么
  • TeX 按主题分类... 没有什么
  • TikZ & PGF 手册(3.1.2):多次提到“结束时冻结”,但都是指 TikZ/PGF 特定的功能
  • 巴别塔 (Babel)manual(3.32):几种用途一个\frozen命令并且有一个“冻结”内联的例子,这显然与当前主题无关
  • LuaTeX 和 LuaLaTeX 中的引介(Herbert Voß 著,德文,ISBN 978-3-86541-530-1):font.frozen... 字体表中的布尔值,提及wxLuaFreeze
  • 带有 LaTeX 的表格(Herbert Voß 编著,第 3 版,德文,ISBN 978-3-86541-936-1):文本显示为“frozen”
  • Einführung in LaTeX(由 Herbert Voß 编写,第 3 版,德文,ISBN 978-3-86541-798-5):文中多次出现“gefroren”和“erfroren”

(在德语书中,我也查找了frier应该fror能找到与 freeze/frozen 相对应的德语单词的例子。)

问:那么“冻结”这个概念意味着什么,它会影响哪些实体,我如何在我的技术工作中利用它?显然,这个概念不仅限于 catcode...

答案1

显然这个概念并不局限于 catcode

除了您链接到的最后一个情况之外,在所有情况下,“frozen”都没有被用来指代任何指代特定定义的技术术语,它只是在口语英语意义上被用来表示“不变”。

Catcode 会影响文件中字符的解释,因为它们会被解析以生成供其余宏系统使用的字符标记。重要的是,字符标记同时包含字符代码和类别代码,并且不会因 catcode 值更改而更改。

例如你可以这样做

 .... {\catcode`\&=12 ... & ... } ...

并排版为正常&

 .... \textbf{\catcode`\&=12 ... & ... } ...

将会失败,因为的参数\textbf将首先被解析,因此&将会从文件中读取其正常的 catcode,使其成为对齐分隔符,因此当的字符标记&被视为文本排版时,它会产生错误,即使此时的 catcode 设置的当前值&的 catcode 为 12。

与关于标记的技术讨论相比,更容易告诉人们 catcode 一旦读取就不会改变(或“冻结”),这就是为什么\verb类似的命令在另一个命令的参数中不起作用的原因。

答案2

这个单词冻结几乎总是用来比喻以固定和不可修改的方式保存的东西(除非以某种方式解冻)。

“TeX:程序”(本质上就是你用 得到的程序texdoc tex)使用“冻结”一词的意义非常技术性。有些内部控制序列用户无法访问,也无法重新定义。一个常见的是“冻结\relax

另一个常见含义冻结适用于不再开发(但可能维护)的程序。TeX 3 就是这种情况。

我只会提到对 TeXbook 和 的引用babel,并添加一些有关 LaTeX 的内容。

TeXbook 中的一段话\hbox{...}想要强调的是,没有对粘连进行拉伸或收缩。如果这样做\setbox0=\hbox{a\hfill b},那么\box0将有“a”和“b”彼此相邻,因为的自然宽度是 0pt。但是,如果您这样做(或对于垂直框) \hfill,则可以解冻框寄存器的内容:移除一层装箱,并且框中包含的粘连将恢复其拉伸或收缩的能力。\unhbox0\unvbox

在数学公式中,括号内的内容(不是参数的分隔符)被视为子公式\hbox{...}之前类似,其被装箱,因此其内部的粘连不会参与拉伸或收缩。在装箱外部公式时,子公式本身将被视为普通原子。

手册babel中有冻结在关于连字的脚注中。TeX 仅在制作格式时才能加载连字模式。当您运行 时pdflatex file,您实际上是在运行

tex &pdflatex file

表示&“加载名为 的文件pdflatex.fmt”,其中包含 TeX 在某些明确定义的状态下的内存转储。脚注提到lccodes并且是关于一个相当技术性的问题。TeX 中的连字既依赖于模式,也依赖于\lccode大批. 在格式创建期间加载连字模式时数组的状态与摘要模式一起保存在内存转储中,并且不可修改。

还有其他冻结LaTeX 中的内容:\frozen@everymath\frozen@everydisplay,它们是原始标记寄存器\everymath和的内部别名\everydisplay。然后,LaTeX 将\everymath和重新分配\everydisplay为标准标记寄存器,以便有一个“安全”的起点:例如,在每个公式的开头执行这个宏非常重要。如果\frozen@everymath使用,包代码可能会修改寄存器并忘记添加重要的位。因此 LaTeX 有\check@mathfonts\everymath

\let\frozen@everymath\everymath
\newtoks\everymath
\frozen@everymath = {\check@mathfonts\the\everymath}

因此,做类似的事情\everymath{\displaystyle}(这只是一个例子,不要这样做)不会破坏重要的部分\check@mathfonts

最后,什么是冰冻的猫代码?没什么特别的。这只是一个习语,意思是当 TeX 读入输入时,会根据数组的当前状态为每个字符分配 catcode \catcode,并且无法修改(除非通过 再次对标记列表进行标记\scantokens)。

相关内容