我用cleveref
它来自动进行交叉引用,包括标签名称。此外,我需要用中文和英文编写文档,因此西拉特克斯\cref
是使用的。文档类负责处理中文和英文字符之间的间距。为了像英语短语一样使用宏cleveref
,并使宏在定义为以中文字符开头时正确运行,我使用这个答案, IE,
\crefname{figure}{\unskip 图}{\unskip 图}
自定义标签名称。
但是这个解决方案在标点符号后表现不正确,因为标点符号有压缩规则。
所以我想定义一个类似于\unskip
但在指定字符(例如标点符号)后不起作用的宏。这可能吗?还是应该添加更多糖分\crefname{figure}{...}{...}
?
平均能量损失
% !TEX program = xelatex
\documentclass{article}
\usepackage[fontset = founder]{ctex}% Note: some Chinese fonts are needed
\usepackage[a6paper]{geometry}
\usepackage{cleveref}
\crefname{figure}{\unskip 图}{\unskip 图}
\begin{document}
\begin{figure}
\centering
$a^2 + b^2 = c^2$
\caption{test}
\label{eq:test}
\end{figure}
% With XeLaTeX
中 文\par
中文\par
中 English\par
中English\par
前\cref{eq:test}后 --- \verb|\cref|\par % case 1. correct
前 \cref{eq:test} 后 --- \verb|\cref|\par% case 2. correct
前\ref{eq:test}后 --- \verb|\ref|\par % case 3. half wrong
前 \ref{eq:test} 后 --- \verb|\ref|\par % case 4. correct
但是,\cref{eq:test}表明\par % case 5: wrong
但是, \cref{eq:test} 表明\par % case 6: wrong
但是,\ref{eq:test}表明\par % case 7: half wrong
但是, \ref{eq:test} 表明\par % case 8: correct
但是,图~\ref{eq:test} 表明\par % case 9: wanted
\end{document}
答案1
在这里,我不会给你重新定义或替代\unskip
。我所做的是通过环境运行文档。如果找到 cat-12 标记,它会暂时tokencycle
设置标志。如果在找到宏或非 cat-12 标记之前找到,则会在输入流中插入一个附加标记,以防止任何标记对在 之前发出的标记起作用。\puncttrue
\cref
\mbox{}
\unskip
\mbox
但条件是:由于令牌循环在执行之前会预先检查所有令牌,因此任何更改 catcode 的技巧(尤其是verbatim
)都必须在令牌循环之外发生,令牌循环可以停止和重新启动。
% !TEX program = xelatex
\documentclass{article}
%\usepackage[fontset = founder]{ctex}% Note: some Chinese fonts are needed
\usepackage{xeCJK}
\setCJKmainfont{Microsoft JhengHei UI}
\setCJKfamilyfont{YaHei}{Microsoft YaHei UI}
\usepackage[a6paper]{geometry}
\usepackage{cleveref}
\crefname{figure}{\unskip 图}{\unskip 图}
\newif\ifpunct
\usepackage{tokcycle}
\Characterdirective{\addcytoks{#1}
\tctestifcatnx,#1{\puncttrue}{\punctfalse}}
\Macrodirective{%
\ifpunct
\ifx\cref#1\addcytoks{\mbox{}}\fi
\fi
\punctfalse
\addcytoks{#1}%
}
\begin{document}
\tokencyclexpress
\begin{figure}
\centering
$a^2 + b^2 = c^2$
\caption{test}
\label{eq:test}
\end{figure}
% With XeLaTeX
中 文\par
中文\par
中 English\par
中English\par
前\cref{eq:test}后 --- \texttt{\textbackslash cref}\par % case 1. correct
前 \cref{eq:test} 后 --- \texttt{\textbackslash cref}\par% case 2. correct
前\ref{eq:test}后 --- \texttt{\textbackslash ref}\par % case 3. half wrong
前 \ref{eq:test} 后 --- \texttt{\textbackslash ref}\par % case 4. correct
但是,\cref{eq:test}表明\par % case 5: wrong
但是, \cref{eq:test} 表明\par % case 6: wrong
但是,\ref{eq:test}表明\par % case 7: half wrong
但是, \ref{eq:test} 表明\par % case 8: correct
但是,图~\ref{eq:test} 表明\par % case 9: wanted
\endtokencyclexpress
\end{document}