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

上标引用后面有多余的空格 #624

Closed
yuantailing opened this issue Mar 25, 2021 · 11 comments
Closed

上标引用后面有多余的空格 #624

yuantailing opened this issue Mar 25, 2021 · 11 comments
Labels

Comments

@yuantailing
Copy link

yuantailing commented Mar 25, 2021

编译环境

编译的系统:Windows 10
TeX 发行版:TeX Live 2020
模板版本:v7.2.1
模板类型:master

描述问题

根据《研究生学位论文写作指南》附件《09正文 第3章(示例)》的示例,上标引用的中括号与两侧中文之间没有空格,而模板编译的结果是有空格。

截图:
image

复现上述问题的代码:

\documentclass[degree=master]{thuthesis}
\input{thusetup}
\begin{document}
引用\cite{bixon1996dynamics}测试。
引用\citet{bixon1996dynamics}测试。
\bibliography{ref/refs}  % 参考文献使用 BibTeX 编译
\end{document}
@zepinglee
Copy link
Contributor

确实是个 bug。

这个需要深入 natbib 底层处理,而且可能是 xeCJK 自动添加的,需要费些时间。

@zepinglee zepinglee added the bug label Mar 25, 2021
@zepinglee
Copy link
Contributor

@hushidong 我发现 biblatex 也有类似的问题。你觉得左右两边的空隙一致的设计是不是更好些?

@hushidong
Copy link

你的意思是特意在前面加一个空格么?我看一般文档中是不加的吧,正常的英文是没有的,中文后面多出来的空主要是xecjk加入的。

如果一定要加那么弄个短的空格(半空格),做个选项给它。分三种情况:1默认的,前面无,后面有,2前面有,后面有,3前面无,后面无。

@zepinglee
Copy link
Contributor

你的意思是特意在前面加一个空格么?我看一般文档中是不加的吧,正常的英文是没有的,中文后面多出来的空主要是xecjk加入的。

如果一定要加那么弄个短的空格(半空格),做个选项给它。分三种情况:1默认的,前面无,后面有,2前面有,后面有,3前面无,后面无。

我的意思是去掉上标式引用后面的空白。

一般写英文会在后面手动输入空格,比如 Citation\cite{foo} test,这样没有太大问题。但是中文的话是连续的,xeCJK 自动添加的空白就有些多余。所以我建议把你说的第 3 种情况设为默认的。

@hushidong
Copy link

嗯,去掉也是好的。去掉的话,biblatex这边需要对所有的引用命令加点点东西,用patch的手段似乎还不好使,稍微麻烦点,也能实现。

不过有没有可能从xecjk入手去解决呢?判断一下然后不加,这估计也麻烦。

其实最简单的方式还是写作者手动加点东西将空格去掉好了,毕竟这种情况不是很多的,只有偶尔的情况需要在句中引用的,大多数情况都是在句尾。

@hushidong
Copy link

hushidong commented Mar 29, 2021

我试了一下,目前biblatex这边还不知道怎么解决,加东西无效,不知道是展开层次不对还是怎么回事?
我想要解决这个问题,可能要了解xecjk加空格的机制?
你对它了解么?从时间看在正文中cite命令后面加mbox可以消除空格,但在cite命令的宏里面加mbox无法消除

初看了一下空格是用clist_map_inline加进去的,不知道是在什么时候做这个操作的?是在读字符的时候么,如果是的话可能就无法在宏里面处理了。

@zepinglee
Copy link
Contributor

我不太赞成手写 引用\cite{key}\mbox{}测试,主要是背离了格式与内容分离的原则。

另外我觉得用 xeCJK 来判断不太靠谱。对于上标式引用使用两侧紧凑的样式更合理,比如
Screen Shot 2021-03-30 at 19 00 37
但是像 inline numeric 或者 author-year 的情况,
Screen Shot 2021-03-30 at 19 02 35
Screen Shot 2021-03-30 at 19 03 24
在两边加上一定的空白显得更为美观。如果只靠 xeCJK 来判断,它只如果找到前面上标的页码,就不知道是否应该加空白。

还有从 Nature 的文章来看,上标式引用在句中和句尾两种情况都有相当的比例,所以不宜忽略其中一种情况。
Screen Shot 2021-03-30 at 19 07 34

@zepinglee
Copy link
Contributor

我找了一下 natbib 中的代码,在生成上标的引用时,\textsuperscript 前有 \unskip\kern\p@。这句的效果是,即便 \cite 有空格或者 \quad 这样的命令,它也会吞掉,只空 1 pt。我试了下在 \textsuperscipt{} 后也加上 \kern\p@ 能够满足要求。

biblatex 相关的代码中我没找到相关的实现部分。

感觉这个 issue 转移到 xeCJK 那边问一下更合适。

@hushidong
Copy link

你提供了一个好的思路,在\textsuperscipt{}加上\kern\z@可以解决,我之前都是在\textsuperscipt{}里面加的它,所以失效了。

限制biblatex这边可以这么处理:

重定义如下宏基本就ok了。

\renewrobustcmd{\mkbibsuperscript}[1]{%
  \unspace\allowhyphens\textsuperscript{%
    \begingroup
    \protected\long\def\mkbibsuperscript##1{%
      \blx@warning{Nested superscript}%
      \mkbibbrackets{##1}}%
    #1\endgroup}\kern\z@}

@zepinglee
Copy link
Contributor

@hushidong 另外请教下 biblatex 的 .cbx.bbx 内容能改到 .cls 模板中吗?(除了用 filecontents

@hushidong
Copy link

能吧,放到biblatex之后,导言区结束之前。

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

No branches or pull requests

3 participants