首先,在对「CJK文字」进行下划线时,建议使用xeCJKfntef宏包来实现,否则会出现无法正确换行的情况。
原生的xeCJKfntef的功能

\documentclass[fontset=fandol,12pt]{ctexart}
\usepackage{xeCJKfntef}
\setlength{\parindent}{0pt}
\begin{document}
\CJKunderline{史记赵世家}
\CJKunderline*{史记赵世家}
\CJKunderwave{史记赵世家}
\CJKunderwave*{史记赵世家}
\CJKunderline{史记,赵世家}
\CJKunderline*{史记,赵世家}
\CJKunderline-{史}%
\CJKunderline-{记}%
,%
\CJKunderline-{赵}%
\CJKunderline-{世}%
\CJKunderline-{家}%
\CJKunderwave{史记,赵世家}
\CJKunderwave*{史记,赵世家}
\CJKunderwave-{史}%
\CJKunderwave-{记}%
,%
\CJKunderwave-{赵}%
\CJKunderwave-{世}%
\CJKunderwave-{家}%
\end{document}
另外,这种「逐字」需要下划线和下划波浪线的实际用途是什么(?)一般波浪线和下划线很少需要逐字添加绘制(?)
一个不成功的探索
最后,要想调好不借助现有功能是比较困难的:
- 标点压缩
- 标点禁则
- 字符压缩
每个CJK字符最终呈现的宽度是并不统一的,我在xeCJkfntef的框架下做了如下修改,也有瑕疵...
\documentclass[fontset=fandol,12pt]{ctexart}
\usepackage{xeCJKfntef}
\usepackage{zhlipsum}
\setlength{\parindent}{0pt}
\ExplSyntaxOn
%Line 5716~5733
% \NewDocumentCommand \CJKunderline { s t- s o }
% {
% \xeCJK_ulem_group_begin:
% \xeCJK_fntef_boot:nnNNNn { underline } { uline } #1#2#3 {#4}
% \xeCJK_fntef_initial:nnn
% { \l__xeCJK_uline_depth_tl }
% { \l__xeCJK_uline_sep_tl }
% {
% \l__xeCJK_uline_format_tl
% \tex_vrule:D
% height \dim_eval:n { \l__xeCJK_uline_thickness_tl }
% depth \c_zero_dim
% width .2em
% }
% \xeCJK_ulem_on:n
% }
\RenewDocumentCommand \CJKunderline { s t- s o }
{
\xeCJK_ulem_group_begin:
\xeCJK_fntef_boot:nnNNNn { underline } { uline } #1#2#3 {#4}
\xeCJK_fntef_initial:nnn{ \l__xeCJK_uline_depth_tl }{ \l__xeCJK_uline_sep_tl }{%
\l__xeCJK_uline_format_tl
\tex_vrule:D height \dim_eval:n { \l__xeCJK_uline_thickness_tl } depth \c_zero_dim width .95em\hskip1pt}%
\xeCJK_ulem_on:n
}
\ExplSyntaxOff
\xeCJKsetup{ underwave = { symbol = \sixly \hskip1pt plus 1fill minus 1fill\char 58\hskip0pt plus 1fill minus 1fill\char 58\hskip1pt plus 1fill minus 1fill\relax } }
\begin{document}
\CJKunderline{史记赵世家}
\CJKunderline*{史记赵世家}
\CJKunderwave{史记赵世家}
\CJKunderwave*{史记赵世家}
\CJKunderline{史记,赵世家}
\CJKunderline*{史记,赵世家}
\CJKunderwave{史记,赵世家}
\CJKunderwave*{史记,赵世家}
\end{document}
这里的刚性宽度控制在字更多的时候很容易「歪」,同时如果遇到压缩的标点符号/换行等特殊情况,也是难以正常工作的....






















问 如何实现符合中文字距的下划线和下划波浪线?