不幸的是,有许多数学符号不在 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-math
0.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}
根据综合 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}
预计到达时间:
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}