feat: \operatornamewithlimits (and clean up \operatorname support) (#2984)

* feat: \operatornamewithlimits (and clean up \operatorname support)

Add support for `\operatornamewithlimits` (an alias to `\operatorname*`
defined in `amsmath/amsopn.sty`), and use KaTeX's existing `\@ifstar`
macro to define `\operatorname` instead of a special lexing rule
(simplifying the lexer).

* Pick up one comment

* Actually fix docs this time

Co-authored-by: Ron Kok <ronkok@comcast.net>
This commit is contained in:
Erik Demaine
2021-05-06 17:49:34 -04:00
committed by GitHub
parent 6a7e3073a7
commit e9b751b72d
4 changed files with 9 additions and 6 deletions

View File

@@ -801,6 +801,7 @@ use `\ce` instead|
|\ominus|$\ominus$||
|\operatorname|$\operatorname{asin} x$|`\operatorname{asin} x`|
|\operatorname\*|$\operatorname*{asin}\limits_y x$|`\operatorname*{asin}\limits_y x`|
|\operatornamewithlimits|$\operatornamewithlimits{asin}\limits_y x$|`\operatornamewithlimits{asin}\limits_y x`|
|\oplus|$\oplus$||
|\or|<span style="color:firebrick;">Not supported</span>||
|\origof|$\origof$||

View File

@@ -421,10 +421,10 @@ Direct Input: $+ - / * ⋅ ± × ÷ ∓ ∔ ∧ ≀ ⊎ ⊓ ⊔ ⊕
| $\argmin$ `\argmin` | $\lim$ `\lim` | $\plim$ `\plim` | $\varliminf$ `\varliminf` |
| $\det$ `\det` | $\liminf$ `\liminf` | $\Pr$ `\Pr` | $\varlimsup$ `\varlimsup` |
| $\gcd$ `\gcd` | $\limsup$ `\limsup` | $\projlim$ `\projlim` | $\varprojlim$ `\varprojlim` |
| $\inf$ `\inf` | $\max$ `\max` | $\sup$ `\sup` |$\operatorname*{f}$ `\operatorname*{f}`|
| $\inf$ `\inf` | $\max$ `\max` | $\sup$ `\sup` ||
| $\operatorname*{f}$ `\operatorname*{f}` | $\operatornamewithlimits{f}$ `\operatornamewithlimits{f}` |||
Functions in the bottom five rows of this table can take `\limits`.
Functions in the bottom six rows of this table can take `\limits`.
### \sqrt

View File

@@ -59,7 +59,6 @@ const tokenRegexString = `(${spaceRegexString}+)|` + // whitespace
`${combiningDiacriticalMarkString}*` + // ...plus accents
"|\\\\verb\\*([^]).*?\\4" + // \verb*
"|\\\\verb([^*a-zA-Z]).*?\\5" + // \verb unstarred
"|\\\\operatorname\\*" + // \operatorname*
`|${controlWordWhitespaceRegexString}` + // \macroName + spaces
`|${controlSymbolRegexString})`; // \\, \', etc.

View File

@@ -1,5 +1,6 @@
// @flow
import defineFunction, {ordargument} from "../defineFunction";
import {defineMacro} from "../macros";
import buildCommon from "../buildCommon";
import mathMLTree from "../mathMLTree";
import {SymbolNode} from "../domTree";
@@ -140,7 +141,7 @@ const mathmlBuilder: MathMLBuilder<"operatorname"> = (group, options) => {
// amsopn.dtx: \mathop{#1\kern\z@\operator@font#3}\newmcodes@
defineFunction({
type: "operatorname",
names: ["\\operatorname", "\\operatorname*"],
names: ["\\operatorname@", "\\operatornamewithlimits"],
props: {
numArgs: 1,
},
@@ -150,7 +151,7 @@ defineFunction({
type: "operatorname",
mode: parser.mode,
body: ordargument(body),
alwaysHandleSupSub: (funcName === "\\operatorname*"),
alwaysHandleSupSub: (funcName === "\\operatornamewithlimits"),
limits: false,
parentIsSupSub: false,
};
@@ -159,3 +160,5 @@ defineFunction({
mathmlBuilder,
});
defineMacro("\\operatorname",
"\\@ifstar\\operatornamewithlimits\\operatorname@");