Commit Graph

113 Commits

Author SHA1 Message Date
Nicolas Guillot
4441528f46 Implement line breaking for scripted atoms and fix atom ordering 2025-11-14 10:45:51 +01:00
Nicolas Guillot
15269e87e5 Fix large operator positioning causing incorrect atom ordering
When rendering large operators (e.g., sum, integral) with scripts in text
  mode, the operator glyph was incorrectly positioned after its subscripts
  and superscripts instead of before them. This caused expressions like
  \sum_{i=1}^{n} i = \frac{n(n+1)}{2} to render with the equals sign
  appearing visually misplaced.

  Root cause:
  The line-breaking refactoring introduced double-positioning of large
  operators. makeLargeOp() internally sets the operator position, advances
  currentPosition.x, and adds script displays. However, the calling code
  then overwrote the position and advanced currentPosition.x again, causing:
  - Double-advancement leading to incorrect width calculations
  - Scripts positioned before the operator instead of after

  Solution:
  Save and restore typesetter state before/after line break dimension checks,
  then call makeLargeOp() once at the correct position after handling line
  breaks and inter-element spacing.
2025-11-14 10:32:10 +01:00
Nicolas Guillot
8cf87ef703 inline layout for all complex atom types
Extends the width-checking pattern from fractions/radicals to ALL remaining
  complex atom types, completing Priority 1 of the multiline implementation.

  Changes:
  - Large operators (∑, ∫, ∏): Now stay inline with height+width checking
    (breaks only if height > fontSize * 2.5 OR width exceeds constraint)
  - Delimiters (\left...\right): Stay inline with maxWidth propagation to
    inner content for proper nested wrapping
  - Colors (.color, .textcolor, .colorBox): All 3 types now stay inline with
    maxWidth propagation for proper nested wrapping
  - Matrices/tables: Small matrices can now stay inline with surrounding content
  - Width constraint propagation: All recursive createLineForMathList() calls
    now properly pass maxWidth parameter

Impact:
  Before: Complex atoms always forced line breaks, even when they fit
  After: ALL complex atoms intelligently stay inline when width permits

  Examples:
  - a + ∑ xᵢ + b → 1 line instead of 3
  - (a+b) + \left(\frac{c}{d}\right) + e → stays inline with wrapping
2025-11-14 09:53:14 +01:00
Nicolas Guillot
c5b737d9bb Line breaking for fractions and radicals fixes
Implement smart width-checking for complex mathematical displays to enable
  inline rendering when space permits, dramatically improving multiline layout.

  Changes:
  - Add shouldBreakBeforeDisplay() helper to check width before line breaks
  - Add performLineBreak() helper for clean line transitions
  - Modify fraction handling to stay inline when they fit within maxWidth
  - Modify radical handling to stay inline when they fit within maxWidth
  - Support radicals with degrees (cube roots, nth roots, etc.)
2025-11-13 15:45:35 +01:00
Nicolas Guillot
9f6f5a2934 [multiple lines] inter atoms line breaking support 2025-11-13 14:52:11 +01:00
mgriebling
48fcb899fc Merge pull request #54 from nguillot/dfrac_support
Add support for dfrac and tfrac LaTeX commands
2025-11-04 09:54:02 -05:00
Nicolas Guillot
d2df078dc9 Add support for dfrac and tfrac LaTeX commands
Add display-style (dfrac) and text-style (tfrac) fraction commands
  to SwiftMath's LaTeX parser. These commands force fractions to render
  in specific styles regardless of context.

  Implementation:
  - Add dfrac parsing to prepend displaystyle to numerator/denominator
  - Add tfrac parsing to prepend textstyle to numerator/denominator
  - Implement in both parser functions in MTMathListBuilder.swift

  Testing:
  - Add testDisplayStyleFraction() for dfrac validation
  - Add testTextStyleFraction() for tfrac validation
  - Add testDisplayAndTextStyleFractions() for complex expressions
  - All 180 tests pass on macOS and iOS simulator

  Documentation:
  - Update MISSING_FEATURES.md (7/12 features now implemented, 58%)
  - Update README.md feature list to include dfrac and tfrac

  Fixes issue where equations like y'=-\dfrac{2}{x^{3}} would fail to
  parse with "Invalid command dfrac" error. This was blocking the
  StepByStep feature preview rendering.
