CTeX-org / forum

A temporarily alternate forum of `bbs.ctex.org`
https://t.me/chinesetex
Apache License 2.0
210 stars 16 forks source link

xeCJKfntef 和 ulem 联用时影响 \textbf 的作用范围 #278

Open ChihSee-Hsie opened 1 year ago

ChihSee-Hsie commented 1 year ago

检查

编译环境

描述问题

在使用 ulem 宏包时,中文内容加上下划线不能正确折行。我参考 ctex-forum 上的例子,加入 xeCJKfntef,解决了这个问题。然而这个宏包带来了新的问题——有时我希望在划线的同时对句子中个别词汇加粗强调,这时会在 \uline{} 的花括号中联用 \textbf。在使用 xeCJKfntef 之前,这种用法如我的期望那样达成了既划线又加粗的效果,但加入之后,\textbf 命令就只能影响其后的第一个字了。我尝试将 \textbf{} 改成 {\bfseries },没有变化;使用英文,则 \textbf 效果正常;将 ulem 去掉,也能使 \textbf 正常工作,但这样不能达到我的排版需求。

最小工作示例(MWE)

\documentclass{article}
\usepackage{ulem}
\usepackage{ctex}
\usepackage{xeCJKfntef}

\begin{document}
\uline{这是\textbf{示例}文档}. \uline{this is minimal working example. \textbf{lorem} ipsum dolor sit amet. consectitur }
\end{document}

(用 XeLaTeX 编译后)输出

main.pdf

更改

上述的叙述是我不清楚 xeCJKfntef 的使用方式导致的,今重新叙述如右:使用 xeCJKfntef 后,在 \uline{} 中联用 \textbf 则后者的影响范围只限命令后紧接的一个字。我一开始说「将 ulem 去掉,也能使 \textbf 正常工作」是因为当时的 MWE 中用的划线命令是 \emph{},在没有 ulem 包时,这个命令等效于 \textit{},而在意大利体命令中联用粗体,其表现确实正常。

另外,使用了 xeCJKfntef 后,在 \uline 内部联用会出现问题的命令除了 \textbf 还有 \large、\textit 等,总之似乎这时所有在 \uline 内部联用的字体命令都只能影响到紧接着的一个字。

OsbertWang commented 1 year ago
\documentclass{article}
\usepackage{ctex}
\usepackage{xeCJKfntef}

\begin{document}
\CJKunderline{这是}\CJKunderline[textformat=\bfseries]{示例}\CJKunderline{文档}. \uline{this is \textbf{minimal working example}.}
\end{document}

这只是一种方案

Sophanatprime commented 1 year ago

参考以下几个测试:

\documentclass{article}
\usepackage{xeCJKfntef}
\begin{document}

\CJKunderline{\textbf{示的例}} 

\CJKunderline{这是\textbf{示a例b}文档} % 正确

\CJKunderline{这是\textbf{{{示例}}}文档} % 正确

\CJKunderline{这是{\bfseries {{示例}}}文档} % 正确

\CJKunderline{这是\textbf{\hbox{示例}}文档} % 正确

\CJKunderline{这是\textbf{\hbox{示例}的示例}文档}

\end{document}
image

可以基本判断出是 CJK and CJK 和 CJK and Boundary 的问题,而且还多 unbrace 了一层大括号(不确定是 xeCJKfntef 还是 ulem 的问题)。(好像加上中文标点也会出错)

现在多加两层括号可以达到效果。

Sophanatprime commented 1 year ago

处理标点符号时好像还有其它问题,比如 \CJKunderline{这是\textbf{“示例”}文档},但是也可以加两层括号解决。