savesymbol 显示完全错误的符号

savesymbol 显示完全错误的符号
\documentclass{report}
\usepackage{savesym}
\savesymbol{bot}
\usepackage{MnSymbol}
\restoresymbol{MN}{bot}
\begin{document}
sda $\bot$
\end{document}

这产生了

错误符号

而不是(评论时\usepackage{MnSymbol}

正确的符号

我很困惑。我的目标是使用标准\bot符号,同时也使用 中的几个符号MnSymbol

然而:\MNbot正确显示了来自的机器人符号MnSymbol\origbot然而显示了相同但错误的符号\bot

编辑/对答案进行评论:对于像我这样的新手来说,@egreg 和 @cfr 的答案之间的主要区别在于,@egreg 的答案使用所有标准符号加上\bot来自的符号MnSymbol,而 @cfr 的答案使用来自的所有符号MnSymbol加上标准\bot符号。根据您的使用情况,两者都能很好地工作。

答案1

让我们看看\savesymbol{bot}该做什么\restoresymbol{MN}{bot}

前者本质上是先定义\let\origbot=\bot,然后取消定义\bot。后者

\global\let\MNbot=\bot
\global\let\bot=\origbot

可能有时有效,但绝对不行MnSymbol,抱歉。为什么?如果你尝试

\show\bot
\show\MNbot

重新定义后,你会看到

> \bot=\mathchar"23F.

> \MNbot=\mathchar"696.

\bot可以获得数学系列 2 中字体插槽中的任何字符"3F,但该字符恰好不是预期的符号:

  • MnSymbol不使用符号的标准编码;
  • MnSymbol变化每一个数学符号。

通过您的设置您可以获得全部来自的数学符号MnSymbol,除了\bot显示错误的符号(和来自的MnSymbol)。

我们来看一个例子:

\documentclass{report}
\usepackage{savesym}
\savesymbol{bot}
\usepackage{MnSymbol}
\restoresymbol{MN}{bot}

\begin{document}

sda $\bot$

Arrow $\rightarrow$ and integral $\int$

\end{document}

在此处输入图片描述

如果删除第 2 至第 5 行,输出将是

在此处输入图片描述

所以你的目标是“使用标准\bot符号,同时也使用来自 MnSymbol 的几个符号”肯定是无法实现的。

假设你想使用 中的“底部”符号MnSymbol。查看内部MnSymbol.sty我们发现

\Decl@Mn@Char\bot                    {MnSyC}{\mathord}

这很神秘,因为它没有告诉我们符号位于哪个位置。但我们可以通过运行

\documentclass{article}
\usepackage{MnSymbol}
\ShowCommand{\bot}
\stop

将会显示

> \bot=\mathchar"696.

我们对最后两位数字感兴趣。现在我们必须寻找MnSyC

\DeclareSymbolFont{MnSyC}         {U}  {MnSymbolC}{m}{n}
\SetSymbolFont{MnSyC}       {bold}{U}  {MnSymbolC}{b}{n}

我们回去寻找MnSymbolC,得到

\DeclareFontFamily{U}  {MnSymbolC}{}
\DeclareFontShape{U}{MnSymbolC}{m}{n}{
    <-6>  MnSymbolC5
   <6-7>  MnSymbolC6
   <7-8>  MnSymbolC7
   <8-9>  MnSymbolC8
   <9-10> MnSymbolC9
  <10-12> MnSymbolC10
  <12->   MnSymbolC12}{}
\DeclareFontShape{U}{MnSymbolC}{b}{n}{
    <-6>  MnSymbolC-Bold5
   <6-7>  MnSymbolC-Bold6
   <7-8>  MnSymbolC-Bold7
   <8-9>  MnSymbolC-Bold8
   <9-10> MnSymbolC-Bold9
  <10-12> MnSymbolC-Bold10
  <12->   MnSymbolC-Bold12}{}

因此,如果您想使用“底部”符号MnSymbol以及标准符号,您需要

\documentclass{report}

\DeclareFontFamily{U}{MnSymbolC}{}
\DeclareFontShape{U}{MnSymbolC}{m}{n}{
    <-6>  MnSymbolC5
   <6-7>  MnSymbolC6
   <7-8>  MnSymbolC7
   <8-9>  MnSymbolC8
   <9-10> MnSymbolC9
  <10-12> MnSymbolC10
  <12->   MnSymbolC12}{}
\DeclareFontShape{U}{MnSymbolC}{b}{n}{
    <-6>  MnSymbolC-Bold5
   <6-7>  MnSymbolC-Bold6
   <7-8>  MnSymbolC-Bold7
   <8-9>  MnSymbolC-Bold8
   <9-10> MnSymbolC-Bold9
  <10-12> MnSymbolC-Bold10
  <12->   MnSymbolC-Bold12}{}
\DeclareSymbolFont{MnSyC}{U}{MnSymbolC}{m}{n}
\SetSymbolFont{MnSyC}{bold}{U}{MnSymbolC}{b}{n}
\DeclareMathSymbol{\MNbot}{\mathord}{MnSyC}{"96}

\begin{document}

Standard $\bot$ and MnSymbol $\MNbot$

Arrow $\rightarrow$ and integral $\int$

\end{document}

在此处输入图片描述

是的,不会少于这个。请注意,最后一张图中的其他符号是标准符号(如上面第二张图所示)。

答案2

它节省了符号的字符位置,因此如果字体编码和字体系列相同\bot将产生原始符号。但是,当然,加载MnSymbols会改变数学字体配置,因此系列会不一样。此外,在这种情况下,编码也不相同。因此,您不仅会从错误的字体系列中获得字符,还会从错误的字体系列中获得错误的字符。

但是,您可以进行设置,以便使用您喜欢的命令访问这两个符号。例如,

\documentclass{report}
\usepackage{MnSymbol}
\let\MNbot\bot
\DeclareSymbolFont{origsymbols}     {OMS}{cmsy}{m}{n}
\DeclareMathSymbol{\bot}{\mathord}{origsymbols}{"3F}
\begin{document}
sda $\bot  \MNbot$
\end{document}

输出图像:

不同的虚假表述

[如果有人有他们喜欢的堆叠窗口管理器,最好是基于 QT 的,但不是kwin,请告诉我。我已经受够了 KDE - 而且我已经使用 KDE 十多年了。]

相关内容