罘忘初心 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小时前
猜你喜欢的问题
2天前1个回答
2天前1个回答
2天前1个回答
2天前2个回答
2天前1个回答
2天前2个回答
热门问题推荐
3个月前1个回答
2个月前1个回答
1个月前2个回答
4个月前2个回答
2个月前2个回答
1个月前3个回答
3个月前1个回答
1个月前3个回答
1个月前1个回答