当使用 unicode-math 时,如何恢复原始书法字母?

当使用 unicode-math 时,如何恢复原始书法字母?

我对大多数功能都感到满意unicode-math。但有时我发现我更喜欢以前的样子。例如,\varnothing\complement。在这些情况下,我可以在加载之前用不同的名称保存它们unicode-math,但这并不总是有效。

现在我正尝试\mathcal从纯 LaTeX 访问字母表。我该如何实现呢?


附加问题

我一直在查看unicode-math,试图弄清楚原始\mathcal字母究竟在哪里被丢弃,但我最终放弃了。

如果有人能解释一下那将会很有趣:

  • 原始\mathcal字体是如何/在哪里定义的,以及
  • 什么样的‘开关’会引发unicode-math它变得不可用。

答案1

只需用原始声明覆盖声明即可:

\documentclass{article}

\usepackage{unicode-math}

\DeclareMathAlphabet{\mathcal}{OMS}{cmsy}{m}{n}

\begin{document}
$\mathcal{DFIP}_{\mathcal{DFIP}_{\mathcal{DFIP}}}$
\end{document}

在此处输入图片描述

这是 的输出pdffonts,显示 已cmsy被使用。

name                                 type              encoding         emb sub uni object ID
------------------------------------ ----------------- ---------------- --- --- --- ---------
GQWLIO+CMSY10                        Type 1C           Builtin          yes yes no       4  0
NCPDNV+CMSY7                         Type 1C           Builtin          yes yes no       5  0
BZNGBB+CMSY5                         Type 1C           Builtin          yes yes no       6  0
MMERCJ+LMRoman10-Regular-Identity-H  CID Type 0C       Identity-H       yes yes yes      8  0

答案2

回答得非常晚,但您也可以在本地将字母的数学代码设置为纯 TeX 定义的数学代码。然后加载 Computer Modern Calligraphic 字体并重新定义\mathcal以在本地切换到此系列并使用“旧版”数学代码。

该解决方案优于其他答案,因为您可以获得上标/下标中书法字母的正确缩放比例。

\documentclass{article}

\usepackage{unicode-math}

\newtoks\legacymathcodes\legacymathcodes={
\mathcode`A="7141 \mathcode`B="7142 \mathcode`C="7143
\mathcode`D="7144 \mathcode`E="7145 \mathcode`F="7146
\mathcode`G="7147 \mathcode`H="7148 \mathcode`I="7149
\mathcode`J="714A \mathcode`K="714B \mathcode`L="714C
\mathcode`M="714D \mathcode`N="714E \mathcode`O="714F
\mathcode`P="7150 \mathcode`Q="7151 \mathcode`R="7152
\mathcode`S="7153 \mathcode`T="7154 \mathcode`U="7155
\mathcode`V="7156 \mathcode`W="7157 \mathcode`X="7158
\mathcode`Y="7159 \mathcode`Z="715A
}

\font\tensy=cmsy10
\font\sevensy=cmsy7
\font\fivesy=cmsy5
\newfam\cmcalfam
\textfont\cmcalfam=\tensy
\scriptfont\cmcalfam=\sevensy
\scriptscriptfont\cmcalfam=\fivesy
\protected\def\mathcal#1{{\fam\cmcalfam
    \the\legacymathcodes #1}}

\begin{document}
$\mathcal{DFIP}_{\mathcal{DFIP}_{\mathcal{DFIP}}}$
\end{document}

在此处输入图片描述

如果您不想输入所有的数学代码,例如如果您还想将其扩展为小写(CM 没有),您也可以在循环中设置数学代码。

\documentclass{article}

\usepackage{unicode-math}

\font\tensy=cmsy10
\font\sevensy=cmsy7
\font\fivesy=cmsy5
\newfam\cmcalfam
\textfont\cmcalfam=\tensy
\scriptfont\cmcalfam=\sevensy
\scriptscriptfont\cmcalfam=\fivesy
\protected\def\mathcal#1{%
  \begingroup
    \fam\cmcalfam
    \count0=`A
    \loop\ifnum\count0<\numexpr`Z+1\relax
      \mathcode\count0=\the\numexpr"7141 - `A + \count0\relax
      \advance\count0 by 1
    \repeat
    #1%
  \endgroup
}

\begin{document}
$\mathcal{DFIP}_{\mathcal{DFIP}_{\mathcal{DFIP}}}$
\end{document}

答案3

我只想分享一下我目前正在使用的解决方案。这远非理想,但如果您只需要书法字母表中的几个字母,那就没问题了。例如,我的整个文档中只需要 D、F、I 和 P:

\documentclass{article}

\makeatletter
\newcommand\preserveCal[2]{
    \expandafter\newsavebox\csname box@\string#1\endcsname
    \expandafter\savebox\csname box@\string#1\endcsname{\ensuremath{\mathcal{#2}}}
    \expandafter\def\expandafter#1\expandafter
        {\expandafter\usebox\csname box@\string#1\endcsname}
}
\preserveCal{\calD}{D}
\preserveCal{\calF}{F}
\preserveCal{\calI}{I}
\preserveCal{\calP}{P}
\makeatother

\usepackage{unicode-math}

\begin{document}
    \noindent$\mathcal{DFIP}$\par
    \noindent$\calD\calF\calI\calP$
\end{document}

在此处输入图片描述

这是保存被软件包破坏的符号的普遍适用的“最后手段”。问题是这些符号不会随字体缩放。此外,每个符号占用整个盒子寄存器,我相信只有 256 个盒子寄存器可用。

相关内容