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

\ref 中出现数字时,与随后紧跟的汉字之间缺少空格 #392

Closed
zsrkmyn opened this issue Nov 22, 2018 · 10 comments
Closed

\ref 中出现数字时,与随后紧跟的汉字之间缺少空格 #392

zsrkmyn opened this issue Nov 22, 2018 · 10 comments

Comments

@zsrkmyn
Copy link

zsrkmyn commented Nov 22, 2018

代码如下,第 5 个中数字1和中文之间的间隙没了……

\documentclass[a4paper,10pt]{ctexart}

\begin{document}

\begin{equation}\label{eqn}
	a = 10
\end{equation}

1 test中文

2 test 中文

3 123中文

4 123 中文

5 \ref{eqn}中文 % 其他都 okay,就这个不 okay

6 \ref{eqn} 中文

7 中文\ref{eqn}

8 中文 \ref{eqn}

\end{document}

如图

CTeX 版本如下:
Document Class: ctexart 2018/05/02 v2.4.14 Chinese adapter for class article (CTEX)

@zepinglee
Copy link
Member

这不算是个 bug,应该养成中西文之间手动加空格的习惯

@stone-zeng
Copy link
Member

可以试想引用的东西是汉字,比如第章这个样子(“一”是引用),那么就不应该有额外的空格。所以很多时候 \ref 两侧空格仍需要手动控制。

PS:一般 \ref 前面会用 ~ 表示禁止断开。

@zsrkmyn
Copy link
Author

zsrkmyn commented Nov 22, 2018

@stone-zeng 前一句同意,手动控制不同意。

