Ich möchte einen Befehl für Landau-Notationen (z. B. kleines o) erstellen, der ein optionales Argument aus zwei durch Komma getrennten Elementen (der Variable und dem Punkt) hätte. Wie mache ich das?
Hier ist ein Beispiel.
\documentclass[11pt]{article}
\usepackage{amsmath}
\begin{document}
% \petito[x, \infty]{\ln x}. Expected result :
$ \underset{x \rightarrow \infty}{\mathrm{o}} \left( \ln x \right)$
% \petito{\ln x}. Expected result :
$ \mathrm{o} \left( \ln x \right)$
\end{document}
Antwort1
Für mich \petito[x,\infty]{...}
ist die Syntax schlecht, sowohl beim Lesen als auch beim Parsen. Es ist einfacher, sie [x\to\infty]
direkt zu verwenden.
\documentclass[11pt]{article}
\usepackage{amsmath}
\DeclareMathOperator*{\ooo}{o}
\NewDocumentCommand\petito{o m}{
\IfNoValueTF{#1}{
% normal case
\ooo\left(#2\right)
}{
\ooo_{#1}\left(#2\right)
}
}
\begin{document}
$\petito[x\to\infty]{\ln x}$
\[
\petito[x\to\infty]{\ln x}
\]
$ \underset{x \rightarrow \infty}{\mathrm{o}} \left( \ln x \right)$
$\petito{\ln x}$
$ \mathrm{o} \left( \ln x \right)$
\end{document}
Hinweise: $...$
sollteniemalsSchreiben Sie unten, das stört den Zeilenabstand und \DeclareMathOperator*
wird daher verwendet, um ein Makro zu erstellen, das sich wie verhält \lim
.
Außerdem bin ich kein Fan der automatischen Skalierung des Zauns, habe sie aber hier gelassen.
Antwort2
Ich sehe nicht, wie die vorgeschlagene Syntax klarer oder einfacher sein könnte als
\petito_{x\to\infty}(\log x)
oder, wenn Sie die Größe der Klammern einfacher festlegen möchten,
\petito_{x\to\infty}{\log x}
mit vielleicht
\petito_{x\to\infty}[big]{\log x}
für größere Klammern oder
\petito_{x\to\infty}[*]{\log x}
für die automatische Größenanpassung.
Letztere Syntax lässt sich recht einfach mit ltcmd
(früher xparse
) realisieren.
\documentclass{article}
\usepackage{amsmath}
\NewDocumentCommand{\petito}{e{_}O{}m}{%
\genericlandau{o}{#1}{#2}{#3}%
}
\NewDocumentCommand{\grando}{e{_}O{}m}{%
\genericlandau{\mathit{O}}{#1}{#2}{#3}%
}
\ExplSyntaxOn
\NewDocumentCommand{\genericlandau}{mmmm}
{
\operatorname*{#1}
\IfValueT{#2}{\sb{#2}}% the subscript
\jowe_landau_arg:nn { #3 } { #4 }
}
\cs_new_protected:Nn \jowe_landau_arg:nn
{
\str_case:nnF { #1 }
{
{*}{\left}
{}{}
}
{ \use:c { #1l } } (
#2
\str_case:nnF { #1 }
{
{*}{\right}
{}{}
}
{ \use:c { #1r } } )
}
\ExplSyntaxOff
\begin{document}
\begin{gather}
\petito{\log x} \\
\petito[big]{\log x} \\
\petito[Big]{\log x} \\
\petito[*]{\frac{\sin x}{x}} \\
\petito_{x\to\infty}{\log x} \\
\petito_{x\to\infty}[big]{\log x} \\
\petito_{x\to\infty}[Big]{\log x} \\
\petito_{x\to\infty}[*]{\frac{\sin x}{x}} \\
\grando{\log x} \\
\grando[big]{\log x} \\
\grando[Big]{\log x} \\
\grando[*]{\frac{\sin x}{x}} \\
\grando_{x\to\infty}{\log x} \\
\grando_{x\to\infty}[big]{\log x} \\
\grando_{x\to\infty}[Big]{\log x} \\
\grando_{x\to\infty}[*]{\frac{\sin x}{x}}
\end{gather}
\end{document}