我对大多数功能都感到满意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 个盒子寄存器可用。