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^^%