feat: Allow text-mode accents in math mode, except in strict mode (#3009)

* feat: Allow text-mode accents in math mode, except in strict mode

LaTeX only issues a warning when using e.g. `\r` in math mode.
KaTeX will now do the same with the default `strict` setting of `warn`.

Fixes #2983

* Fix accent mode

Co-authored-by: ylemkimon <y@ylem.kim>
This commit is contained in:
Erik Demaine
2021-05-14 17:08:39 -04:00
committed by GitHub
parent 85687f992f
commit 0e9acce9be
3 changed files with 21 additions and 8 deletions

View File

@@ -249,15 +249,22 @@ defineFunction({
props: {
numArgs: 1,
allowedInText: true,
allowedInMath: false,
allowedInMath: true, // unless in strict mode
argTypes: ["primitive"],
},
handler: (context, args) => {
const base = args[0];
let mode = context.parser.mode;
if (mode === "math") {
context.parser.settings.reportNonstrict("mathVsTextAccents",
`LaTeX's accent ${context.funcName} works only in text mode`);
mode = "text";
}
return {
type: "accent",
mode: context.parser.mode,
mode: mode,
label: context.funcName,
isStretchy: false,
isShifty: true,

View File

@@ -1,3 +1,5 @@
import {strictSettings} from "./helpers";
describe("Parser:", function() {
describe("#handleInfixNodes", function() {
@@ -84,10 +86,14 @@ describe("Parser:", function() {
"Can't use function '\\sqrt' in text mode" +
" at position 7: \\text{\\̲s̲q̲r̲t̲2 is irrational…");
});
it("rejects text-mode-only functions in math mode", function() {
expect`\'echec`.toFailWithParseError(
"Can't use function '\\'' in math mode" +
" at position 1: \\̲'̲echec");
it("rejects text-mode-only functions in math mode", () => {
expect`$`.toFailWithParseError(
"Can't use function '$' in math mode at position 1: $̲");
});
it("rejects strict-mode text-mode-only functions in math mode", () => {
expect`\'echec`.toFailWithParseError("LaTeX-incompatible input " +
"and strict mode is set to 'error': LaTeX's accent \\' works " +
"only in text mode [mathVsTextAccents]", strictSettings);
});
});

View File

@@ -56,8 +56,8 @@ expect.extend({
return expectKaTeX(expr, settings, Mode.PARSE, this.isNot);
},
toFailWithParseError: function(expr, expected = ParseError) {
return expectKaTeX(expr, undefined, Mode.PARSE, this.isNot, expected);
toFailWithParseError: function(expr, expected = ParseError, settings) {
return expectKaTeX(expr, settings, Mode.PARSE, this.isNot, expected);
},
toBuild(expr, settings) {