\mathcal(O) 和字体大小

\mathcal(O) 和字体大小

我使用以下神秘的 TeX 来显示大 O 和小 O 的 Landau 符号。

有一个部分解决方案可以改进 scriptscriptstyle 以便不使用小 o :请参阅下面的第二个答案。 的问题\smallOBis是错误的间距,与 相反\smallO。 我该怎么做?

% Sources :
%     1) http://forum.mathematex.net/latex-f6/bonnes-commandes-de-base-t12278.html
%     2) http://tex.stackexchange.com/questions/30944/mathcalo-and-font-size

\documentclass{article}
    \usepackage{amsmath}
    \usepackage{amsfonts}
    \usepackage{amssymb}

    \usepackage{graphicx}

    \newcommand{\bigO}[1]{\ensuremath{\mathop{}\mathopen{}\mathcal{O}\mathopen{}\left(#1\right)}}

    \newcommand\smallO[1]{
        \mathchoice
            {% \displaystyle
                \ensuremath{\mathop{}\mathopen{}{\scriptstyle\mathcal{O}}\mathopen{}\left(#1\right)}
            }
            {% \textstyle
                \ensuremath{\mathop{}\mathopen{}{\scriptstyle\mathcal{O}}\mathopen{}\left(#1\right)}
            }
            {% \scriptstyle
                \ensuremath{\mathop{}\mathopen{}{\scriptscriptstyle\mathcal{O}}\mathopen{}\left(#1\right)}
            }
            {% \scriptscriptstyle  
                \ensuremath{\mathop{}\mathopen{}{o}\mathopen{}\left(#1\right)}
            }
    }

    \newcommand\smallOBis[1]{
        \mathchoice
        {% \displaystyle
            \scriptstyle\mathcal{O}\left(#1\right)
        }
        {% \textstyle
        \scriptstyle\mathcal{O}\left(#1\right)
        }
        {% \scriptstyle
        \scriptscriptstyle\mathcal{O}\left(#1\right)
        }
        {% \scriptscriptstyle
        \scalebox{0.8}{$\scriptscriptstyle\mathcal{O}$}\left(#1\right)
        }
    }


\begin{document}

\[
    \renewcommand{\arraystretch}{1.2}%
    \begin{array}{llll} 
        \textbf{Style}            & \verb!\bigO!
        & \verb!\smallO!                          & \verb!\smallOBis!
        \\ \hline
        \verb!\displaystyle!      & \displaystyle      \bigO{\frac{1}{n}}
        & \displaystyle      1 + \smallO{\frac{1}{n}} - 2 & \displaystyle      1 + \smallOBis{\frac{1}{n}} - 2
        \\
        \verb!\textstyle!         & \textstyle         \bigO{\frac{1}{n}}
        & \textstyle         1 + \smallO{\frac{1}{n}} - 2 & \textstyle         1 + \smallOBis{\frac{1}{n}} - 2
        \\
        \verb!\scriptstyle!       & \scriptstyle       \bigO{\frac{1}{n}}
        & \scriptstyle       1 + \smallO{\frac{1}{n}} - 2 & \scriptstyle       1 + \smallOBis{\frac{1}{n}} - 2
        \\
        \verb!\scriptscriptstyle! & \scriptscriptstyle \bigO{\frac{1}{n}}
        & \scriptscriptstyle 1 + \smallO{\frac{1}{n}} - 2 & \scriptscriptstyle 1 + \smallOBis{\frac{1}{n}} - 2
    \end{array}
\]

\end{document}

答案1

这里有一个问题,就是这么小的字体大小。使用由graphicx通过以下方式\scalebox{<factor>}{<stuff>}

\documentclass{article}
\usepackage{amsmath}% http://ctan.org/pkg/amsmath
%\usepackage{amsfonts}% http://ctan.org/pkg/amsfonts
%\usepackage{amssymb}% http://ctan.org/pkg/amssymb
\usepackage{graphicx}% http://ctan.org/pkg/graphicx

\newcommand{\bigO}[1]{\ensuremath{\mathop{}\mathopen{}\mathcal{O}\mathopen{}\left(#1\right)}}

\newcommand\smallO[1]{
    \mathchoice
    {% mode \displaystyle
      \scriptstyle\mathcal{O}\left(#1\right)
    }
    {% mode \textstyle
      \scriptstyle\mathcal{O}\left(#1\right)
    }
    {% mode \scriptstyle
      \scriptscriptstyle\mathcal{O}\left(#1\right)
    }
    {% mode \scriptscriptstyle
      \scalebox{0.8}{$\scriptscriptstyle\mathcal{O}$}\left(#1\right)
    }
}

\begin{document}

\[
\renewcommand{\arraystretch}{1.2}%
\begin{array}{lll}
\textbf{Style} & \verb!\bigO! & \verb!\smallO! \\ \hline
\verb!\displaystyle! & \displaystyle\bigO{n} & \displaystyle\smallO{n} \\  \verb!\textstyle! & \textstyle\bigO{n} & \textstyle\smallO{n} \\ \verb!\scriptstyle! & \scriptstyle\bigO{n} & \scriptstyle\smallO{n} \\ \verb!\scriptscriptstyle! & \scriptscriptstyle\bigO{n} & \scriptscriptstyle\smallO{n}
\end{array}
\]

\end{document}

bigO 和 smallO 的不同尺寸

选择将 a 缩放\scriptscriptstyle\mathcal{O}80%,因为 的形状\mathcal{O}在较大的字体大小下看起来与 不同\scriptscriptstyle。我相信尝试使用较大的尺寸和较小的比例因子会提供合适的解决方案。


编辑:对 的定义进行了更新\smallOBis,如@projetmbc 更新的问题中所定义:

\documentclass{article}
\usepackage{amsmath}% http://ctan.org/pkg/amsmath
\usepackage{graphicx}% http://ctan.org/pkg/graphicx

\newcommand{\bigO}[1]{\ensuremath{\mathop{}\mathopen{}\mathcal{O}\mathopen{}\left(#1\right)}}

\newcommand\smallO[1]{
  \mathchoice
  {% \displaystyle
    \mathop{}\mathopen{}{\scriptstyle\mathcal{O}}\mathopen{}\left(#1\right)
  }
  {% \textstyle
    \mathop{}\mathopen{}{\scriptstyle\mathcal{O}}\mathopen{}\left(#1\right)
  }
  {% \scriptstyle
    \mathop{}\mathopen{}{\scriptscriptstyle\mathcal{O}}\mathopen{}\left(#1\right)
  }
  {% \scriptscriptstyle  
    \mathop{}\mathopen{}{o}\mathopen{}\left(#1\right)
  }
}

\newcommand\smallOBis[1]{
  \mathchoice
  {% \displaystyle
    \operatorname{\scriptstyle\mathcal{O}}\!\left(#1\right)
  }
  {% \textstyle
      \operatorname{\scriptstyle\mathcal{O}}\!\left(#1\right)
  }
  {% \scriptstyle
      \operatorname{\scriptscriptstyle\mathcal{O}}\left(#1\right)
  }
  {% \scriptscriptstyle
      \operatorname{\scalebox{0.8}{$\scriptscriptstyle\mathcal{O}$}}\left(#1\right)
  }
}

\begin{document}

\[
\renewcommand{\arraystretch}{1.2}%
\begin{array}{llll} 
\textbf{Style}            & \verb!\bigO!
& \verb!\smallO!                          & \verb!\smallOBis!
\\ \hline
\verb!\displaystyle!      & \displaystyle      \bigO{\frac{1}{n}}
& \displaystyle      1 + \smallO{\frac{1}{n}} - 2 & \displaystyle      1 + \smallOBis{\frac{1}{n}} - 2
\\ \verb!\textstyle!         & \textstyle         \bigO{\frac{1}{n}}
& \textstyle         1 + \smallO{\frac{1}{n}} - 2 & \textstyle         1 + \smallOBis{\frac{1}{n}} - 2
\\ \verb!\scriptstyle!       & \scriptstyle       \bigO{\frac{1}{n}}
& \scriptstyle       1 + \smallO{\frac{1}{n}} - 2 & \scriptstyle       1 + \smallOBis{\frac{1}{n}} - 2
\\ \verb!\scriptscriptstyle! & \scriptscriptstyle \bigO{\frac{1}{n}}
& \scriptscriptstyle 1 + \smallO{\frac{1}{n}} - 2 & \scriptscriptstyle 1 + \smallOBis{\frac{1}{n}} - 2
\end{array}
\]
\end{document}

在此处输入图片描述

进行了两项更改\smallOBis

  • 通过将调整大小声明\mathcal{O}为运算符\operatorname{..},从而纠正左侧其他关系/二元运算符的间距;并且
  • 使用 纠正了新运算符和右侧括号之间的间距\!

答案2

这个案例说明了为什么 Landau 选择o而不是其他花哨的字母:大写 O 很容易与小写 o 区分开来。

所以这就足够了

\newcommand{\bigO}[1]{O{\left(#1\right)}}
\newcommand{\smallO}[1]{o{\left(#1\right)}}

或者,如果觉得有必要将“O”或“o”与它前面的内容(例如一个因子)隔开,则使用

\newcommand{\bigO}[1]{\mathop{}\!O{\left(#1\right)}}
\newcommand{\smallO}[1]{\mathop{}\!o{\left(#1\right)}}

\ensuremath(这没有坏处,但最好将数学分开),没有其他与\mathop和相关的复杂操作\mathopen

如果\mathcal{O}真的需要,我不会将它用于“小 o”,特别是如果这些对象必须用于下标或上标。不过,这里有一个更简单的定义(需要图形):

\newcommand{\bigO}[1]{\mathcal{O}{\left(#1\right)}}
\newcommand\smallO[1]{
  \mathchoice
    {{\scriptstyle\mathcal{O}}}% \displaystyle
    {{\scriptstyle\mathcal{O}}}% \textstyle
    {{\scriptscriptstyle\mathcal{O}}}% \scriptstyle
    {\scalebox{.7}{$\scriptscriptstyle\mathcal{O}$}}%\scriptscriptstyle
  {\left(#1\right)}}

可能和\mathop{}\!以前一样。

这里有一个展示;在第一种方式之上,在“脚本 O”之下

在此处输入图片描述

相关内容