2025-11-03 10:24:40 +01:00
Nicolas Guillot
ca0e514505 [multi line display] Fix line wrapping to respect width constraints and prevent text truncation 2025-10-27 13:33:29 +01:00
Nicolas Guillot
c7198ad9af [UI] add line wrapping functionality 2025-10-02 16:42:31 +02:00
Nicolas Guillot
11f57f7c6e add a fallback font system to render CJK text in the \text command 2025-10-01 14:11:00 +02:00
Nicolas Guillot
b67cc8fd38 [Test] fix MathFontTests on mac 2025-10-01 10:36:11 +02:00
Nicolas Guillot
fe00c5a96e add iiiint LaTeX command support 2025-10-01 10:30:03 +02:00
Nicolas Guillot
7a40cd704a pmatrix/bmatrix/vmatrix LaTeX command support 2025-10-01 10:22:56 +02:00
Nicolas Guillot
80db8c66fb smallmatrix LaTeX command support 2025-10-01 10:09:56 +02:00
Nicolas Guillot
e9ab64d844 substack LaTeX command support 2025-10-01 10:04:06 +02:00
Nicolas Guillot
61ef8dc4f8 supports all standard LaTeX math delimiters for both inline and display modes 2025-09-30 19:17:56 +02:00
Nicolas Guillot
6a5f64e402 fixup! [MTMathListBuilder] enhanced \begin{cases} environment support 2025-09-30 13:07:59 +02:00
Nicolas Guillot
7c9766f825 [MTMathListBuilder][MTTypesetter] add \cfrac support 2025-09-30 10:17:08 +02:00
Nicolas Guillot
225948c725 [MTMathListBuilder] enhanced \begin{cases} environment support
No Need to use the & character at line end. The previous notation is still supported.
2025-09-30 10:03:17 +02:00
Nicolas Guillot
5530f3910f [MTMathListBuilder] add support for some \not operators 2025-09-30 09:51:01 +02:00
Nicolas Guillot
4dcc7800d5 [MTMathAtomFactory] add support for /mod and /pmod 2025-09-30 09:35:29 +02:00
Nicolas Guillot
7f6cb02371 [MTMathAtomFactory] add support for /implies, /iint, /iiint, /nexists 2025-09-29 16:26:48 +02:00
Vilém Raška
5011e4dd79 Fixed wrong reference
mathColor was used instead of mathColorbox
2025-08-02 15:09:03 +02:00
mgriebling
bc7fcfcab8 Merge pull request #46 from Lakr233/main
Fix a crash at cell spacer insertion loop
2025-07-31 15:21:37 -04:00
Freddy Kellison-Linn
c7dcf78d11 Avoid crashing on unexpected color strings 2025-07-30 14:55:15 -04:00
Lakr
cfd646dcac Fix spacer insertion condition in table cell loop
Changed the condition to insert a spacer only when a table row has at least two cells, preventing out-of-bounds errors when accessing the second cell.
2025-07-03 15:13:23 +09:00
Daniel Resnick
a73bf8d3f1 Add layout info to MathImage
This makes it possible to align images generated by MathImage alongside text, in an AttributedString for example.
2025-05-16 18:36:32 -06:00
mgriebling
28184a044c Merge pull request #39 from lbioser/fix_color_crash
fix crush when {color}
2025-04-22 10:02:40 -04:00
Daniel Resnick
f6f4ebfa89 Fix crashes due to forced unwrapping 2025-04-16 18:10:56 -06:00
Richard
1c3bf9129a Added support for visionOS by adding to #if os(iOS) || os(visionOS) 2025-03-27 11:19:51 +01:00
libing
d84db07ef3 2025-02-12 06:15:06 +00:00
Michael Griebling
606f9be66d Fix Ø command. 2024-12-18 14:50:44 -05:00
Michael Griebling
5c251ad218 Added comments to the accents. 2024-12-18 09:17:40 -05:00
Michael Griebling
1708b07bc9 Restore original `i's. 2024-12-17 16:18:00 -05:00
Michael Griebling
c73dc863b8 Try better accented 'i'. 2024-12-17 15:39:17 -05:00
Michael Griebling
872fa0b2bf Update \cc and \CC definitions. 2024-12-17 15:24:56 -05:00
Michael Griebling
653fe396de Fixed the ç and Ç commands, \cc and \CC, respectively. 2024-12-17 11:29:42 -05:00
Michael Griebling
3f8a358984 Added special symbols. 2024-12-17 11:08:14 -05:00
Michael Griebling
d0b1ff94df Added support for accented and special characters in the input text stream. (e.g., áéíóúýàèìòùâêîôûäëïöüÿãñõçøåæœß'ÁÉÍÓÚÝÀÈÌÒÙÂÊÎÔÛÄËÏÖÜÃÑÕÇØÅÆŒ)
Also added some new commands to support special characters like \aa (å), etc.
2024-12-17 10:21:27 -05:00
Michael Griebling
07b110d07f Update internal changes. 2024-12-15 12:21:08 -05:00
Andrew Lebedev
1dbbaddbff Add thread safety for fonts cache via read-write lock in MTFontManager 2024-11-20 17:57:37 +01:00
Peter Tang
25938db765 Add NSLock to protect lazily loaded tables in multithread concurrent setting 2024-10-26 22:20:25 +08:00
Michael Griebling
55b539b74e Updated MathView examples. 2024-10-08 19:45:30 -04:00
Michael Griebling
7799485428 Added fonts and provided previews. 2024-10-08 19:35:42 -04:00
Michael Griebling
de4484382d Updated some fonts and added python script to create plist files. 2024-10-06 17:56:24 -04:00
Michael Griebling
9fecdcf563 Fix Mac version crashes on TextColor. Need at least v12. 2024-10-05 13:52:35 -04:00
Michael Griebling
428537b8d9 Put back Color code in place of txetcolor due to crashes. 2024-10-05 11:29:31 -04:00
Michael Griebling
2809379401 Removed Chinese support (messed with root). Fixed tests. 2024-10-05 10:45:03 -04:00
Michael Griebling
cfc0e75715 Added support for Chinese characters 2024-10-05 10:20:08 -04:00
zhanglecong
0da9f64eda Remove useless nil guard 2024-09-14 00:40:48 +08:00