ASCII 代码点 9 编码水平制表符。那么,为什么编写以下手稿
x\char9y\bye
使用 TeX 版本 3.14159265(TeX Live 2017)生成一个 dvi 文件,其正文由三个字母组成
y
(x
,,Greek Capital Letter Psi
)y
而不是三个字母
x y
(x
,,space
)y
?
答案1
没什么奇怪的:\char<8 bit number>
印刷当前字体中的字符槽<8 bit number>
。它不会生成字符标记,正如您所认为的那样。
如果您想要一个制表符标记及其当前类别代码,请键入^^I
或^^09
,其中^
必须具有类别代码 7。
使用 XeTeX 和 LuaTeX,您可以使用\Uchar
可以可扩展生成一个字符标记,因此\Uchar 9
将满足您的需要。XeTeX 还提供了\Ucharcat
使用给定数字和给定类别代码生成字符标记的功能:例如
\Ucharcat 9 10
与标准类别代码相同\Uchar 9
。并非所有类别代码都可用,特别是 13(活动)不可用。LuaTeX\Ucharcat
中未定义该原语,但可以对其进行模拟(请参阅ucharcat.sty
LaTeX 包)。
答案2
这是关于字体编码的:Knuth 开发的标准 OT1 字体编码使用全部字体中的插槽,而不仅仅是您通常认为可打印的插槽。最著名的是,\char0
在此编码中使用,并用于导致某些 PDF 查看器出现问题。
随着 Unicode 的采用,人们开始认为存在一种“通用”编码,但这根本不适用于旧材料。字体有很多种编码,既有“标准”的,也有完全非标准的(比如 pifonts)。
你必须记住的是,输入代码点不必与输出代码点匹配:关键是它节目正确的信息。也许最容易理解的是\alpha
:显然输出(单个字形)与输入不同,并且在 Latin-1 等“经典”编码中没有 alpha。
查看(8 位)字体的完整字体表的最简单方法可能是使用 LaTeX 包fonttable
:
\documentclass{article}
\usepackage{fonttable}
\begin{document}
\fonttable{cmr10}
\end{document}
答案3
其他(优秀)答案解决了\char
如何使用输入文字水平制表符的问题^^
问题,但没有提到为什么TeX 将制表符视为空格。诚然,这与您的问题没有直接关系,但它可能有助于解释 TeX 的行为。
默认情况下,制表符的类别代码为 10(空格)。类别代码为 10 的字符有一个有趣的方面,即当 TeX 在输入中遇到这些字符(而它没有忽略空格)时,它会生成一个空格标记,该标记的类别代码为 10,字符代码为 32(ASCII 空格)。实际上,TeX 对制表符一无所知。就它而言,由于字符 9 的类别代码为 10,因此它只是一个空格。