TeXBook 中的“^”字形

TeXBook 中的“^”字形

TeX,纯 TeX,在 Don Knuth 的 Texbook 源代码中,在不同的命令序列和文本片段中使用了 ^。

TeX 基元中是否有特殊含义^,在纯 TeX 中,它是否是 Knuth 在 TeXbook 专有输入文件中定义的宏的一部分?

输出似乎并未暴露预期用途。

答案1

manmac用于处理 TeXbook 的格式以^一种非常特殊的方式定义。

在标准设置下,^alone 是上标的标记,并且当其自身跟随时也具有非常特殊的行为,请参阅未转义的脱字符或帽子字符“ ^ ”的作用是什么?

但是,manmac.tex使其^成为一个活跃角色,并且 Knuth 使用它进行索引:

% Indexing macros
\newif\ifproofmode
\proofmodetrue % this should be false when making camera-ready copy
\newwrite\inx
\immediate\openout\inx=index % file for index reminders
\newif\ifsilent
\def\specialhat{\ifmmode\def\next{^}\else\let\next=\beginxref\fi\next}
\def\beginxref{\futurelet\next\beginxrefswitch}
\def\beginxrefswitch{\ifx\next\specialhat\let\next=\silentxref
  \else\silentfalse\let\next=\xref\fi \next}
\catcode`\^=\active \let ^=\specialhat
\def\silentxref^{\silenttrue\xref}

我们来看一下来自 TeXbook 源代码的一些调用。

Another noteworthy characteristic of this manual is that it doesn't
always tell the ^{truth}.

Let's keep the name \TeX\
for the language described here, since it is so much better, and since
it is not going to change any more. ^^{TeX78}

medium that doesn't allow lowering of the `E', is to type `^|TeX|'. Then

The solution is to type \thinspace|'\thinspace''|, which
produces '\thinspace'' as desired.^^|\thinspace|

片段 1 中有一个单词既被索引又被打印出来;片段 2 中有一个单词被索引但未被打印出来。片段 3 和片段 4 类似,但该词条被逐字存储在索引辅助文件中。

请注意,在 TeXbook 中,|...|总是用作逐字打印术语的简写。

该字符^被激活并且其含义与 相同\specialhat

如果在数学模式下发现该字符,则标准类别代码^会传送到主输入流,从而能够使用标准符号的上标。

在文本模式下情况有所不同,因为\beginxref已传递。

\beginxref宏用 检查下一个标记\futurelet。如果下一个标记是^\silentxref则传递,否则\ifsilent设置为 false 并\xref传递。

正如你所看到的,\silentxref吞噬下一个^并且做到了\silenttrue\xref

描述\xref会很长,而且与您要寻找的描述不相关。

需要注意的一个细微之处。^替换文本中的\specialhat类别代码发生变化,因此它是正常的“上标”字符(替换文本中的标记在定义时“冻结”)。^的参数文本中的\silentxref出现在类别代码更改之后,因此在 展开时它应该具有类别代码 13 (这通常已通过已调用 的\silentxref事实来确保)。\silentxref


只是为了玩一玩,这里有一个expl3代码版本(只是宏,而不是用于写入辅助索引文件的设置)

\bool_new:N \l_manmac_silent_bool
\cs_new_protected:Nn \manmac_specialhat:
 {
  \mode_if_math:TF { ^ } { \manmac_beginxref: }
 }
\cs_new_protected:Nn \manmac_beginxref:
 {
  \peek_charcode_remove:NTF ^
   {
    \bool_set_true:N \l_manmac_silent_bool \manmac_xref:
   }
   {
    \bool_set_false:N \l_manmac_silent_bool \manmac_xref:
   }
 }
\char_set_active_eq:NN ^ \manmac_specialhat:
\char_set_catcode_active:N ^

我相信这段代码使得上面描述的操作更加清晰,因为\next可以避免像几次赋值这样的细节。

