Comments (14)
关于将全角标点切成半宽
以简中句号为例,主要就是两种思路:
- 用
\hbox to0.5em{。\hss}
,印象中babel
的韩文支持就是这么做的; - 用
。\vrule width-0.5em\relax
,是xeCJK
的做法。
没有「绝对正确」的做法,看你想在「horizontal list」里是加个盒子呢还是留字符本身,只要注意em
是否跟汉字大小一致即可。我没试过第1种思路,但知道第2种思路可以结合rule、glue、penalty花式玩法做出「标点悬挂」的效果。
关于加「铅空」
应该用\hskip0.5em minus 0.5em
(那个plus ...
就匪夷所思了)。
关于用\discretionary
是「完全错误」的思路:在显式的「discretionary node」处断行是要罚\hyphenpenalty
的。正确的思路应该是在铅空\hskip
处的「glue node」断行,不罚penalty。
关于\xdef\punct@before{...}
两个标点可能都已经隔了十万八千里了,如。字字字字「
,还要走一遍\ifin@
和\unskip
,怕是不妥吧?
from forum.
应该用
\hskip0.5em minus 0.5em
(那个plus...
就匪夷所思了)。
呃的确是,大概我写这里的时候没太用脑子(
不过似乎不太该全部挤压、我JFM设的是.25em
(的确、.015
太小了)
from forum.
是「完全错误」的思路:在显式的「discretionary node」处断行是要罚
\hyphenpenalty
的。正确的思路应该是在铅空\hskip
处的「glue node」断行,不罚penalty。
我再去仔细看看TeXbook(地铁上拍脑袋想的、怕是背单词背傻了
from forum.
两个标点可能都已经隔了十万八千里了,如
。字字字字「
,还要走一遍\ifin@
和\unskip
,怕是不妥吧?
我也觉得不太好、但当时觉得反正\unskip
没有副作用就放这了。我再想想、比如用\aftergroup
判断、如果是汉字就把它定义为nil
?
而且我看实现,这个clist的判断是用宏的机制、不是一个一个捕获判断、也、不是特别慢(?
\def\in@#1#2%
{%
\begingroup
\def\in@@##1#1{}%
\toks@\expandafter{\in@@#2{}{}#1}%
\edef\in@@{\the\toks@}%
\expandafter\endgroup
\ifx\in@@\@empty
\in@false
\else
\in@true \fi
}
\newif\ifin@
(是我写不出来的
from forum.
(谢谢您!
from forum.
不过似乎不太该全部挤压、我JFM设的是
.25em
(的确、.015
太小了)
可能是对minus 0.5em
有误解吧?并不是非得全部挤压,而是「如果此行太长、需要挤压时,最多能把加上的二分铅空全部挤掉」。在实际文档中,需要挤掉二分铅空的0.25em
或以上的场合太罕见了(注意,是同一行的每个标点的铅空都要被耗掉50%或以上的压缩量)。简中排版最常见的「此行过长」基本上就是「多了一个可以行末半宽的避头标点」,总挤压量也就0.5em,要分散到行內数个标点的铅空是绰绰有余的(如果行內还有西文,那西文空格也可以吸收一些总挤压量)。总之,耗掉收缩量0.5em的50%以下是常见情况,TeX评判该行的badness也就介于0到12,属于「decent」,算不上「tight」。
而minus 0.25em
无非大大减少了可压缩的总量,当每个铅空要被耗掉0.125em或以上时,TeX就会把该行归类为「tight」,最后效果是TeX更倾向于「推出」(即拉大此行字距,把过长的内容往下一行放)而不是「挤进」。
from forum.
嗯,我之前设成.25em
是因为实在不喜欢被挤压成只有只有一个标点宽度的情况。
不过似乎(又)是我TeXbook看的不够仔细了,这么看来还是.5em
看上去合理很多(
from forum.
另外,我昨天晚上去看了看\discretionary
的描述。发现了在此段行惩罚值是可以通过\hyphenpenalty
以及\exhyphenpenalty
「改变」的。我在想是不是可以在标点定义包一个分组(如\[begin/end]group
)、然后局部改变这两个值使其分别为0
、也就不会影响西文的设置。
至于为什么对这个discretionary node这么执着,因为我觉得用它可以控制TeX在断行时的行为。如繁体中文句号。
后接一个「
号,句号在行末就不该做行末半角而应该保持全宽,如此就需要断行时在其后插入一个.25em
宽的铅空;同时如果不在此处断行后接的应是一个.75em
的铅空。如果不用discretionary node就非常难实现(TeX总是会在第一个glue处断行、因为其后的glue是discardable的?)。同时也能很简单地实现标点悬挂等等。
(大概也能避免某些奇怪的东西跑到下一行去)[迫真]
from forum.
至于「即使标点相隔汉字也需要走一遍\unskip
」的问题,我还没什么想法(
我去今晚去看看aro-bend,看看能不能找到什么灵感(哪里有什么灵感可言)。
from forum.
另外,我昨天晚上去看了看
\discretionary
的描述。发现了在此段行惩罚值是可以通过\hyphenpenalty
以及\exhyphenpenalty
「改变」的。我在想是不是可以在标点定义包一个分组(如\[begin/end]group
)、然后局部改变这两个值使其分别为0
、也就不会影响西文的设置。
不可行。TeX是读取整个段落之后再分行的,所以在分组里赋的零值是无效的。段落末尾(\par
之前)的值才是用于整段分行的值。
至于为什么对这个discretionary node这么执着,因为我觉得用它可以控制TeX在断行时的行为。如繁体中文句号
。
后接一个「
号,句号在行末就不该做行末半角而应该保持全宽,如此就需要断行时在其后插入一个.25em
宽的铅空;同时如果不在此处断行后接的应是一个.75em
的铅空。如果不用discretionary node就非常难实现(TeX总是会在第一个glue处断行、因为其后的glue是discardable的?)。同时也能很简单地实现标点悬挂等等。
是的,繁中句号在行末不应该半宽(准确地说是不应该丢掉后面的四分空)。但你去看港台好多Adobe InDesign排的书,那叫惨不忍睹啊。想留很简单,要善用penalty,以字。「字
为例:
字\nobreak \hskip0.25em minus 0.25em \vrule width-0.25em\relax
。\vrule width-0.25em\relax \nobreak \hskip0.25em minus 0.25em \allowbreak
\vrule width-0.5em\relax 「\nobreak 字
from forum.
不可行。TeX是读取整个段落之后再分行的,所以在分组里赋的零值是无效的。段落末尾(
\par
之前)的值才是用于整段分行的值。
啊、你说的对(
我得再想想(麻烦了
from forum.
字\nobreak \hskip0.25em minus 0.25em \vrule width-0.25em\relax 。\vrule width-0.25em\relax \nobreak \hskip0.25em minus 0.25em \allowbreak \vrule width-0.5em\relax 「\nobreak 字
我来按我的方法(切的)改一改!
然后想想那个判断的问题怎么解决
from forum.
啊,我想起来我为啥弃用\hbox to...
的方式切全角了,是因为会改变标点在自然状态(不伸展不压缩)下所占据的宽度。
假设1em
等于1003sp
,以这个不实际的值为例方便说明情况。用\hbox to0.5em{。\hss}
切出来的盒子,宽501sp
,后面再补\hskip0.5em minus 0.5em
自然宽度同样是501sp
,加在一起相当于句号少了1sp宽。繁中式的句号盒子宽501sp
,前后补的四分空各宽250sp
,加在一起相当于句号少了2sp宽。此分析适应于所有除4余3的整数sp汉字尺寸。
相反,用\vrule
去配合\hskip
,能够保证正负刚好抵消,不增添不减少1sp的宽度。
from forum.
啊,我想起来我为啥弃用
\hbox to...
的方式切全角了,是因为会改变标点在自然状态(不伸展不压缩)下所占据的宽度。假设
1em
等于1003sp
,以这个不实际的值为例方便说明情况。用\hbox to0.5em{。\hss}
切出来的盒子,宽501sp
,后面再补\hskip0.5em minus 0.5em
自然宽度同样是501sp
,加在一起相当于句号少了1sp宽。繁中式的句号盒子宽501sp
,前后补的四分空各宽250sp
,加在一起相当于句号少了2sp宽。此分析适应于所有除4余3的整数sp汉字尺寸。相反,用
\vrule
去配合\hskip
,能够保证正负刚好抵消,不增添不减少1sp的宽度。
(原来这里还有个坑)
话说1sp应该肉眼不可见吧(表达不太严谨),但毕竟有更好的方法。
所以说这个思路想来好像是不太好的,而且我也没想好比较好的方法来判断标点是否紧挨。
还是kern加rule的方法好(
from forum.
Related Issues (20)
- error
- 超页面问题 HOT 2
- 如何让“摘要”出现在目录中,但不要显示后面的“......页码” HOT 10
- 应用需求:识别传递的参数中 `{}` 的数量 HOT 6
- 空白页控制问题 HOT 10
- 命令可选参数键值的值为 LaTeX3 的 cs 的可行性 HOT 3
- 关于 `ntheorem` 和 `amsthm` 中的 `\qedhere` 优化问题 HOT 5
- 给特殊符号设置xeCJKsetcharclass,并打开CJKmath,特殊符号仍不能直接用于数学模式 HOT 9
- `\keys_define:nn` 中 `.initial:n` 失效的问题 HOT 15
- `xampl.bib` 无法用于 `gbt7714` 包和 `natbib` 的 `authoryear` 模式吗? HOT 8
- 安装ctex时报错 HOT 1
- 如何在每一章的指定位置插入边注 HOT 8
- \newtheorem和amsthm冲突问题 HOT 7
- 如何优雅的让行内公式换行? HOT 4
- datetime2宏包如何在使用xelatex编译时取当前详细时间(秒数+时区)并转换为东八区 HOT 13
- 采用 listings 宏包排代码,代码里的汉字之间有空格 HOT 2
- Ctex如何设置页边距,另外,类似论文中的项目资助的脚注 如何实现? HOT 5
- 我想把公式编号连带编号两边的括号 的字体 都设置为Times New Roman,但 左边那个括号的字体就是改不了 HOT 6
- 求救帖,被一个英文文章翻译任务逼疯了,求大佬协助完成一个模板,我完成了大概有6成,剩下的搞不定了 HOT 6
- 关于ulem包与xeCJKfntef包连用hyperref包进行超链接下划线的疑惑 HOT 11
Recommend Projects
-
React
A declarative, efficient, and flexible JavaScript library for building user interfaces.
-
Vue.js
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
-
Typescript
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
-
TensorFlow
An Open Source Machine Learning Framework for Everyone
-
Django
The Web framework for perfectionists with deadlines.
-
Laravel
A PHP framework for web artisans
-
D3
Bring data to life with SVG, Canvas and HTML. 📊📈🎉
-
Recommend Topics
-
javascript
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
-
web
Some thing interesting about web. New door for the world.
-
server
A server is a program made to process requests and deliver data to clients.
-
Machine learning
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
-
Visualization
Some thing interesting about visualization, use data art
-
Game
Some thing interesting about game, make everyone happy.
Recommend Org
-
Facebook
We are working to build community through open source technology. NB: members must have two-factor auth.
-
Microsoft
Open source projects and samples from Microsoft.
-
Google
Google ❤️ Open Source for everyone.
-
Alibaba
Alibaba Open Source for everyone
-
D3
Data-Driven Documents codes.
-
Tencent
China tencent open source team.
from forum.