CTeX-org / ctex-kit

Macro Packages and Scripts for Chinese TeX users
965 stars 124 forks source link

使用 xeCJK 时中文标点出错 #667

Closed HardGraphite closed 1 year ago

HardGraphite commented 1 year ago

编译下面这段代码

\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月还没有这种现象,但最近重新编译当时的文档发现了这个问题。期间没有排版过中文,所以不确定是何时引入的这个问题。

muzimuzhi commented 1 year ago

而实际得到的结果是

``你好'' -- CJK

给个截图?

我本地的 texlive 2023 和 overleaf 上的 texlive 2022 得到的都是(只看标点部分)

image

你的输入,预期输出的都是西文标点

HardGraphite commented 1 year ago
# 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.

test_screenshot

muzimuzhi commented 1 year ago

你试试编译这个稍微简化的例子,然后上传 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,刚好夹在两者中间。虽然不排除问题出自中间的某个版本组合,很大可能仍然是你本地的安装/配置有问题。

HardGraphite commented 1 year ago

用 pdflatex 编译就正常了。看来是 xelatex 这边的问题。

muzimuzhi commented 1 year ago

我理解(脑补)的是,

\documentclass{article}
\begin{document}
``Hi'' -- Jam
\end{document}

于是这和 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.maptex-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