From 9ff42a36c007f80299a2ea8963595567b1cf9798 Mon Sep 17 00:00:00 2001 From: Dan Lynch Date: Tue, 25 Aug 2026 07:35:51 +0000 Subject: [PATCH 1/3] fix: restore quotation inset --- bundle/latex2js.css | 2 +- packages/css/latex2js.css | 2 +- packages/latex2js/latex2js.css | 2 +- packages/latex2js/src/lib/headers.ts | 4 ++-- packages/latex2js/src/lib/parser.ts | 2 +- .../latex2js/test/math-env-paragraphs.test.ts | 15 +++++++++++++++ 6 files changed, 21 insertions(+), 6 deletions(-) diff --git a/bundle/latex2js.css b/bundle/latex2js.css index a08c09d7..708d61cb 100644 --- a/bundle/latex2js.css +++ b/bundle/latex2js.css @@ -36,7 +36,7 @@ span.tt { font-family: courier; } -p.quotation { +blockquote.quotation { padding: 0 0 0 15px; margin: 0 0 20px; font-size: 10pt; diff --git a/packages/css/latex2js.css b/packages/css/latex2js.css index a08c09d7..708d61cb 100644 --- a/packages/css/latex2js.css +++ b/packages/css/latex2js.css @@ -36,7 +36,7 @@ span.tt { font-family: courier; } -p.quotation { +blockquote.quotation { padding: 0 0 0 15px; margin: 0 0 20px; font-size: 10pt; diff --git a/packages/latex2js/latex2js.css b/packages/latex2js/latex2js.css index a08c09d7..708d61cb 100644 --- a/packages/latex2js/latex2js.css +++ b/packages/latex2js/latex2js.css @@ -36,7 +36,7 @@ span.tt { font-family: courier; } -p.quotation { +blockquote.quotation { padding: 0 0 0 15px; margin: 0 0 20px; font-size: 10pt; diff --git a/packages/latex2js/src/lib/headers.ts b/packages/latex2js/src/lib/headers.ts index b644ee0a..bb893333 100644 --- a/packages/latex2js/src/lib/headers.ts +++ b/packages/latex2js/src/lib/headers.ts @@ -71,7 +71,7 @@ function closed(): string { } export const Functions = { - bq: () => '

', + bq: () => '

', claim(this: any, m?: any) { return headed('Claim', 'claim', this, m); }, corollary(this: any, m?: any) { return headed('Corollary', 'corollary', this, m); }, definition(this: any, m?: any) { return headed('Definition', 'definition', this, m); }, @@ -96,7 +96,7 @@ export const Functions = { endproblem: () => closed(), endsolution: () => closed(), endtheorem: () => closed(), - eq: () => '

', + eq: () => '
', example(this: any, m?: any) { return headed('Example', 'example', this, m); }, problem(this: any, m?: any) { return headed('Problem', 'problem', this, m); }, proof: () => '

Proof

', diff --git a/packages/latex2js/src/lib/parser.ts b/packages/latex2js/src/lib/parser.ts index c4ff2887..5696e6d8 100644 --- a/packages/latex2js/src/lib/parser.ts +++ b/packages/latex2js/src/lib/parser.ts @@ -641,7 +641,7 @@ class Parser { */ paragraphize(lines: string[]): string[] { const isBlock = (l: string) => - /^\s*<(h[1-6]|ul|ol|li|p|div|table|blockquote|pre|figure)\b/i.test(l); + /^\s*<\/?(h[1-6]|ul|ol|li|p|div|table|blockquote|pre|figure)\b/i.test(l); // Display-math environments MathJax recognizes in running text. One is a // single unit however many lines it spans: splitting it across paragraph // elements breaks the begin/end into separate text nodes, and MathJax can diff --git a/packages/latex2js/test/math-env-paragraphs.test.ts b/packages/latex2js/test/math-env-paragraphs.test.ts index f7ea1afd..65f78b0d 100644 --- a/packages/latex2js/test/math-env-paragraphs.test.ts +++ b/packages/latex2js/test/math-env-paragraphs.test.ts @@ -62,4 +62,19 @@ After. expect(paras.some((l: string) => l.includes('Before.'))).toBe(true); expect(paras.some((l: string) => l.includes('After.'))).toBe(true); }); + + it('nests quotation paragraphs inside the quotation wrapper', () => { + const parsed = latex.parse(` +\\begin{quotation} +Quoted text. +\\end{quotation} + `); + const math = parsed.find((el: any) => el.type === 'math'); + const output = math.lines.join('\n'); + + expect(output).toContain('
'); + expect(output).toContain('

Quoted text.'); + expect(output).toMatch(/

Quoted text\.<\/p>\s*<\/blockquote>/); + expect(output).not.toContain('

\n
'); + }); }); From d112bf481a79a368907e98b08305d46024b6f848 Mon Sep 17 00:00:00 2001 From: Dan Lynch Date: Tue, 25 Aug 2026 07:40:13 +0000 Subject: [PATCH 2/3] fix: update shipped renderer bundle --- bundle/latex2html5.bundle.js | 62 ++++++++++++++++++------------------ 1 file changed, 31 insertions(+), 31 deletions(-) diff --git a/bundle/latex2html5.bundle.js b/bundle/latex2html5.bundle.js index 25674076..93ed1100 100644 --- a/bundle/latex2html5.bundle.js +++ b/bundle/latex2html5.bundle.js @@ -35,9 +35,9 @@ var LaTeX2HTML5 = (() => { )); var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); - // ../latex2js/src/grammar/parser.js + // packages/latex2js/src/grammar/parser.js var require_parser = __commonJS({ - "../latex2js/src/grammar/parser.js"(exports, module) { + "packages/latex2js/src/grammar/parser.js"(exports, module) { "use strict"; var peg$SyntaxError = class extends SyntaxError { constructor(message, expected, found, location2) { @@ -1417,7 +1417,7 @@ var LaTeX2HTML5 = (() => { } }); - // src/index.ts + // packages/html5/src/index.ts var index_exports = {}; __export(index_exports, { DEFAULT_CONFIG: () => DEFAULT_CONFIG, @@ -1432,7 +1432,7 @@ var LaTeX2HTML5 = (() => { verbatim: () => render5 }); - // ../utils/src/expression.ts + // packages/utils/src/expression.ts var ExpressionError = class extends Error { constructor(message, position) { super(message); @@ -1711,7 +1711,7 @@ var LaTeX2HTML5 = (() => { }; } - // ../utils/src/svg-utils.ts + // packages/utils/src/svg-utils.ts var SVGSelection = class _SVGSelection { constructor(elements) { if (elements instanceof Element) { @@ -1793,7 +1793,7 @@ var LaTeX2HTML5 = (() => { return new SVGSelection(selector); } - // ../utils/src/index.ts + // packages/utils/src/index.ts var simplerepl = function(regex, replace) { return function(_m, contents) { return contents.replace(regex, replace); @@ -2022,7 +2022,7 @@ var LaTeX2HTML5 = (() => { return this.y1 - Number(v) / this.yunit; }; - // ../latex2js/src/lib/text.ts + // packages/latex2js/src/lib/text.ts var Expressions = { emph: /\\emph\{[^}]*\}/g, bf: /\{*\\bf [^}]*\}/g, @@ -2177,7 +2177,7 @@ var LaTeX2HTML5 = (() => { Functions }; - // ../latex2js/src/lib/headers.ts + // packages/latex2js/src/lib/headers.ts var Expressions2 = { bq: /\\begin\{quotation\}/, claim: /\\begin\{claim\*?\}/, @@ -2222,7 +2222,7 @@ var LaTeX2HTML5 = (() => { return "
"; } var Functions2 = { - bq: () => '

', + bq: () => '

', claim(m) { return headed("Claim", "claim", this, m); }, @@ -2267,7 +2267,7 @@ var LaTeX2HTML5 = (() => { endproblem: () => closed(), endsolution: () => closed(), endtheorem: () => closed(), - eq: () => "

", + eq: () => "
", example(m) { return headed("Example", "example", this, m); }, @@ -2291,7 +2291,7 @@ var LaTeX2HTML5 = (() => { Functions: Functions2 }; - // ../settings/src/index.ts + // packages/settings/src/index.ts function normalizeDialect(value) { const v = String(value ?? "").trim().toLowerCase(); if (v === "pstricks") return "pstricks"; @@ -2358,7 +2358,7 @@ var LaTeX2HTML5 = (() => { Functions: Functions3 }; - // ../pstricks/src/lib/pstricks.ts + // packages/pstricks/src/lib/pstricks.ts function radiusUnit(ctx) { const r = Number(ctx && ctx.runit); if (isFinite(r) && r > 0) return r; @@ -3033,7 +3033,7 @@ var LaTeX2HTML5 = (() => { Functions: Functions4 }; - // ../pstricks/src/lib/psgraph.ts + // packages/pstricks/src/lib/psgraph.ts var MATHJAX_READY_TIMEOUT_MS = 1e4; function mathJaxWhenReady() { const usable = (mj) => mj && typeof mj.typesetPromise === "function" ? mj : null; @@ -4058,11 +4058,11 @@ var LaTeX2HTML5 = (() => { }; var psgraph_default = psgraph; - // ../latex2js/src/lib/environments.ts + // packages/latex2js/src/lib/environments.ts var environments = ["pspicture", "verbatim", "enumerate", "print", "nicebox", "itemize", "description"]; var environments_default = environments; - // ../latex2js/src/lib/ignore.ts + // packages/latex2js/src/lib/ignore.ts var ignore = [ /^\%/, /\\begin\{document\}/, @@ -4086,10 +4086,10 @@ var LaTeX2HTML5 = (() => { ]; var ignore_default = ignore; - // ../latex2js/src/lib/parser.ts + // packages/latex2js/src/lib/parser.ts var pegParser = __toESM(require_parser()); - // ../latex2js/src/lib/dialect.ts + // packages/latex2js/src/lib/dialect.ts var CSS_ONLY_COLORS = ["lightblue", "lightgray", "lightgrey", "lightgreen", "darkblue", "darkgreen", "pink", "gold", "silver", "navy", "teal", "lime", "aqua", "fuchsia"]; var LATEX2JS_ONLY_COMMANDS = { userline: "draws a line the reader can drag; PSTricks has no interactive graphics", @@ -4161,7 +4161,7 @@ var LaTeX2HTML5 = (() => { return uses; } - // ../latex2js/src/lib/counters.ts + // packages/latex2js/src/lib/counters.ts var SECTION_LEVELS = ["section", "subsection", "subsubsection"]; var Counters = class { constructor() { @@ -4204,7 +4204,7 @@ var LaTeX2HTML5 = (() => { } }; - // ../latex2js/src/lib/parser.ts + // packages/latex2js/src/lib/parser.ts var PSSET_NON_STYLE = /* @__PURE__ */ new Set(["unit", "runit", "xunit", "yunit", "dialect"]); var DEFINECOLOR_RE = /\\definecolor\s*\{([^}]*)\}\s*\{([^}]*)\}\s*\{([^}]*)\}/; function pssetStyle(declared) { @@ -4603,7 +4603,7 @@ var LaTeX2HTML5 = (() => { * @returns the lines with runs of text wrapped in paragraphs */ paragraphize(lines) { - const isBlock = (l) => /^\s*<(h[1-6]|ul|ol|li|p|div|table|blockquote|pre|figure)\b/i.test(l); + const isBlock = (l) => /^\s*<\/?(h[1-6]|ul|ol|li|p|div|table|blockquote|pre|figure)\b/i.test(l); const mathEnvBegin = /\\begin\{(align\*?|alignat\*?|equation\*?|eqnarray\*?|gather\*?|multline\*?)\}/; const out = []; let para = []; @@ -4960,7 +4960,7 @@ var LaTeX2HTML5 = (() => { }; var parser_default = Parser2; - // ../latex2js/src/index.ts + // packages/latex2js/src/index.ts var LaTeX2HTML5 = class { constructor(Text = text_default, Headers = headers_default, Environments = environments_default, Ignore = ignore_default, PSTricks = pstricks_default, Views = {}) { this.lastDiagnostics = []; @@ -5030,7 +5030,7 @@ var LaTeX2HTML5 = (() => { } }; - // ../mathjaxjs/src/index.ts + // packages/mathjaxjs/src/index.ts var DEFAULT_SCRIPT_URL = "https://cdn.jsdelivr.net/npm/mathjax@4.1.3/tex-chtml.js"; var DEFAULT_CONFIG = { tex: { @@ -5129,7 +5129,7 @@ var LaTeX2HTML5 = (() => { } }; - // src/components/pspicture.ts + // packages/html5/src/components/pspicture.ts function render(that) { const size = psgraph_default.getSize.call(that); const width = `${size.width}px`; @@ -5190,7 +5190,7 @@ var LaTeX2HTML5 = (() => { return div; } - // src/components/nicebox.ts + // packages/html5/src/components/nicebox.ts function render2(that) { const span = document.createElement("span"); span.className = "math nicebox"; @@ -5198,7 +5198,7 @@ var LaTeX2HTML5 = (() => { return span; } - // src/components/enumerate.ts + // packages/html5/src/components/enumerate.ts function render3(that) { const lines = that.lines.map((line) => { var m = line.match(/\\item (.*)/); @@ -5214,7 +5214,7 @@ var LaTeX2HTML5 = (() => { return ul; } - // src/components/list.ts + // packages/html5/src/components/list.ts function itemizeLine(line) { var m = line.match(/\\item (.*)/); if (m) return "
  • " + m[1] + "
  • "; @@ -5249,7 +5249,7 @@ var LaTeX2HTML5 = (() => { return el; } - // src/components/verbatim.ts + // packages/html5/src/components/verbatim.ts function render5(that) { var pre = document.createElement("pre"); pre.className = "verbatim"; @@ -5257,7 +5257,7 @@ var LaTeX2HTML5 = (() => { return pre; } - // src/components/math.ts + // packages/html5/src/components/math.ts function render6(that) { const div = document.createElement("div"); div.className = "math"; @@ -5265,7 +5265,7 @@ var LaTeX2HTML5 = (() => { return div; } - // ../macros/src/index.ts + // packages/macros/src/index.ts var src_default2 = String.raw` $$ % create the definition symbol @@ -5397,7 +5397,7 @@ var LaTeX2HTML5 = (() => { $$ `; - // src/components/macros.ts + // packages/html5/src/components/macros.ts function render7(_that) { var div = document.createElement("div"); div.id = "latex-macros"; @@ -5407,7 +5407,7 @@ var LaTeX2HTML5 = (() => { return div; } - // src/index.ts + // packages/html5/src/index.ts var ELEMENTS = { pspicture: render, nicebox: render2, enumerate: render3, itemize: render4, description: render4, verbatim: render5, math: render6, macros: render7 }; function render8(tex, resolve, config) { const done = () => { From 3b15c7547c65a3d7a71d055063192c3e2e8245df Mon Sep 17 00:00:00 2001 From: Dan Lynch Date: Tue, 25 Aug 2026 07:43:54 +0000 Subject: [PATCH 3/3] fix: regenerate renderer bundle --- bundle/latex2html5.bundle.js | 56 ++++++++++++++++++------------------ 1 file changed, 28 insertions(+), 28 deletions(-) diff --git a/bundle/latex2html5.bundle.js b/bundle/latex2html5.bundle.js index 93ed1100..0b608e7a 100644 --- a/bundle/latex2html5.bundle.js +++ b/bundle/latex2html5.bundle.js @@ -35,9 +35,9 @@ var LaTeX2HTML5 = (() => { )); var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); - // packages/latex2js/src/grammar/parser.js + // ../latex2js/src/grammar/parser.js var require_parser = __commonJS({ - "packages/latex2js/src/grammar/parser.js"(exports, module) { + "../latex2js/src/grammar/parser.js"(exports, module) { "use strict"; var peg$SyntaxError = class extends SyntaxError { constructor(message, expected, found, location2) { @@ -1417,7 +1417,7 @@ var LaTeX2HTML5 = (() => { } }); - // packages/html5/src/index.ts + // src/index.ts var index_exports = {}; __export(index_exports, { DEFAULT_CONFIG: () => DEFAULT_CONFIG, @@ -1432,7 +1432,7 @@ var LaTeX2HTML5 = (() => { verbatim: () => render5 }); - // packages/utils/src/expression.ts + // ../utils/src/expression.ts var ExpressionError = class extends Error { constructor(message, position) { super(message); @@ -1711,7 +1711,7 @@ var LaTeX2HTML5 = (() => { }; } - // packages/utils/src/svg-utils.ts + // ../utils/src/svg-utils.ts var SVGSelection = class _SVGSelection { constructor(elements) { if (elements instanceof Element) { @@ -1793,7 +1793,7 @@ var LaTeX2HTML5 = (() => { return new SVGSelection(selector); } - // packages/utils/src/index.ts + // ../utils/src/index.ts var simplerepl = function(regex, replace) { return function(_m, contents) { return contents.replace(regex, replace); @@ -2022,7 +2022,7 @@ var LaTeX2HTML5 = (() => { return this.y1 - Number(v) / this.yunit; }; - // packages/latex2js/src/lib/text.ts + // ../latex2js/src/lib/text.ts var Expressions = { emph: /\\emph\{[^}]*\}/g, bf: /\{*\\bf [^}]*\}/g, @@ -2177,7 +2177,7 @@ var LaTeX2HTML5 = (() => { Functions }; - // packages/latex2js/src/lib/headers.ts + // ../latex2js/src/lib/headers.ts var Expressions2 = { bq: /\\begin\{quotation\}/, claim: /\\begin\{claim\*?\}/, @@ -2291,7 +2291,7 @@ var LaTeX2HTML5 = (() => { Functions: Functions2 }; - // packages/settings/src/index.ts + // ../settings/src/index.ts function normalizeDialect(value) { const v = String(value ?? "").trim().toLowerCase(); if (v === "pstricks") return "pstricks"; @@ -2358,7 +2358,7 @@ var LaTeX2HTML5 = (() => { Functions: Functions3 }; - // packages/pstricks/src/lib/pstricks.ts + // ../pstricks/src/lib/pstricks.ts function radiusUnit(ctx) { const r = Number(ctx && ctx.runit); if (isFinite(r) && r > 0) return r; @@ -3033,7 +3033,7 @@ var LaTeX2HTML5 = (() => { Functions: Functions4 }; - // packages/pstricks/src/lib/psgraph.ts + // ../pstricks/src/lib/psgraph.ts var MATHJAX_READY_TIMEOUT_MS = 1e4; function mathJaxWhenReady() { const usable = (mj) => mj && typeof mj.typesetPromise === "function" ? mj : null; @@ -4058,11 +4058,11 @@ var LaTeX2HTML5 = (() => { }; var psgraph_default = psgraph; - // packages/latex2js/src/lib/environments.ts + // ../latex2js/src/lib/environments.ts var environments = ["pspicture", "verbatim", "enumerate", "print", "nicebox", "itemize", "description"]; var environments_default = environments; - // packages/latex2js/src/lib/ignore.ts + // ../latex2js/src/lib/ignore.ts var ignore = [ /^\%/, /\\begin\{document\}/, @@ -4086,10 +4086,10 @@ var LaTeX2HTML5 = (() => { ]; var ignore_default = ignore; - // packages/latex2js/src/lib/parser.ts + // ../latex2js/src/lib/parser.ts var pegParser = __toESM(require_parser()); - // packages/latex2js/src/lib/dialect.ts + // ../latex2js/src/lib/dialect.ts var CSS_ONLY_COLORS = ["lightblue", "lightgray", "lightgrey", "lightgreen", "darkblue", "darkgreen", "pink", "gold", "silver", "navy", "teal", "lime", "aqua", "fuchsia"]; var LATEX2JS_ONLY_COMMANDS = { userline: "draws a line the reader can drag; PSTricks has no interactive graphics", @@ -4161,7 +4161,7 @@ var LaTeX2HTML5 = (() => { return uses; } - // packages/latex2js/src/lib/counters.ts + // ../latex2js/src/lib/counters.ts var SECTION_LEVELS = ["section", "subsection", "subsubsection"]; var Counters = class { constructor() { @@ -4204,7 +4204,7 @@ var LaTeX2HTML5 = (() => { } }; - // packages/latex2js/src/lib/parser.ts + // ../latex2js/src/lib/parser.ts var PSSET_NON_STYLE = /* @__PURE__ */ new Set(["unit", "runit", "xunit", "yunit", "dialect"]); var DEFINECOLOR_RE = /\\definecolor\s*\{([^}]*)\}\s*\{([^}]*)\}\s*\{([^}]*)\}/; function pssetStyle(declared) { @@ -4960,7 +4960,7 @@ var LaTeX2HTML5 = (() => { }; var parser_default = Parser2; - // packages/latex2js/src/index.ts + // ../latex2js/src/index.ts var LaTeX2HTML5 = class { constructor(Text = text_default, Headers = headers_default, Environments = environments_default, Ignore = ignore_default, PSTricks = pstricks_default, Views = {}) { this.lastDiagnostics = []; @@ -5030,7 +5030,7 @@ var LaTeX2HTML5 = (() => { } }; - // packages/mathjaxjs/src/index.ts + // ../mathjaxjs/src/index.ts var DEFAULT_SCRIPT_URL = "https://cdn.jsdelivr.net/npm/mathjax@4.1.3/tex-chtml.js"; var DEFAULT_CONFIG = { tex: { @@ -5129,7 +5129,7 @@ var LaTeX2HTML5 = (() => { } }; - // packages/html5/src/components/pspicture.ts + // src/components/pspicture.ts function render(that) { const size = psgraph_default.getSize.call(that); const width = `${size.width}px`; @@ -5190,7 +5190,7 @@ var LaTeX2HTML5 = (() => { return div; } - // packages/html5/src/components/nicebox.ts + // src/components/nicebox.ts function render2(that) { const span = document.createElement("span"); span.className = "math nicebox"; @@ -5198,7 +5198,7 @@ var LaTeX2HTML5 = (() => { return span; } - // packages/html5/src/components/enumerate.ts + // src/components/enumerate.ts function render3(that) { const lines = that.lines.map((line) => { var m = line.match(/\\item (.*)/); @@ -5214,7 +5214,7 @@ var LaTeX2HTML5 = (() => { return ul; } - // packages/html5/src/components/list.ts + // src/components/list.ts function itemizeLine(line) { var m = line.match(/\\item (.*)/); if (m) return "
  • " + m[1] + "
  • "; @@ -5249,7 +5249,7 @@ var LaTeX2HTML5 = (() => { return el; } - // packages/html5/src/components/verbatim.ts + // src/components/verbatim.ts function render5(that) { var pre = document.createElement("pre"); pre.className = "verbatim"; @@ -5257,7 +5257,7 @@ var LaTeX2HTML5 = (() => { return pre; } - // packages/html5/src/components/math.ts + // src/components/math.ts function render6(that) { const div = document.createElement("div"); div.className = "math"; @@ -5265,7 +5265,7 @@ var LaTeX2HTML5 = (() => { return div; } - // packages/macros/src/index.ts + // ../macros/src/index.ts var src_default2 = String.raw` $$ % create the definition symbol @@ -5397,7 +5397,7 @@ var LaTeX2HTML5 = (() => { $$ `; - // packages/html5/src/components/macros.ts + // src/components/macros.ts function render7(_that) { var div = document.createElement("div"); div.id = "latex-macros"; @@ -5407,7 +5407,7 @@ var LaTeX2HTML5 = (() => { return div; } - // packages/html5/src/index.ts + // src/index.ts var ELEMENTS = { pspicture: render, nicebox: render2, enumerate: render3, itemize: render4, description: render4, verbatim: render5, math: render6, macros: render7 }; function render8(tex, resolve, config) { const done = () => {