这是\let\next相同宏的免费版本

\newif\ifsilent
\def\specialhat{%
  \ifmmode
    \expandafter^%
  \else
    \expandafter\beginxref
  \fi
}
\def\beginxref{\futurelet\next\beginxrefswitch}
\def\beginxrefswitch{%
  \ifx\next\specialhat
    \expandafter\silentxref
  \else
    \silentfalse\expandafter\xref
  \fi
}
\catcode`\^=\active \let ^=\specialhat
\def\silentxref^{\silenttrue\xref}

答案2

如果您指的是在and中使用^like ,这里是 manmac.tex 中的相关部分^^{TeX78}^^|\copyright|

% Indexing macros
\newif\ifproofmode
\proofmodetrue % this should be false when making camera-ready copy
\newwrite\inx
\immediate\openout\inx=index % file for index reminders
\newif\ifsilent
\def\specialhat{\ifmmode\def\next{^}\else\let\next=\beginxref\fi\next}
\def\beginxref{\futurelet\next\beginxrefswitch}
\def\beginxrefswitch{\ifx\next\specialhat\let\next=\silentxref
  \else\silentfalse\let\next=\xref\fi \next}
\catcode`\^=\active \let ^=\specialhat
\def\silentxref^{\silenttrue\xref}

基本上就是定义\specialhat然后执行\let^=\specialhat。这是他为索引建立一个干净的参考系统的方式(^^{foo}我猜他似乎更喜欢符号,而不是说\index{..}\index|..|)。

然后他定义了\xref哪个是实际的功能。^只是的“公共接口” \xref

\def\marginstyle{\vrule height6pt depth2pt width\z@ \sevenrm}

\chardef\bslash=`\\
\def\xref{\futurelet\next\xrefswitch}
\def\xrefswitch{\begingroup
  \ifx\next|\aftergroup\vxref % case 1 or 2, |arg| or |\arg|
  \else\ifx\next\<\aftergroup\anglexref % case 3, "\<arg>" means angle brackets
    \else\aftergroup\normalxref \fi\fi\endgroup} % case 0, "{arg}"
\def\vxref|{\catcode`\\=\active \futurelet\next\vxrefswitch}
\def\vxrefswitch#1|{\catcode`\\=0
  \ifx\next\empty\def\xreftype{2}%
    \def\next{{\tt\bslash\text}}% type 2, |\arg|
  \else\def\xreftype{1}\def\next{{\tt\text}}\fi % type 1, |arg|
  \edef\text{#1}\makexref}
{\catcode`\|=0 \catcode`\\=\active |gdef\{}}
\def\anglexref\<#1>{\def\xreftype{3}\def\text{#1}%
  \def\next{\<\text>}\makexref}
\def\normalxref#1{\def\xreftype{0}\def\text{#1}\let\next=\text\makexref}
\def\makexref{\ifproofmode\insert\margin{\hbox{\marginstyle\text}}%
   \xdef\writeit{\write\inx{\text\space!\xreftype\space
     \noexpand\number\pageno.}}\writeit
   \else\ifhmode\kern\z@\fi\fi
  \ifsilent\ignorespaces\else\next\fi}
% the \insert (which is done in proofmode only) suppresses hyphenation,
% so the \kern\z@ is put in to give the same effect in non-proofmode.

我不是专家,其他人可能会提供更好的细节和理由。

答案3

^字符用于指示切换到上标排版,或用于表示字符替换方法(更好的移位方法),例如

^^+将被字符 替换k,因为k+在普通 ASCII 码中相差 64 位,所以可以说

\vs^^+ip 8cm代替\vskip 8cm

同样,^^k将被替换+,但在我看来,这很难阅读。

^^代码称为字符的内部表示。

这是一种奇怪的说法Hello World(用TeX或编译pdfTeX

H^^%^^,^^,^^/  W^^/^^2^^,^^$
\^^"^^9^^%

相关内容