Summary
\blacksquare (U+25FC), \square/\Box (U+25FB), \lozenge/\Diamond (U+25CA), \blacklozenge, \blacktriangle, \bigstar, \checkmark, \maltese, and ~25 more AMS "miscellaneous symbol" macros are registered in the TeX input's AMSsymbols-mathchar0mi character map. mathchar0mi creates an <mi> token whose default mathvariant is italic. The CHTML (and SVG) output therefore renders these geometric symbols with italic styling:
- with the Gyre-Pagella dynamic CHTML font, the glyph node carries the inline style
font-family: MJX-GP-ZERO, serif; font-style: italic;, and the browser synthesizes an oblique slant for U+25FC — the black square is visibly tilted;
- the serialized MathML is semantically wrong too:
<mi>◼</mi> (italic identifier) instead of an upright ordinary symbol.
In LaTeX (amssymb), \blacksquare is \DeclareMathSymbol{\blacksquare}{\mathord}{AMSa}{"04} — a mathord, upright.
Environment
- MathJax 4.1.3
- TeX input (
input/tex), ams package enabled
- CHTML output, Gyre-Pagella font (
@mathjax/mathjax-pagella-font), dynamic font mode
Minimal reproduction
browser-repro.html
Observed
CHTML wraps the glyph in an italic identifier element:
<mjx-container ...><mjx-math ...><mjx-mi data-latex="\blacksquare"><mjx-c class="mjx-c25FC">◼</mjx-c></mjx-mi></mjx-math></mjx-container>
MathML:
<mi data-latex="\blacksquare">◼</mi>
With the Gyre-Pagella font (dynamic CHTML mode), the glyph node's inline style is:
font-family: MJX-GP-ZERO, serif; font-style: italic;
and the rendered \blacksquare is visibly slanted (browser-synthesized oblique), exactly like an italic math identifier. Compare with the base-package symbol \triangle, which renders <mi mathvariant="normal">△</mi> (upright).
Expected
\blacksquare renders upright — no font-style: italic, no synthetic slant.
- The serialized MathML should be an upright ordinary symbol (e.g.
<mi mathvariant="normal"> or an mo with no operator spacing), matching LaTeX's \mathord class.
Coverage
Scanned eleven v4 font packages (@mathjax/mathjax-*-font@4.1.3), every variant file. "✓" = the codepoint exists in at least one variant (usually the normal variant, from which italic inherits via the prototype chain — the glyph then comes from the math font and is upright); "✗" = absent from the entire package → CHTML falls back to font-style: italic; font-family: <prefix>-ZERO, serif → browser-synthesized slant.
The eleven fonts collapse into four identical-coverage groups:
- A — TeX / new-cm (default) / modern / STIX2: best coverage, only the universal 4 missing.
- B — Asana: adds
\diagup, \diagdown.
- C — Fira: misses the geometric set plus
\checkmark, \maltese.
- D — Pagella / Bonum / DejaVu / Schola / Termes (Gyre family + DejaVu): misses the geometric set plus
\blacktriangle, \blacktriangledown.
| command |
U+ |
A: TeX / new-cm / modern / STIX2 |
B: Asana |
C: Fira |
D: Pagella / Bonum / DejaVu / Schola / Termes |
\blacksquare |
25FC |
✓ |
✓ |
✗ |
✗ |
\square/\Box |
25FB |
✓ |
✓ |
✗ |
✗ |
\lozenge/\Diamond |
25CA |
✓ |
✓ |
✓ |
✓ |
\blacklozenge |
29EB |
✓ |
✓ |
✗ |
✗ |
\blacktriangle |
25B4 |
✓ |
✓ |
✓ |
✗ |
\blacktriangledown |
25BE |
✓ |
✓ |
✓ |
✗ |
\bigstar |
2605 |
✓ |
✓ |
✗ |
✗ |
\checkmark |
2713 |
✓ |
✓ |
✗ |
✓ |
\maltese |
2720 |
✓ |
✓ |
✗ |
✓ |
\hslash |
210F |
✓ |
✓ |
✓ |
✓ |
\sphericalangle |
2222 |
✓ |
✓ |
✓ |
✓ |
\measuredangle |
2221 |
✓ |
✓ |
✓ |
✓ |
\nexists |
2204 |
✓ |
✓ |
✓ |
✓ |
\complement |
2201 |
✓ |
✓ |
✓ |
✓ |
\mho |
2127 |
✓ |
✓ |
✓ |
✓ |
\Finv |
2132 |
✓ |
✓ |
✗ |
✗ |
\Game |
2141 |
✓ |
✓ |
✗ |
✗ |
\diagup |
2571 |
✓ |
✗ |
✗ |
✗ |
\diagdown |
2572 |
✓ |
✗ |
✗ |
✗ |
\yen |
00A5 |
✗ |
✗ |
✗ |
✗ |
\circledR |
00AE |
✗ |
✗ |
✗ |
✗ |
\beth/\gimel/\daleth (letter-like) |
2136–38 |
✓ |
✓ |
✓ |
✓ |
\digamma, \varkappa (letter-like) |
03DD/03F0 |
✗ |
✗ |
✗ |
✗ |
Missing counts per group (of the 26 affected entries): A = 4 (\yen, \circledR, \digamma, \varkappa) · B = 6 · C = 14 · D = 14.
Summary
\blacksquare(U+25FC),\square/\Box(U+25FB),\lozenge/\Diamond(U+25CA),\blacklozenge,\blacktriangle,\bigstar,\checkmark,\maltese, and ~25 more AMS "miscellaneous symbol" macros are registered in the TeX input'sAMSsymbols-mathchar0micharacter map.mathchar0micreates an<mi>token whose defaultmathvariantisitalic. The CHTML (and SVG) output therefore renders these geometric symbols with italic styling:font-family: MJX-GP-ZERO, serif; font-style: italic;, and the browser synthesizes an oblique slant for U+25FC — the black square is visibly tilted;<mi>◼</mi>(italic identifier) instead of an upright ordinary symbol.In LaTeX (amssymb),
\blacksquareis\DeclareMathSymbol{\blacksquare}{\mathord}{AMSa}{"04}— a mathord, upright.Environment
input/tex),amspackage enabled@mathjax/mathjax-pagella-font), dynamic font modeMinimal reproduction
browser-repro.html
Observed
CHTML wraps the glyph in an italic identifier element:
MathML:
With the Gyre-Pagella font (dynamic CHTML mode), the glyph node's inline style is:
and the rendered
\blacksquareis visibly slanted (browser-synthesized oblique), exactly like an italic math identifier. Compare with the base-package symbol\triangle, which renders<mi mathvariant="normal">△</mi>(upright).Expected
\blacksquarerenders upright — nofont-style: italic, no synthetic slant.<mi mathvariant="normal">or anmowith no operator spacing), matching LaTeX's\mathordclass.Coverage
Scanned eleven v4 font packages (
@mathjax/mathjax-*-font@4.1.3), every variant file. "✓" = the codepoint exists in at least one variant (usually the normal variant, from whichitalicinherits via the prototype chain — the glyph then comes from the math font and is upright); "✗" = absent from the entire package → CHTML falls back tofont-style: italic; font-family: <prefix>-ZERO, serif→ browser-synthesized slant.The eleven fonts collapse into four identical-coverage groups:
\diagup,\diagdown.\checkmark,\maltese.\blacktriangle,\blacktriangledown.\blacksquare\square/\Box\lozenge/\Diamond\blacklozenge\blacktriangle\blacktriangledown\bigstar\checkmark\maltese\hslash\sphericalangle\measuredangle\nexists\complement\mho\Finv\Game\diagup\diagdown\yen\circledR\beth/\gimel/\daleth(letter-like)\digamma,\varkappa(letter-like)Missing counts per group (of the 26 affected entries): A = 4 (
\yen,\circledR,\digamma,\varkappa) · B = 6 · C = 14 · D = 14.