加载unicode-math后,如何将一个符号(字符)重新映射到另一个符号(字符)?

加载unicode-math后,如何将一个符号(字符)重新映射到另一个符号(字符)?

我特别希望“⦂”(U2982,Z NOTATION TYPE COLON)以具有 mathrel 间距的冒号形式出现(或者更好的是,以 amsmath 的方式重新定义 \colon

但重新定义\typecolon不起作用\AtBeginDocument。我也尝试过使用较低级别的 unicode-math 命令。包含我的尝试的 MWE 如下:

%!TEX program = lualatex

\documentclass{article}
\usepackage[math-style=ISO, partial=upright]{unicode-math}
\setmathfont{LibertinusMath-Regular.otf}

\AtBeginDocument{
  \let\typecolon\colon % fails
% \renewcommand{\typecolon}{\nobreak\mskip2mu\mathpunct{}\nonscript
% \mkern-\thinmuskip{:}\mskip6muplus1mu\relax} % fails
}

% \ExplSyntaxOn
% \AtBeginDocument{
  % \__um_process_symbol_noparse:nnn {"02982}{:}{\mathrel} % fails
  % \__um_process_symbol_noparse:nnn {"02982}{\colon}{\mathrel} % fails
  % \__um_remap_symbol:nnn {\`⦂} {\mathrel} {"02236} % fails
  % \__um_remap_symbol:nnn {\typecolon} {\mathrel} {"02236} % fails
% }
% \ExplSyntaxOff


\begin{document}

With explicit symbol: $f ⦂ A → B.$

With \verb|\symbol|: $f \symbol{"02982} A → B.$

With \verb|\typecolon|: $f \typecolon A → B.$

\end{document}

其结果是在此处输入图片描述

我的假设是 unicode-math 将裸 unicode 字符定义为“活动字符” \typecolon,根据unicode-数学表.tex但显然我错了,或者重新定义\typecolon会起作用。

这里正确的方法是什么?我的误解在哪里?提前感谢所有回复。


版本详细信息:

我正在使用带有 unicode-math 的 LuaLaTeX:

>_ lualatex --version                       
This is LuaHBTeX, Version 1.14.0 (TeX Live 2022/dev/Debian) […]

具体来说,就是与 Ubuntu 22.04 一起打包的内容。

答案1

分配一个\mathcode会使"8000字符“数学活动”。在数学模式下使用时,这样的 〈character〉 将被具有原始字符代码的活动字符标记替换(TeXbook 第 289 页)。因此,我们只需分配适当的\mathcode并使活动行为为\colon

% Tested with LuaTeX and XeTeX
\documentclass{article}
\usepackage[math-style=ISO, partial=upright]{unicode-math}
\setmainfont{STIX-Regular.otf}  % to show the ⦂ in horizontal mode
\setmathfont{LibertinusMath-Regular.otf}

% In LuaTeX, \letcharcode`⦂=\colon can replace the following line (Marcel Krüger's hint)
\begingroup \lccode`~=`⦂ \lowercase{\endgroup\def~}{\colon}
\AtBeginDocument{\mathcode`⦂="8000\relax}

\begin{document}

With \verb|\colon|: $f \colon A → B$.

With explicit symbol: $f ⦂ A → B$.

With \verb|\symbol|: $f \symbol{"02982} A → B$.

“⦂” is still “\symbol{"02982}” (\verb|\symbol{"02982}|) in horizontal mode.

\end{document}

在此处输入图片描述

在数学模式中,\symbol{"02982}也被活动的 所取代,因为它扩展为\char"02982\relax,并且\char"02982是一个 〈character〉,在数学模式下其处理方式与-with-catcode-12 (TeXbook p.289) 相同。

答案2

只需指出“内部unicode-math API”选项,OP似乎更喜欢这个选项:

\documentclass{article}
\usepackage[math-style=ISO, partial=upright]{unicode-math}
\setmainfont{STIX-Regular.otf}
\setmathfont{LibertinusMath-Regular.otf}

\ExplSyntaxOn
\AtBeginDocument{
 \__um_mathactive_remap:nn {"2982} {\colon}
}
\ExplSyntaxOff

\begin{document}

With \verb|\colon|: $f \colon A → B$.

With explicit symbol: $f ⦂ A → B$.

With \verb|\symbol|: $f \symbol{"02982} A → B$.

“⦂” is still “\symbol{"02982}” (\verb|\symbol{"02982}|) in horizontal mode.
% MWE copied from the other answer, I don't actually have the fonts to test but testing with default font works well
\end{document}

在其他一些版本中,我认为您需要删除第一个__?,正如内部 API 所期望的那样。

还有\__um_map_char_single:nn15.1 映射“裸”数学字符“在unicode-math-code.pdf中,但是文档有点密集......

相关内容