我使用以下神秘的 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}
选择将 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”之下