为 Unicode 私有使用区域创建 mathXxxx 类型的宏

为 Unicode 私有使用区域创建 mathXxxx 类型的宏

我有一个自定义字体,在私人使用区域有十几个脚本 0-9、AZ、az。我需要为这些脚本创建宏,如 symcal() 和 mathcal()。我有一些可以工作的东西——但它显然是错误的。由于我正试图让它成型以放在 ctan 上,我不想要一个可能对其他人不起作用的临时解决方案。这是我目前的尝试

\documentclass[10pt]{article}

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

\setmainfont{STIX Two Text}[NFSSFamily=mainfont]
\setmathfont{STIX Two Math}[NFSSFamily=mathfont]

\DeclareSymbolFont{MathFont}{TU}{mathfont}{m}{n}

\usepackage{logix} % Load logix font for additional symbols.

\newcommand \setMathScript {
   \Umathcode "31 = 7 \symLogix "F431
   \Umathcode "41 = 7 \symLogix "F5C1
   \Umathcode "42 = 7 \symLogix "F5C2
   \Umathcode "43 = 7 \symLogix "F5C3 }

\newcommand \clrScript {
   \Umathcode "31 = 7 \symMathFont "31
   \Umathcode "41 = 7 \symMathFont "1D434
   \Umathcode "42 = 7 \symMathFont "1D435
   \Umathcode "43 = 7 \symMathFont "1D436 }

\newcommand \mathCal[1]   {\setMathScript #1 \clrScript}

\begin{document}

   $ A 1 B C \mathCal{ A 1 B C } A 1 B C $ 

   \end{document}

结果如下。

在此处输入图片描述

前四个符号是数学模式中的默认符号。后四个符号是应用我的 \mathCal{} 宏的结果。后四个符号是尝试重置回默认数学模式的结果。

虽然这可行,但有两个问题。首先,我必须使用 NFSSFamily=mathfont 和 \DeclareSymbolFont。其次,我必须对默认数学字体的符号位置进行硬编码。我不能假设软件包的用户已经完成了第一项操作,或者第二项操作是正确的。

此外,每个脚本都有一个基数,在本例中,F400 表示数字,F580 表示字母。我希望能够传入基数,然后编写类似 \add{\base}{"41} 的代码。这将大大减少 LaTeX 代码中所需的行数。

答案1

您不需要将数学代码重置为固定集合,您可以使用分组,例如将其排版为 aba

$ a {\mathcode`a=\mathcode`b a} a$

\bye

您还可以在设置中使用算术,例如

  \Umathcode "41 = 7 \symMathFont "1D434

可以写成

\count@="41
\Umathcode \count@ = 7 \symMathFont \numexpr "1D3F3 + \count@\relax

这使得它更适合循环。

答案2

感谢 David Carlisle,该示例现在可以在添加和重置环境时使用。这是可行的解决方案。

\documentclass[10pt]{article}

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

\setmainfont{STIX Two Text}
\setmathfont{STIX Two Math}

\usepackage{logix} % Load logix font for additional symbols.

\newcommand \calNumbrBase {"F400}
\newcommand \calAlphaBase {"F580}

\newcommand \setScript {
  \Umathcode "31 = 7 \symLogix \numexpr \calNumbrBase + "31\relax
  \Umathcode "41 = 7 \symLogix \numexpr \calAlphaBase + "41\relax
  \Umathcode "42 = 7 \symLogix \numexpr \calAlphaBase + "42\relax
  \Umathcode "43 = 7 \symLogix \numexpr \calAlphaBase + "43\relax }

\newcommand \mathCal[1]   {{\setScript #1}}

\begin{document}

   $ A 1 B C \mathCal{ A 1 B C } A 1 B C $ 

   \end{document}

相关内容