Skip to content

Instantly share code, notes, and snippets.

@anamewing
Last active March 23, 2024 17:03
Show Gist options
  • Save anamewing/5154b6278f63e8d738bb5d57413a923f to your computer and use it in GitHub Desktop.
Save anamewing/5154b6278f63e8d738bb5d57413a923f to your computer and use it in GitHub Desktop.
Add Simplified Chinese translation to cleveref.
\crefname{equation}{式}{式}
\crefname{figure}{图}{图}
\crefname{table}{表}{表}
\crefname{page}{页}{页}
\crefname{chapter}{章}{章}
\crefname{section}{节}{节}
\crefname{appendix}{附录}{附录}
\crefname{theorem}{定理}{定理}
\crefname{lemma}{引理}{引理}
\crefname{corollary}{推论}{推论}
\crefname{proposition}{命题}{命题}
\crefname{definition}{定义}{定义}
\crefname{example}{例}{例}
\crefname{algorithm}{算法}{算法}
\crefname{listing}{列表}{列表}
\crefname{line}{行}{行}
\crefformat{chapter}{#2第#1章#3}
\crefformat{section}{#2第#1节#3}
\crefformat{subsection}{#2第#1节#3}
\crefformat{subsubsection}{#2第#1节#3}
\crefrangeformat{chapter}{#3第#1章#4至#5第#2章#6}
\crefrangeformat{section}{#3第#1节#4至#5第#2节#6}
\crefrangeformat{subsection}{#3第#1节#4至#5第#2节#6}
\crefrangeformat{subsubsection}{#3第#1节#4至#5第#2节#6}
\crefmultiformat{chapter}{#2第#1章#3}{和#2第#1章#3}{,#2第#1章#3}{和#2第#1章#3}
\crefmultiformat{section}{#2第#1节#3}{和#2第#1节#3}{,#2第#1节#3}{和#2第#1节#3}
\crefmultiformat{subsection}{#2第#1节#3}{和#2第#1节#3}{,#2第#1节#3}{和#2第#1节#3}
\crefmultiformat{subsubsection}{#2第#1节#3}{和#2第#1节#3}{,#2第#1节#3}{和#2第#1节#3}
\crefrangemultiformat{chapter}{#3第#1章#4至#5第#2章#6}{和#3第#1章#4至#5第#2章#6}{,#3第#1章#4至#5第#2章#6}{和#3第#1章#4至#5第#2章#6}
\crefrangemultiformat{section}{#3第#1节#4至#5第#2节#6}{和#3第#1节#4至#5第#2节#6}{,#3第#1节#4至#5第#2节#6}{和#3第#1节#4至#5第#2节#6}
\crefrangemultiformat{subsection}{#3第#1节#4至#5第#2节#6}{和#3第#1节#4至#5第#2节#6}{,#3第#1节#4至#5第#2节#6}{和#3第#1节#4至#5第#2节#6}
\crefrangemultiformat{subsubsection}{#3第#1节#4至#5第#2节#6}{和#3第#1节#4至#5第#2节#6}{,#3第#1节#4至#5第#2节#6}{和#3第#1节#4至#5第#2节#6}
\newcommand{\crefpairconjunction}{~和~}
\newcommand{\crefmiddleconjunction}{, }
\newcommand{\creflastconjunction}{~和~}
\newcommand{\crefpairgroupconjunction}{~和~}
\newcommand{\crefmiddlegroupconjunction}{, }
\newcommand{\creflastgroupconjunction}{~和~}
\newcommand{\crefrangeconjunction}{~至~}
@anamewing
Copy link
Author

可以用

\crefformat{chapter}{#2第\zhnumber{#1}章#3}
\crefrangeformat{chapter}{#3第\zhnumber{#1}章#4至#5第\zhnumber{#2}章#6}
\crefmultiformat{chapter}{#2第\zhnumber{#1}章#3}{和#2第\zhnumber{#1}章#3}{,#2第\zhnumber{#1}章#3}{和#2第\zhnumber{#1}章#3}

把章的引用改成中文数字,和 ctex 默认设置一致

@anamewing
Copy link
Author

空格是个比较麻烦的问题,目前若是加载了 hyperref 包的话,CTeX 包可以在 Cleveref 引用时生成的“图 4”的两个字符之间自动加空格,但是不能在4的后面自动加空格。去掉 hyperref 包之后一切正常。
也可以用下面的正则匹配下,然后手动替换空格。

(\\[cC]ref\{((fig:|tab:|algo:|thm:|cha:appendix:|sub:|ssub:)[\w\d:-]+,)*((fig:|tab:|algo:|thm:|cha:appendix:|sub:|ssub:)[\w\d:-]+)\})(?!。|:|?|,| |\n|)|(|;|\\|([a-z]\)))

@kfyangc
Copy link

kfyangc commented Oct 7, 2023

空格是个比较麻烦的问题,目前若是加载了 hyperref 包的话,CTeX 包可以在 Cleveref 引用时生成的“图 4”的两个字符之间自动加空格,但是不能在4的后面自动加空格。去掉 hyperref 包之后一切正常。 也可以用下面的正则匹配下,然后手动替换空格。

(\\[cC]ref\{((fig:|tab:|algo:|thm:|cha:appendix:|sub:|ssub:)[\w\d:-]+,)*((fig:|tab:|algo:|thm:|cha:appendix:|sub:|ssub:)[\w\d:-]+)\})(?!。|:|?|,| |\n|)|(|;|\\|([a-z]\)))

有一个折中的解决方法,可以在4的后面自动加空格(仍然保留 hyperref 包)。方法如下:

首先导入 xspace

\usepackage{xspace}

然后再定义一个新的命令为 \cleveref(命令的名字可以任意改)

% xspace 原本只适配英文标点,使用 xspaceaddexceptions 手动适配中文标点
\xspaceaddexceptions{、,。?!:;)}
\newcommand{\cleveref}[1]{\cref{#1}\xspace}

这样引用的时候输入\cleveref{标签label}即可自动加空格。

我目前的方案是将上面的命令 \cleveref 直接替换掉原来的 \ref,实现如下:同样需要导入 xspace,但由于 hyperref 包的作用,不能在 document 结构前让 \ref 失效,故需要在 document 结构后定义,即:

\usepackage{xspace}

\begin{document}

\xspaceaddexceptions{、,。?!:;)}
\newcommand{\cleveref}[1]{\cref{#1}\xspace}
\let\ref\relax
\newcommand{\ref}[1]{\cleveref{#1}}

正文

\end{document}

最后十分感谢 @anamewing 对中文的适配

@roastduck
Copy link

空格是个比较麻烦的问题,目前若是加载了 hyperref 包的话,CTeX 包可以在 Cleveref 引用时生成的“图 4”的两个字符之间自动加空格,但是不能在4的后面自动加空格。去掉 hyperref 包之后一切正常。 也可以用下面的正则匹配下,然后手动替换空格。

(\\[cC]ref\{((fig:|tab:|algo:|thm:|cha:appendix:|sub:|ssub:)[\w\d:-]+,)*((fig:|tab:|algo:|thm:|cha:appendix:|sub:|ssub:)[\w\d:-]+)\})(?!。|:|?|,| |\n|)|(|;|\\|([a-z]\)))

有一个折中的解决方法,可以在4的后面自动加空格(仍然保留 hyperref 包)。方法如下:

首先导入 xspace

\usepackage{xspace}

然后再定义一个新的命令为 \cleveref(命令的名字可以任意改)

% xspace 原本只适配英文标点,使用 xspaceaddexceptions 手动适配中文标点
\xspaceaddexceptions{、,。?!:;)}
\newcommand{\cleveref}[1]{\cref{#1}\xspace}

这样引用的时候输入\cleveref{标签label}即可自动加空格。

我目前的方案是将上面的命令 \cleveref 直接替换掉原来的 \ref,实现如下:同样需要导入 xspace,但由于 hyperref 包的作用,不能在 document 结构前让 \ref 失效,故需要在 document 结构后定义,即:

\usepackage{xspace}

\begin{document}

\xspaceaddexceptions{、,。?!:;)}
\newcommand{\cleveref}[1]{\cref{#1}\xspace}
\let\ref\relax
\newcommand{\ref}[1]{\cleveref{#1}}

正文

\end{document}

最后十分感谢 @anamewing 对中文的适配

直接在所有\cref后面加\xspace并不完全可行,因为“图1”后面要加空格,但“第1章”后面并不需要加。理论上应该只在以数字结尾的引用后面加 \xspace

@NemoYuan2008
Copy link

感谢对中文的适配!但是有些复杂情况上面的代码会出现一点小问题,例如:

\documentclass{ctexart}

\usepackage{cleveref}

\crefname{section}{节}{节}
\crefformat{section}{#2第#1节#3}
\crefrangeformat{section}{#3第#1节#4至#5第#2节#6}
\crefmultiformat{section}{#2第#1节#3}{和#2第#1节#3}{,#2第#1节#3}{和#2第#1节#3}

\newcommand{\crefpairconjunction}{~和~}
\newcommand{\crefmiddleconjunction}{, }
\newcommand{\creflastconjunction}{~和~}
\newcommand{\crefpairgroupconjunction}{~和~}
\newcommand{\crefmiddlegroupconjunction}{, }
\newcommand{\creflastgroupconjunction}{~和~}
\newcommand{\crefrangeconjunction}{~至~}


\begin{document}

\section{标题}\label{sec1}
\section{标题}\label{sec2}
\section{标题}\label{sec3}
\section{标题}\label{sec4}
\section{标题}\label{sec5}
\section{标题}\label{sec6}
\section{标题}\label{sec7}


\cref{sec1,sec2,sec3}       % 第 1 节至第 3 节,OK

\cref{sec1,sec2,sec3,sec5}  % 节 1 至 3 和第 5 节,Not OK

\cref{sec1,sec2,sec3,sec5,sec6,sec7}    % 节 1 至 3 和 5 至 7,Not OK


\end{document}

其中最后两个 \cref 命令产生的结果不尽人意(见注释),请问有什么解决方法吗?
我尝试通过 \crefrangemultiformat 命令设置格式,但是没有成功,官方的文档对于该命令没有特别详细的说明。

谢谢!

@anamewing
Copy link
Author

anamewing commented Mar 23, 2024

其中最后两个 \cref 命令产生的结果不尽人意(见注释),请问有什么解决方法吗? 我尝试通过 \crefrangemultiformat 命令设置格式,但是没有成功,官方的文档对于该命令没有特别详细的说明。

补充下面这行

\crefrangemultiformat{section}{#3第#1节#4至#5第#2节#6}{和#3第#1节#4至#5第#2节#6}{,#3第#1节#4至#5第#2节#6}{和#3第#1节#4至#5第#2节#6}

EDIT: 把 \crefrangemultiformat 相关内容补充到gist了。

@NemoYuan2008
Copy link

@anamewing 非常感谢!

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment