From 0e9acce9bef7b8001067ef3aa3ed188418278b2d Mon Sep 17 00:00:00 2001 From: Erik Demaine Date: Fri, 14 May 2021 17:08:39 -0400 Subject: [PATCH] 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 --- src/functions/accent.js | 11 +++++++++-- test/errors-spec.js | 14 ++++++++++---- test/setup.js | 4 ++-- 3 files changed, 21 insertions(+), 8 deletions(-) diff --git a/src/functions/accent.js b/src/functions/accent.js index 98dface2..b8b9438a 100644 --- a/src/functions/accent.js +++ b/src/functions/accent.js @@ -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, diff --git a/test/errors-spec.js b/test/errors-spec.js index f7857a12..4adb1cb9 100644 --- a/test/errors-spec.js +++ b/test/errors-spec.js @@ -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); }); }); diff --git a/test/setup.js b/test/setup.js index d6ab40f3..e0f10c49 100644 --- a/test/setup.js +++ b/test/setup.js @@ -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) {