如何使用 unicode-math 重新定义冒号符号(间距问题)

如何使用 unicode-math 重新定义冒号符号(间距问题)

我想改变:和的通常作用\colon。请考虑以下代码

\documentclass{scrreprt}

\usepackage{amsmath}
\usepackage{unicode-math}

%\unimathsetup{colon=literal}
%\DeclareMathSymbol{:}{\mathpunct}{operators}{"3A}
%\let\colon\relax
%\DeclareMathSymbol{\colon}{\mathrel}{operators}{"3A}


\begin{document}
    \newcommand\mycolon{\mathpunct{\char"003A}}
    \newcommand\myratio{\mathrel{\char"003A}}

    \( \pi:X \to Y \) (1)

    \( \pi\myratio X \to Y \) (2)

    \( \pi\colon X \to Y \) (3)

    \( \pi\mycolon X \to Y \) (4)
\end{document}

前两个在 $\pi$ 和 $X$ 之间的间隙相同。(3) 的间距较小,而 (4) 的间距最小。记住 (3) 的间距。现在取消注释行以交换 ':' 和 \colon 的作用。现在 (1') 已正确设置为标点符号,间距等于 (4') 而不等于 (3) 的先前间距。有办法调整它们吗?

编辑:由于 egreg 而解决(改动很小)

\documentclass{scrreprt}

\usepackage{amsmath}
\usepackage{unicode-math}
\usepackage{etoolbox}


\patchcmd{\colon}{:}{\relcolon}{}{}         % Remove ':' from the definition of \colon 
\newcommand\myratio{\mathrel{\char"02236}}  % Define how the colon should look like as a ratio 
%\newcommand\myratio{\mathrel{\char"003A}}  % Use for wider space
\AtBeginDocument{
    \edef\relcolon                          % Define \recolon with current ':'
        {\mathrel{\Umathcharnum\the\Umathcodenum`:}}    
    \begingroup\lccode`~=`:                 % Make ':' math-active and redefine it to be \colon
    \lowercase{\endgroup\let~}\colon
    \mathcode`:="8000
    \let\colon\myratio                      % Redefine \colon with \myratio                      
}

\begin{document}
    \( \pi:X \to Y \) (1)

    \( \pi\colon X \to Y \) (2)
\end{document}

答案1

带有 的amsmath\colon不仅仅是一个标点符号,而且在它前面有一些空格,在它后面比标点符号有更多的空格。

(不太直接的)几乎可以互换含义的方法是

\documentclass{scrreprt}

\usepackage{amsmath}
\usepackage{unicode-math}
\usepackage{etoolbox}
\patchcmd{\colon}{:}{\relcolon}{}{}
\AtBeginDocument{
  \edef\relcolon{\mathrel{\Umathcharnum\the\Umathcodenum`:}}
  \begingroup\lccode`~=`:
  \lowercase{\endgroup\let~}\colon
  \mathcode`:="8000
}


\begin{document}

    \( \pi:X \to Y \) (1)

    \( \pi\mathpunct{\relcolon} X \to Y \) (2)

    \( \pi\relcolon X \to Y \) (3)

\end{document}

情况(1)与 相同\colon;情况(2)用 来\mathpunct表示区别;情况(3)以冒号作为关系。

首先,我对其进行修补,使其定义中\colon没有显式,否则将发生无限循环。然后(在文档开头),我使用当前的数学代码进行定义(需要获取显式数字)。最后,我激活数学并赋予它与相同的含义。其中 的使用没有任何后果,因为它似乎是带括号的,因此被视为普通符号。:\relcolon:\edef:amsmath\colon\relcolon

不过,我认为改变语义不是一个好主意,因为它限制了可移植性。

在此处输入图片描述

如果您确实想要使用\colon该关系,那么对上述代码进行修改应该可以起作用:

\documentclass{scrreprt}

\usepackage{amsmath}
\usepackage{unicode-math}
\usepackage{etoolbox}
\let\amsmathcolon\colon
\patchcmd{\amsmathcolon}{:}{\colon}{}{}
\AtBeginDocument{
  \edef\colon{\mathrel{\Umathcharnum\the\Umathcodenum`:}}
  \begingroup\lccode`~=`:
  \lowercase{\endgroup\let~}\amsmathcolon
  \mathcode`:="8000
}


\begin{document}

    \( \pi:X \to Y \) (1)

    \( \pi\mathpunct{\colon} X \to Y \) (2)

    \( \pi\colon X \to Y \) (3)

\end{document}

请注意,选项colon=literal 没有按照要求做;这是一个例子

\documentclass{scrreprt}

\usepackage{amsmath}
\usepackage[colon=literal]{unicode-math}


\begin{document}

    \( \pi:X \to Y \) (1)

    \( \pi\mathpunct{\colon} X \to Y \) (2)

    \( \pi\colon X \to Y \) (3)

\end{document}

在此处输入图片描述

因此:使用了错误的间距并且\colon没有重新定义。

答案2

请参阅文档第 5.5.6 节unicode-math

\documentclass{scrreprt}

\usepackage{amsmath}
\usepackage[colon=literal]{unicode-math}
\begin{document}

    \( \pi:X \to Y \) (1)

\end{document}

相关内容