如何定义 `\unskip` 的变体,使其在指定字符(例如标点符号)后不起作用?

如何定义 `\unskip` 的变体,使其在指定字符(例如标点符号)后不起作用?

我用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}

在此处输入图片描述

相关内容