Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
16 changes: 15 additions & 1 deletion src/SharpEquations/Internal/LaTeX/LaTeXReader.cs
Original file line number Diff line number Diff line change
Expand Up @@ -648,6 +648,14 @@ private static string RewriteTeXOnly(string latex)
i = afterUnderBase;
continue;
}
if (cw is "overbrace" or "underbrace" && Argument(tex, j) is var (braced, afterBraced) && afterBraced >= 0 &&
Scripts(tex, afterBraced) is var (braceUnder, braceOver, afterBraceScripts) && braceUnder != null && braceOver != null)
{
// \overbrace3^a_x: for TeX the brace is an operator with limits, both scripts under and over the whole construct
result.Append(RewriteTeXOnly("\\underset{" + braceUnder + "}{\\overset{" + braceOver + "}{\\" + cw + "{" + braced + "}}}"));
i = afterBraceScripts;
continue;
}
if (cw == "underset" && Arguments(tex, j, 2) is var (underArguments, afterUnderset) &&
new Text(underArguments[1].Trim()) is var overText && overText.Find("\\overset", 0) == 0 &&
Arguments(overText, 8, 2) is var (overArguments, afterOverset) && afterOverset == overText.Length)
Expand Down Expand Up @@ -718,8 +726,14 @@ private static string RewriteTeXOnly(string latex)
}
if (cw == "mathop" && BracedArgument(tex, j) is var (operatorText, afterOperator) && afterOperator >= 0)
{
// \mathop{\mathrm{argmin}}: an operator name
// \mathop{\mathrm{argmin}}: an operator name; \mathop{x}, of one symbol, a group, which takes the limits
var name = operatorText.Trim();
if (Js.Len(name) == 1)
{
result.Append('{').Append(RewriteTeXOnly(name)).Append('}');
i = afterOperator;
continue;
}
if (name.StartsWith("\\mathrm{", StringComparison.Ordinal) && name[name.Length - 1] == '}')
name = name.Substring(8, name.Length - 9);
result.Append(name.All(char.IsLetter) ? "\\operatorname{" + name + "}" : RewriteTeXOnly(operatorText));
Expand Down
6 changes: 6 additions & 0 deletions tests/SharpEquations.Tests/LaTeX/LaTeXReaderTests.cs
Original file line number Diff line number Diff line change
Expand Up @@ -137,6 +137,12 @@ public class LaTeXReaderTests
[Arguments(@"\langle a \vert b \rangle", @"\langle a|b\rangle", @"⟨𝑎│𝑏⟩")]
[Arguments(@"\left. x \right. ", @"x", @"𝑥")]
[Arguments(@"\mathop{\sum}_i", @"\sum_i", @"∑_𝑖")]
[Arguments(@"\mathop{x}\limits_0^1", @"\underset{0}{\overset{1}{x}}", @"𝑥┬0┴1")]
[Arguments(@"\underset{0}{\overset{1}{x}}", @"\underset{0}{\overset{1}{x}}", @"𝑥┬0┴1")]
[Arguments(@"\overbrace3^a_x", @"\underset{x}{\overset{a}{\overbrace{3}}}", @"⏞3┬𝑥┴𝑎")]
[Arguments(@"\underset{x}{\overset{a}{\overbrace{3}}}", @"\underset{x}{\overset{a}{\overbrace{3}}}", @"⏞3┬𝑥┴𝑎")]
[Arguments(@"\underbrace{a+b}_n^x+c", @"\underset{n}{\overset{x}{\underbrace{a+b}}}+c", @"⏟(𝑎+𝑏)┬𝑛┴𝑥+𝑐")]
[Arguments(@"\underset{n}{\overset{x}{\underbrace{a+b}}}+c", @"\underset{n}{\overset{x}{\underbrace{a+b}}}+c", @"⏟(𝑎+𝑏)┬𝑛┴𝑥+𝑐")]
[Arguments(@"\xleftarrow{g}", @"\overset{g}{\leftarrow}", @"←┴𝑔")]
[Arguments(@"\pmod n", @"(\mod\,n)", @"(mod⁡ 𝑛)")]
[Arguments(@"\hspace*{2cm}x", @"x", @"𝑥")]
Expand Down
6 changes: 3 additions & 3 deletions tests/SharpEquations.Tests/LaTeX/Latex2MathMLCorpusTests.cs
Original file line number Diff line number Diff line change
Expand Up @@ -198,12 +198,12 @@ private static string Canonical(Equation equation)

// LaTeX and amsmath that the reader does not read yet: an operator name with nothing after it (\lg, \liminf,
// \injlim, \operatorname*{argmax}_x), which UnicodeMath reads as letters, and the names of amsmath that are two
// words (lim inf); \limits after \mathop; both scripts of \overbrace and \underbrace; \middle between empty
// delimiters and bars with nothing between them (|\,|); \newenvironment and ## in a macro
// words (lim inf); \middle between empty delimiters and bars with nothing between them (|\,|); \newenvironment
// and ## in a macro
private static readonly HashSet<string> NotReadYet = new HashSet<string>
{
"lg", "liminf", "limsup", "injlim", "projlim", "varinjlim", "operatornamewithlimits", "operatorname-star",
"issue-125-4-limits", "overbrace-c", "underbrace-c", "middle", "spaces",
"middle", "spaces",
"newenvironment-multi-node", "newcommand-escaped-hash",
};

Expand Down
Loading