比如用 \newcommand{\test}[1]{#1},然后在文中使用 \test{123}中文测试 时数字与汉字间是有空隙的,\test{一二三}中文测试 是没空隙的,感觉这应该才是正常表现。

@muzimuzhi
Copy link
Contributor

muzimuzhi commented Nov 26, 2018

@stone-zeng 前一句同意,手动控制不同意。

比如用 \newcommand{\test}[1]{#1},然后在文中使用 \test{123}中文测试 时数字与汉字间是有空隙的,\test{一二三}中文测试 是没空隙的,感觉这应该才是正常表现。

可能和 xecjk 宏包代码的的字符类别设定、字符输出规则部分有关,代码具体在宏包文档的 5.5.4 到 5.5.6 节。我做了一些尝试,在每一处 inter char class code 之后,增加了字符类别信息和\lastnodetype 信息的输出。进一步的「为什么」需要读代码,我对 tex/latex2e/latex3 的了解还不够,代码读得很慢。

从图片中的效果看,

  • 前三例,中西文之间的自动间距都能自动添加
  • 第四例,也就是 issue 标题提到的 \ref,会导致后面无法自动添加间距
  • 第五例,前后都失效

image

\lastnodetype 是 etex 引擎新增的 primitive,附上它的文档
image

相关代码

\documentclass{ctexart}
\usepackage{array}

\ExplSyntaxOn
\NewDocumentCommand{\showInterClassInfo}{ m }
  {
    \bgroup
    \seq_map_inline:Nn \g__xeCJK_base_class_seq
      {
        \seq_map_inline:Nn \g__xeCJK_base_class_seq
          {
            \xeCJK_app_inter_class_toks:nnn {##1} {####1}
              {
                \setcounter{section}{\lastnodetype}%
                \bgroup\XeTeXinterchartokenstate = 0
                \linebreak[1]\normalfont(\arabic{section},~##1~to~####1)\newline
                \egroup
              }
          }
      }
    #1
  }

\NewDocumentCommand{\hideInterClassInfo}{ }
  {
    \egroup
  }
\ExplSyntaxOff

\newcommand{\test}[1]{#1}

\begin{document}
\begin{equation}\label{eqn}
	a = 10
\end{equation}

\begin{tabular}{l l >{\showInterClassInfo}p{200pt}<{\hideInterClassInfo}}
	input                & output       & \egroup output with illustration \bgroup \\ \hline
	\verb|字1字|          & 字1字          & 字1字                          \\
	\verb|字\textbf{1}字| & 字\textbf{1}字 & 字\textbf{1}字                 \\
	\verb|字\test{1}字|   & 字\test{1}字   & 字\test{1}字                   \\
	\verb|字\ref{eqn}字|  & 字\ref{eqn}字  & 字\ref{eqn}字                  \\
	\verb|字\mbox{1}字|   & 字\mbox{1}字   & 字\mbox{1}字
\end{tabular}
\end{document}

@Liam0205
Copy link
Contributor

这个问题以前讨论过。

结论大致是:技术上实现一个 case 不难。但是有很多的 edge case,所以很难保证完备性。因此,暂时不去实现;同时在 xeCJK 层面,中文与西文之间建议手工加上空格。

@zsrkmyn
Copy link
Author

zsrkmyn commented Nov 27, 2018

谢谢各位解答。

通常在中西文之间的空格我一般都会手动加上。
但是前几天自己定义了宏 \newcommand{\fig}[1]{图~\ref{#1}}。然后在写作的时候用以下 1、2 都不对,只有 3 才对,看起来很别扭,所以才提此 issue。Anyway,谢谢各位!

1 如\fig{xxx}所示   % 数字后少了空格
2 如 \fig{xxx} 所示 % “图”字前多了空格
3 如\fig{xxx} 所示

@muzimuzhi
Copy link
Contributor

muzimuzhi commented Nov 27, 2018

谢谢各位解答。

通常在中西文之间的空格我一般都会手动加上。
但是前几天自己定义了宏 \newcommand{\fig}[1]{图~\ref{#1}}。然后在写作的时候用以下 1、2 都不对,只有 3 才对,看起来很别扭,所以才提此 issue。Anyway,谢谢各位!

1 如\fig{xxx}所示   % 数字后少了空格
2 如 \fig{xxx} 所示 % “图”字前多了空格
3 如\fig{xxx} 所示

一个离题的回复,cleveref 宏包也许可以帮到你。

\documentclass{ctexart}
\usepackage{cleveref}
\crefname{figure}{图}{图} % 更好的方式是以语言配置的形式提供,见 cleveref 文档第 10 节
\begin{document}

\begin{figure}
\centering figure content
\caption{fig}\label{fig:1}
\end{figure}

中文\cref{fig:1}中文
\end{document}

image

@zsrkmyn
Copy link
Author

zsrkmyn commented Nov 28, 2018

@muzimuzhi 谢谢!确实很棒!但是不确定「以语言配置的形式」提供是指 doc 中提到的类似 \documentclass[chinese]{ctexart} 这样吗?但是似乎 babel、polyglossia 和 cleveref 都没有对中文的支持,看起来还得手动 \crefname。亦或是用 cleveref.cfg 提供配置?

@gzxu
Copy link

gzxu commented Apr 11, 2019

借个光问一句,有没有什么办法可以在已知某些宏展开一定是英文字符的时候,让这些宏自带空格呢?除了我现在这样刀耕火种的做法:

\let\origeqref\eqref
\renewcommand{\eqref}[1]{ \origeqref{#1} }
\let\origref\ref
\renewcommand{\ref}[1]{~\origref{#1} } % \ref 前面一定是“图”或者“表”
\let\origSI\SI
\renewcommand{\SI}[2]{ \origSI{#1}{#2} }

不知道CTeX宏包里面有没有自带这样的辅助宏 🤔

@muzimuzhi
Copy link
Contributor

muzimuzhi commented Apr 12, 2019

@gzxu

  • 新问题请开新 issue
  • 如果觉得和这个 issue 有关联,在新问题中以链接形式引用这个 issue。
  • 以及,你的问题可能更适合发到 https://github.com/CTeX-org/forum/

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

No branches or pull requests

6 participants