Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

如何优雅地修改 xeCJK 在边缘处的标点挤压规则? #28

Closed
RuixiZhang42 opened this issue May 3, 2019 · 2 comments
Closed

Comments

@RuixiZhang42
Copy link
Member

描述问题

强迫症一下,xeCJK 宏包对边缘处(例如:行首,行末)的标点挤压算法过于「激进」。例如,若句号出现在行末而后面仍有文本,那么这个句号字形右侧的空白将全部被挤压掉。我在想能不能保留半角宽,类似于《日本工业标准》,好处是密排汉字不至于错位太严重,要错位也是错位半个字。

最小工作示例(MWE)

% !TeX program = XeLaTeX
\documentclass[linespread=1.25]{ctexart}
\usepackage{xcolor}
\setmainfont{SourceHanSerifSC-Regular.otf}[
  Script   = CJK Ideographic,
  Language = Chinese Simplified
]
\setCJKmainfont{SourceHanSerifSC-Regular.otf}[
  Script   = CJK Ideographic,
  Language = Chinese Simplified
]
\newcommand*\ideographicbaseline{-0.12}
\newcommand*\cbox[1]{\fbox{\rule[\ideographicbaseline\ccwd]{0pt}{\ccwd}\rule{#1\ccwd}{0pt}}}
\newcommand\drawgrid{%
  \setbox0\vbox{%
    \fboxrule0.05pt\fboxsep-\fboxrule
    \color{red}%
    \hbox{\cbox{1}\cbox{1}\cbox{0.5}\cbox{0.5}\cbox{1}\cbox{1}\cbox{1}\cbox{1}\cbox{1}\cbox{1}\cbox{1}\cbox{0.5}\cbox{0.5}}%
    \hbox{\cbox{1}\cbox{1}\cbox{1}\cbox{1}\cbox{1}\cbox{1}\cbox{1}\cbox{1}\cbox{1}\cbox{1}\cbox{0.5}\cbox{0.5}}%
    \hbox{\cbox{1}\cbox{1}\cbox{1}\cbox{1}\cbox{1}\cbox{1}\cbox{1}\cbox{1}\cbox{1}\cbox{1}\cbox{1}}%
    \hbox{\cbox{1}\cbox{1}\cbox{1}\cbox{1}\cbox{1}\cbox{1}\cbox{1}\cbox{1}\cbox{1}\cbox{1}\cbox{1}}%
    \hbox{\cbox{1}\cbox{1}\cbox{1}\cbox{1}\cbox{1}\cbox{1}\cbox{1}\cbox{1}\cbox{1}\cbox{1}\cbox{1}}%
    \hbox{\cbox{1}\cbox{1}\cbox{1}\cbox{1}\cbox{1}\cbox{1}\cbox{1}\cbox{1}\cbox{1}\cbox{1}\cbox{1}}%
    \color{blue}%
    \hbox{\cbox{1}\cbox{1}\cbox{0.5}\cbox{0.5}\cbox{1}\cbox{1}\cbox{1}\cbox{1}\cbox{1}\cbox{1}\cbox{1}\cbox{0.5}\cbox{0.5}}%
    \hbox{\cbox{1}\cbox{1}\cbox{1}\cbox{1}\cbox{1}\cbox{1}\cbox{1}\cbox{1}\cbox{1}\cbox{1}\cbox{0.5}\cbox{0.5}}%
    \hbox{\cbox{1}\cbox{1}\cbox{1}\cbox{1}\cbox{1}\cbox{1}\cbox{1}\cbox{1}\cbox{1}\cbox{1}\cbox{1}}%
    \hbox{\cbox{1}\cbox{1}\cbox{1}\cbox{1}\cbox{1}\cbox{1}\cbox{1}\cbox{1}\cbox{1}\cbox{1}\cbox{1}}%
  }%
  \leavevmode\smash{\copy0}%
}
\usepackage[width=115.5bp]{geometry}
\begin{document}
“《千字文》第一句?”\par
该句号「挤压太多」。注意前两行都错位了!\par
……这个……还行?\par
……这个就不了……尴尬。

\xeCJKsetup{xeCJKactive=false}

\hskip-5.25bp\relax\hskip-5.25bp\relax 《千字文》第一句?\hskip-5.25bp\relax\hskip-5.25bp\relax \par
该句号「挤压太多」\hskip-5.25bp\relax\hskip-5.25bp\relax 这样做得到吗?

\parindent0pt\relax
\drawgrid
\end{document}

(用 XeLaTeX 编译后)输出

grid

其实……非常希望蓝色网络的那个效果是 xeCJK 的缺省设置……

@qinglee
Copy link
Member

qinglee commented May 4, 2019

\xeCJKEditPunctStyle{quanjiao}{bound-punct-ratio=0.5}

或者

\xeCJKsetup{PunctBoundWidth=0.5em}

@RuixiZhang42
Copy link
Member Author

@qinglee 感谢提供解决思路,记得曾经试过 \xeCJKEditPunctStyle{quanjiao}{bound-punct-ratio=0.5},但是效果不全,\xeCJKsetup{PunctBoundWidth=0.5\ccwd} 的效果也不全(我文档里的 em 被调整过,\ccwd 是 CTeX 文档类的命令)。

更准确地说,以上两种方法只能「正确地」处理 MWE 中 」。 这一行行末的问题,对于行首的双引号、行末的省略号仍然压缩全部空白(行首这个问题会不会是个 bug?)。我觉得我的范例比较有代表性,兼顾了行首、行末出现「全角字框半角字面」标点的情形,还囊括了「全角字框全角字面」的标点(这个包括省略号、破折号、全角浪线),后者的挤压规则当然会不一样(如果还要再加一类,那就是居中对齐的间隔号,挤压时理想只挤压 0.25\ccwd)。

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

No branches or pull requests

3 participants