我有一个自定义字体,在私人使用区域有十几个脚本 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}