如何在 unicode-math 中使用来自私有使用区域的数学符号?

如何在 unicode-math 中使用来自私有使用区域的数学符号?

不幸的是,有许多数学符号不在 Unicode 中。其中一个这样的符号是顺序关系运算符,它看起来像“>-”,可以在文献中找到。我有一个自定义字体,其中这个符号位于私人使用区域。使用 LuaLaTeX 和 XeLaTeX,我可以加载字体并在文本模式下显示它。该符号仅以正常粗细、非斜体形式定义。但是,我无法成功将其定义为数学运算符。这是编译文件的结果...

编译文件的结果

这是一个最小的、带注释的.tex文件,可以使用 LuaLaTeX 和 XeLaTeX 编译为 .pdf,但数学运算符的结果错误。

% Build .pdf using lualatex or xelatex

\documentclass{amsart}

% Load fontspec, unicode-math.

   \usepackage{fontspec}
   \usepackage{unicode-math}

% Load MyFont font

   \newfontface \MyFont {MyFont.ttf}

% Define Sequent operator in math mode.

   \DeclareSymbolFont{MyFont}{U}{cmr}{m}{n}

   \DeclareMathSymbol{\mathSequent}{\mathrel}{MyFont}{"E8A8}               

% Define Sequent operator in text mode.

   \newcommand \textSequent {{\MyFont{\char"E8A8}}}                        

\begin{document}
   \begin{flushleft}

      This is what the sequent operator looks like in text mode: \textSequent.\\
      This is what the sequent operator looks like in math mode: $\mathSequent$.

      \end{flushleft}
   \end{document}

答案1

我几乎做对了。需要声明系列然后使用它,而不是“cmr”。需要 TU 而不是 U。\DeclareMathSymbol如果 a) 使用声明的系列并且 b) 字符为 FF 或更小,则有效。由于后者存在问题,因此\DeclareMathSymbol必须改用\Umathchardef。修改后的代码如下所示,替换的行被注释掉。有一个额外的注释掉的行,用于\DeclareMathSymbol显示在它有效的情况下应如何使用它。

更新版本已使用 LuaLaTeX 和 XeLaTeX 进行了测试。我使用 MyFontB 和 MyFontC 的地方,我想明确说明必须使用相同值的地方。MyFontB 表示任意字体系列名称。MyFontC 表示任意符号字体名称。请注意,除了在文本模式下定义符号时,字体名称从不使用。系列名称可以与字体名称相同,但仍必须定义。

我还发现数学符号的类型(mathbin、mathrel 等)没有任何实际区别,除非我删除字体本身的侧边距(字形左右两侧的空白,用于文本中的最小间距)。然后,数学符号的类型会按预期工作。显然,当字体加载时,侧边距不会被删除。如果这些符号从未直接用于文本中,那就没问题了。由于它们可以在数学模式下换行,所以这应该不是问题。我可以创建具有零宽度侧边距的字体的自定义变体。可能有一些神秘的方法可以让 TeX 删除侧边距,但我还没有找到。

% Build .pdf using lualatex or xelatex

\documentclass{amsart}

% Load fontspec, unicode-math.

\usepackage{fontspec}

\usepackage{unicode-math}

% Load MyFont font

%  \newfontface \MyFont {MyFont.ttf}

\newfontface \MyFont {MyFont.ttf}[NFSSFamily=MyFontB]

% Define Sequent operator in math mode.

%  \DeclareSymbolFont{MyFont}{U}{cmr}{m}{n}

\DeclareSymbolFont{MyFontC}{TU}{MyFontB}{m}{n}

%  \DeclareMathSymbol{\mathSequent}{\mathrel}{MyFont}{"E8A8}               
%  \DeclareMathSymbol{\mathSequent}{\mathrel}{MyFontC}{"E8A8}               
\Umathchardef\mathSequent="3 \symMyFontC "E8A8

% Define Sequent operator in text mode.

\newcommand \textSequent {{\MyFont{\char"E8A8}}}                        

\begin{document}
\begin{flushleft}
   This is what the sequent operator looks like in text mode: \textSequent.\\
      This is what the sequent operator looks like in math mode: $\mathSequent$.
\end{flushleft}
\end{document}

答案2

虽然在使用字体方面没有直接的答案(之前已经用两种不同的方式回答过)。对于这个特定的符号,我发现了两种在 LaTex 中直接创建它的方法。第一种是几乎与原版没有区别(根据数学字体略有不同)。第二个相当接近,但明显不同。两者都足够接近,可以在实践中使用,但第一个更可取。

这使用了 scalerel 包。

{\vstretch{0.90}{\hstretch{0.50}{{\mkern5mu}{>}{\mkern-3mu}{-}{\mkern5mu}}}}

这使用了 graphicx 包。

{\mkern3mu{\rotatebox[origin=c]{270}{\raisebox{-1pt}{\Yup}}}\mkern3mu}

答案3

unicode-math0.81 中,\setmathfont[range="E8A8]当请求的角色位于私人使用区域时,不幸的是会失败。这里有一个解决方法。

\documentclass[varwidth, preview]{standalone}

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

% \setmainfont goes here.
\defaultfontfeatures{Scale=MatchUppercase}
% \setsansfont, \setmonofont, etc. go here.

\newfontface\mathsymbolfont{MyFont.ttf}
\DeclareRobustCommand\textsequent{{\mathsymbolfont\symbol{"E8A8}}\relax}
\DeclareRobustCommand\sequent{\mathrel{\text{\textsequent}}}

\begin{document}
In text mode, the sequent symbol is \textsequent.

In math mode, \(A \sequent B\).

Compare \(A \succ B\).
\end{document}

来自自定义 TTF 字体

根据综合 LaTeX 符号列表,该符号也出现在 CTAN 上的两个包中,这两个包在stmaryrd本世纪初得到了更新,并且仍然可以使用:

\documentclass[varwidth, preview]{standalone}

\usepackage{amssymb} % Used by stmaryrd
\usepackage{stmaryrd} % For \Yright
\usepackage{unicode-math} % Or font packages of choice.
\DeclareRobustCommand\sequent{\mathrel{\Yright}}

\begin{document}
In math mode, \(A \sequent B\).

Contrast \(A \succ B\).
\end{document}

使用 stmaryrd 的示例

预计到达时间:

Unicode 中有一个类似的符号,可在 中使用unicode-math\righttail但您可能需要从其他字体加载它。

\documentclass[varwidth, preview]{standalone}

\usepackage{stmaryrd} % \Yright
\usepackage{unicode-math}

\setmathfont{Latin Modern Math}
\setmathfont[Scale=MatchUppercase, range={\righttail}]{STIX Two Math}

\newcommand\sequent{\mathrel\righttail}

\begin{document}
Compare \(A \sequent B\) to \(A \mathrel\Yright B\).
\end{document}

\righttail 示例

相关内容