使用 xeCJK 时中文标点出错
HardGraphite opened this issue · 5 comments
编译下面这段代码
\documentclass{standalone}
\usepackage{xeCJK}
\begin{document}
``你好'' -- CJK
\end{document}
期望的效果是
“你好” – CJK
而实际得到的结果是
``你好'' -- CJK
可以看到,引号和 dash 都不正确。
使用 TeX Live,并且一直保持更新。所使用的 XeLaTeX 版本是
XeTeX 3.141592653-2.6-0.999995 (TeX Live 2023/Arch Linux)
kpathsea version 6.3.5
今年3月还没有这种现象,但最近重新编译当时的文档发现了这个问题。期间没有排版过中文,所以不确定是何时引入的这个问题。
# cat test.tex
\documentclass{standalone}
\usepackage{xeCJK}
\begin{document}
``你好'' -- CJK
\end{document}
# xelatex test.tex
This is XeTeX, Version 3.141592653-2.6-0.999995 (TeX Live 2023/Arch Linux) (preloaded format=xelatex)
restricted \write18 enabled.
entering extended mode
(./test.tex
LaTeX2e <2022-11-01> patch level 1
L3 programming layer <2023-02-22>
(/usr/share/texmf-dist/tex/latex/standalone/standalone.cls
Document Class: standalone 2022/10/10 v1.3b Class to compile TeX sub-files stan
dalone
(/usr/share/texmf-dist/tex/latex/tools/shellesc.sty)
(/usr/share/texmf-dist/tex/generic/iftex/ifluatex.sty
(/usr/share/texmf-dist/tex/generic/iftex/iftex.sty))
(/usr/share/texmf-dist/tex/latex/xkeyval/xkeyval.sty
(/usr/share/texmf-dist/tex/generic/xkeyval/xkeyval.tex
(/usr/share/texmf-dist/tex/generic/xkeyval/xkvutils.tex
(/usr/share/texmf-dist/tex/generic/xkeyval/keyval.tex))))
(/usr/share/texmf-dist/tex/latex/standalone/standalone.cfg)
(/usr/share/texmf-dist/tex/latex/base/article.cls
Document Class: article 2022/07/02 v1.4n Standard LaTeX document class
(/usr/share/texmf-dist/tex/latex/base/size10.clo)))
(/usr/share/texmf-dist/tex/xelatex/xecjk/xeCJK.sty
(/usr/share/texmf-dist/tex/latex/l3kernel/expl3.sty
(/usr/share/texmf-dist/tex/latex/l3backend/l3backend-xetex.def))
(/usr/share/texmf-dist/tex/latex/ctex/ctexhook.sty)
(/usr/share/texmf-dist/tex/latex/l3packages/xtemplate/xtemplate.sty)
(/usr/share/texmf-dist/tex/latex/fontspec/fontspec.sty
(/usr/share/texmf-dist/tex/latex/l3packages/xparse/xparse.sty)
(/usr/share/texmf-dist/tex/latex/fontspec/fontspec-xetex.sty
(/usr/share/texmf-dist/tex/latex/base/fontenc.sty)
(/usr/share/texmf-dist/tex/latex/fontspec/fontspec.cfg)))
(/usr/share/texmf-dist/tex/xelatex/xecjk/xeCJK.cfg))
Package xeCJK Warning: Fandol is being set as the default font for CJK text.
(xeCJK) Please make sure it has been properly installed.
Package fontspec Warning: Font "FandolSong-Regular" does not contain requested
(fontspec) Script "CJK".
No file test.aux.
(/usr/share/texmf-dist/tex/latex/base/ts1cmr.fd) [1] (./test.aux) )
(see the transcript file for additional information)
Output written on test.pdf (1 page).
Transcript written on test.log.
你试试编译这个稍微简化的例子,然后上传 log 文件呢?
\documentclass{article}
\usepackage{xeCJK}
\showboxbreadth=\maxdimen
\showboxdepth=\maxdimen
\begin{document}
\setbox0=\hbox{``你好'' -- CJK}
\showbox0
\box0
\end{document}
甚至,不加载 xecjk、使用 xelatex/pdflatex 时,问题能复现吗
\documentclass{article}
\begin{document}
``Hi'' -- Jam
\end{document}
我本地 \showbox0
对应的 log 内容是
> \box0=
\hbox(7.7+1.62999)x61.24
.\TU/lmr/m/n/10 “
.\TU/FandolSong-Regular(0)/m/n/10 你
.\glue 0.0 plus 0.96002
.\TU/FandolSong-Regular(0)/m/n/10 好
.\TU/lmr/m/n/10 ”
.\glue 3.33 plus 1.665 minus 1.11
.\TU/lmr/m/n/10 –
.\glue 3.33 plus 1.665 minus 1.11
.\TU/lmr/m/n/10 CJK
.\kern -0.0002
.\kern 0.0002
我本地的 texlive 2023 和 overleaf 上的 texlive 2022 得到的都是
我是 LaTeX2e 2023-06-01 patch level 1, overleaf 上的 texlive 2022 镜像里是 LaTeX2e 2022-06-01 patch level 5,你的是 LaTeX2e 2022-11-01 patch level 1,刚好夹在两者中间。虽然不排除问题出自中间的某个版本组合,很大可能仍然是你本地的安装/配置有问题。
用 pdflatex 编译就正常了。看来是 xelatex 这边的问题。
我理解(脑补)的是,
\documentclass{article}
\begin{document}
``Hi'' -- Jam
\end{document}
- 用 pdflatex 编译,结果正常
- 用 xelatex 编译,标点出错
于是这和 xecjk 无关,所以关闭 issue。
PS: 西文标点的映射关系,在 xetex 下储存在 TECKit 映射文件里。例如,默认的配置 mapping=tex-text
(见 texdoc xetex-reference
)调用文件(真正调用的是与 tex-text.map
对应的二进制文件 tex-text.tec
,由 teckit_compile
程序生成)
kpsewhich --format="misc fonts" tex-text.map
tex-text.map
通常位于 TEXMFDIST/fonts/misc/xetex/fontmapping/base/tex-text.map
。tex-text.map
中,涉及当前 issue 的映射关系是
; ligatures from Knuth's original CMR fonts
U+002D U+002D <> U+2013 ; -- -> en dash
U+002D U+002D U+002D <> U+2014 ; --- -> em dash
U+0027 <> U+2019 ; ' -> right single quote
U+0027 U+0027 <> U+201D ; '' -> right double quote
U+0022 > U+201D ; " -> right double quote
U+0060 <> U+2018 ; ` -> left single quote
U+0060 U+0060 <> U+201C ; `` -> left double quote