超级跑跑名字怎么加空格求正解

你好比它 3个月前 已收到1个回答 举报

罘忘初心 3星

共回答了315个问题采纳率:92.7% 评论

针对下面的一些情况,需要有不同的策略:

pdfTeX + CJK,

一定要手动加

XeTeX + xeCJK,

不一定要加

pTeX/upTeX/pTeX-ng,

一定不要加

LuaTeX + LuaTeX-ja,

一定不要加

pTeX系列和LuaTeX就简单些,因为都遵循JIS标准,之所以不需要加空格的原因是:空格会被转换为一个glue,而这个glue通常都会比JIS中规定的要大不少,所以在“汉字-非汉字”之间插空格就会造成不当间距。其实这俩,对于空格的处理还是一如既往,如TeX82那样的行为,只是加了很好的

自动处理间距

功能。

XeTeX的不一定要加,是因为默认情况下,“汉字-非汉字”之间

默认

插入的是一个空格,所以蠢萌的例子其实不会有太大的视觉上的误差,但,如果我们配置一下,如:

那么出来的距离就不对,所以,不一定要加空格只是适用于默认情况。XeTeX处理空格的行为也和TeX82一样,只是可以设定一下char的class,然后在不同的class之间加入钩子,xeCJK就是这么插入间距的。但是由于XeTeX本身设计的原因,这类钩子其实不是太好用。

至于pdfTeX,万年不建议使用,但是呢,在各大学校(211啦,985啦)都是有一批坚定的用户的,这个时候,需要手动加空格,因为CJK包真不能处理这种间距。

为嘛pTeX系和LuaTeX能够进行精准的间距处理,因为在把文本处理为TeX内部链表之后,还会有额外的函数会遍历一遍链表检查一次间距,也就是说,要做两次。或者换句话说,xeCJK使用宏实现的东西,在pTeX系中用C实现了,在LuaTeX中使用Lua callback实现了。

那么问题来了,pTeX系是怎样判断什么是汉字,什么是非汉字呢?使用一个固定是函数,判断编码是否在某个区间?当然不是这样。TeX的大杀器,catcode就可以出场了。pTeX将TeX82的16个catcode扩展为了19个,其中有一个用来分配以代表汉字,而另一个代表谚文。

那么问题来了,TeX的catcode干啥的呢?catcode是丢给TeX的状态机用的东西。pTeX在读取文本文件的时候,会有上百种状态(我不知道啥叫状态机,你们自己理解去啊)。比如我们输入一段英文,换行,然后我们又打了一段英文,如:

这种情况输出的最后将是:

这里面的空格glue就是某种状态下,TeX在处理时自动输入的。

pTeX中多了一些状态,比如:

会出现结果:

而不是:

当然了,如果是非汉字的谚文,那么会自动加入一个空格glue的。

总结:空格在通常情况下会最终产生一个空格大小的glue,而在汉字处理的时候,如果手动加空格在某些场景下是会产生不太准确或者过大的间距,所以最好是不加空格,丢给TeX处理。如果手动加空格,也不是不可以,反正国内又不要求汉字与非汉字之间到底加多大的间距,所以在XeTeX等里面加空格也可以的啊。

扩展了内部状态和catcode之后,这种机制就快捷粗暴多了,要不我能不耐下心做pTeX-ng嘛。

18小时前

37
可能相似的问题

热门问题推荐

Copyright © 2024 微短问答 All rights reserved. 粤ICP备2021119249号 站务邮箱 service@wdace.com