Releases: arnog/mathlive
v0.100.0
0.100.0 2024-06-12
Bug Fixes
-
#2396 Pressing the arrow keys in the virtual keyboard would not move the
selection in the mathfield and display a runtime error in the console. -
#2395 Added a
dispatchEvent
command which can be attached to a
custom keycap. -
#2392 Pressing the backspace key after typing several digits would
delete all the digits.Its first argument is the name of the dispatched event, and the second
argument is an object with thedetail
property, which is the data
associated with the event.{ label: "✨", command: "displatchEvent('customEvent', {detail: 'some data'})" }
To handle the event, add an event listener to the mathfield element:
mf.addEventListener('customEvent', (ev) => { console.log(ev.detail); });
0.99.0 2024-06-10
Breaking Changes
-
The
mf.offsetFromPoint()
method has been renamedmf.getOffsetFromPoint()
-
The
mf.scriptDepth()
andmf.hitboxFromOffset()
methodds have been
replaced withmf.getElementInfo()
.The
getElementInfo()
method provides more information including any id
that may have been applied with\htmlId{}
.It is useful from within a
click
handler to get more information about the
element that was clicked, e.g.mf.getElementInfo(mf.getOffsetFromPoint(ev.clientX, ev.clientY))
The info returned is an object with the following properties:
export type ElementInfo = { /** The depth in the expression tree. 0 for top-level elements */ depth?: number; /** The bounding box of the element */ bounds?: DOMRect; /** id associated with this element or its ancestor, set with `\htmlId` or `\cssId` */ id?: string; /** HTML attributes associated with element or its ancestores, set with * `\htmlData` */ data?: Record<string, string | undefined>; /** The mode (math, text or LaTeX) */ mode?: ParseMode; /** A LaTeX representation of the element */ latex?: string; /** The style (color, weight, variant, etc...) of this element. */ style?: Style; };
Bold
The way bold is handled in LaTeX is particularly confusing, reflecting
limitations of the text rendering technology of the time.
Various attempts have been made over the years to improve the rendering of
bold, but this has resulted in inconsistent behavior. Furthermore, various
implementations of LaTeX and LaTeX-like systems have implemented bold in
different ways.
This release introduces a more consistent and intuitive handling of bold,
although it may result in different rendering of some formulas compared to
some implementations of LaTeX.
The original bold command in LaTeX is \mathbf
. This command renders its
argument using a bold variant of the current font. However, only letters and
numbers can be rendered by this command. It does not affect symbols, operators,
or greek characters.
For example, \mathbf{a+b}
will render as 𝐚+𝐛
, with the a
and b
in bold,
but the +
in normal weight. Characters rendered by \mathbf
are rendered
upright, even if they would have been rendered as italic otherwise.
The \boldsymbol
command is an alternative to \mathbf
that affects more
characters, including Greek letters and symbols. It does not affect
the style of the characters, so they remain italic if they were italic before.
However, the inter-character spacing and italic correction may not be rendered correctly.
The \bm
command from the bm
package is a more modern alternative that
affects even more characters. It also preserves the style of the characters,
so they remain italic if they were italic before. The inter-character spacing
and italic correction are handled correctly.
The \bm
command is recommended over \boldsymbol
and \mathbf
. However,
it is not part of the standard LaTeX distribution, so it may not always be available.
When serializing to LaTeX, MathLive will now use \mathbf
when possible, and
fall back to \bm
when not. This should result in more consistent rendering
of bold text.
When parsing, MathLive will interpret both \mathbf
, \boldsymbol
and \bm
as
bold.
The bold style is now consistently inherited by sub-expressions.
Similarly, when applying a bold style using mf.applyStyle({weight: "bold"})
,
the bold attribute is applied to the entire selection, not just the letters
and numbers.
Mode Switching
- #2375 The
switch-mode
command has two optionals arguments, a prefix
and suffix. The prefix is inserted before the mode switch, and the suffix
after. The command was behaving incorrectly. It now behaves as expected. - It is now possible to roundtrip between math and text mode. For example,
selecting a fraction\frac{a}{b}
and pressingalt+shift+T
will convert the
selection to(a)/(b)
. Pressingalt+shift+T
again will convert it back to
\frac{a}{b}
. - When in LaTeX mode, changing the selection would sometimes unexpectedly exit
LaTeX mode, for example after the Select All command. This has been fixed.
New Features
-
\href
The
\href{url}{content}
command, a MathJax extension that allows a link
to be associated with some content, is now supported.Clicking on the content will open the link. By default, the link is opened
in a new window, and only links with a HTTP, HTTPS or FILE protocol are
allowed. This can be controlled by the newMathfieldElement.openUrl
property. This property is a function with a single argument, the URL to
be opened, that is called when the content of the\href
command is clicked on. -
Tooltip appearance
Added CSS variables to control the appearance of the toolip displayed with
\mathtip
and\texttip
:--tooltip-border
--tooltip-color
--tooltip-background-color
--tooltip-box-shadow
--tooltip-border-radius
.
-
The
maxMatrixCols
property has been added that specifies the maximum number
of columns that a matrix may have. The default value is 10, which follows the
default value from the amsmath package. The property applies to all of
the matrix environments (matrix
,pmatrix
,bmatrix
, etc.). This property is
also accessible via themax-matrix-cols
attribute. -
The virtual keyboard now supports variants for shifted-keys. This includes
support for Swedish specific characters such aså
,ä
, andö
and their
uppercase variants. -
Accept
"true"
and"false"
as values for on/off attributes in the
<math-field>
element, for example<math-field smart-fence="true">
. -
Added a
target
property (aMathfieldElement
) to theonMenuSelect
arguments. -
#2337 Added an option
MathfieldElement.restoreFocusWhenDocumentFocused
to control whether a mathfield that was previously focused regains focus
when the tab or window regains focus. This is true by default and matches
the previous behavior, and the behavior of the<textarea>
element. -
An alternate syntax for selectors with arguments. Selectors are used for
example to associate actions with a keycap, such asswitchKeyboardLayer
.
The previous syntax wascommand: ["switchKeyboardLayer", "alt-layer"]
,
the new syntax iscommand: 'switchKeyboardLayer("alt-layer")'
. This is more
concise and easier to read.
Issues Resolved
- #2387 When using a macro, the spacing around the macro was incorrect in
some cases. - #2370 The order of the
keydown
andinput
event is now consistent
with the<textarea>
element. - #2369 After typing a shortcut, using the backspace key could result
in unexpected behavior. Now, pressing the backspace key after a shortcut
has been typed will undo the conversion of the shortcut. - #2380 In some cases, when using the menu, some spurious focus/blur events
would be dispatched. - #2384 When using repeating decimals after a comma (i.e.
123{,}4(1)
),
do not use a\left...\right
command in order to get the proper spacing. - #2349 The positioning of subscripts for extensible symbols, such as
\int
was incorrect. - #2326 The Cut and Copy commands in the context menu are now working
correctly in Safari. - #2309 When using styled text (e.g.
\textit{}
), the content could
sometimes be serialized with an unnecessary\text{}
command, i.e.
\text{\textit{...}}
. - #2376 When
smart-fence
was off, the{
and}
keys would not insert
braces. - #2273 Using one of the Chinese locales would result in a runtime error.
- #2355 When pressing the down arrow key in
\sqrt[#?]{1}
from the#?
position, a runtime exception would occur. - #2298 When using screen readers, pressing the spacebar would not always
correctly focus the mathfield. - #2297 In some cases, when using touch input, the previously selected item
in a context menu would appear to be selected. - #2289 When changing the value of the mathfield, the selection is now
preserved. In addition, when using a controlled component with React an
unnecessary update is avoided. - #2282 Don't display selection when the mathfield is not focused
- #2280 Handle better very deeply nested expressions
- #2261 When a style was applied to an empty range, the style was ignored.
- #2208 When setting a variant style (i.e. blackboard, fraktur, etc...) the
style is no longer adopted by subsequent characters. - #2104, #2260 When replacing the selection by typing, the new content would not
always be correctly styled. The content now inherits the style of the
selection, or the style of the insertion point if the selection is collapsed. - Better handle the ca...
0.94.7
0.94.7 (2023-06-08)
Improvements
- #1989 Temporarily add back support for iOS versions older than 16.3.
0.94.6 (2023-05-25)
Bug Fixes
- Only display seletion when the mathfield is focused
- #1985 Add option for output format of
getPromptValue()
- #1985 Return Ascii Math output for prompts/placeholders.
Feature
- Pressing the tab key will move to the "next group" in the mathfield, if
possible.
0.94.5 (2023-05-24)
Bug Fix
- The selection in read only mathfield was no longer visible.
0.94.3 (2023-05-22)
Improvements
- The
mathVirtualKeyboard.layouts
property was a frozen array (an array
that cannot be modified) but that wasn't clear. Now, a runtime error is
produced if an attempt is made to modify the array. If using Typescript,
a compile-time error is also generated.
Bug Fixes
- #1979 Vectors were displayed with an offset
- #1978 Pasting or inserting some content could result in a runtime error
- #1978 Text content was not properly serialized in a
\text{}
command - #1682 Vectors (and other accents) are now spoken correctly
- #1981 Adjusting the selection by moving backwards could result in
a runtime error. - #1982 Improved resilience when a mathfield is in an embedded iframe
which is not allowed to access the top window by cross-origin policy. In
this situation the virtual keyboard is not available, but input via physical
keyboard will work.
0.94.2 (2023-05-22)
Bug Fixes
- #1976 Toggling the virtual keyboard several times would eventually not
display the virtual keyboard. - Only apply smartFence in math mode (not in text or LaTeX mode).
- #1975 When inserting a square root, do not insert an index by default
0.94.1 (2023-05-21)
Improvements
- Use constructable stylesheets. This results in improved performance and a
reduction of memory consuption by 2/3 in a page with 1,000 mathfields. - Improved MathML serialization (#1870, #1803, #1933, #1648, #737, #150, variants: blackboard, fraktur, bold, etc...).
Bug Fixes
- #1963 Typing a "/" after a digit containing a french decimal (
,
) did
not include the digits before the decimal.
0.94.0
0.94.0 (2023-05-18)
New Features
- Added support for
\raise
,\lower
and\raisebox
commands. Those commands
were necessary to render some chemical bonds. - Pressing
(
,[
or{
with a selection will enclose the selection with
this delimiter.
Improvements
- Improved parsing/serialization/rendering of content with a mix of text and math.
- Various rendering improvements, mostly of edge cases.
- Improved behavior of the Shift key in the math keyboard. Single-press
the Shift key to set it temporarily, double-press it key to lock it (similar
to CapsLock), triple-press it to unlock. This is similar behavior to the
ones of mobile virtual keyboards. - #1647 Improved rendering of chemical bonds, e.g.
\ce{ O\bond{~-}H}
- Only on iOS, intercepts the cmd+XCV keyboard shortcut. On other platforms,
use the standard cut/copy/paste commands, which do not require user
permission. - The tooltips displayed by the
\mathtooltip{}
and\texttip{}
commands
are now displayed when used with a static formula. - Improvements to smart fence behavior, including better undoability.
Bug Fixes
- Selection display was incorrect when the equation included a colored
background. - Pasing text while in LaTeX mode now works.
- Some of the arrows for mhchem have been renamed and are now displaying correctly
- #1964 Prevent a runtime error when a mathfield is embedded in an iframe
and MathLive is not loaded in the host document. - #1970 The environment popover was not always positioned correctly.
- Correctly return unstyled LaTeX when requested (with format
unstyled-latex
).
This strips any color/background-color/font sizing commands from the ouput. - The caret is no longer displayed twice when placed after
\cos^2
(operators
with a superscript).
New Contributors
- @dannygreg made their first contribution in #1457
- @kvas-damian made their first contribution in #1478
- @sbondaryev made their first contribution in #1524
- @gunnarmein-ts made their first contribution in #1593
- @zeyad-ahmad-aql made their first contribution in #1599
- @sritchie made their first contribution in #1702
- @androettop made their first contribution in #1806
- @boompikachu made their first contribution in #1829
- @WildYellowfin made their first contribution in #1857
- @mgreminger made their first contribution in #1887
- @eagleoflqj made their first contribution in #1954
Full Changelog: https://cortexjs.io/mathlive/changelog/
v0.63.0
New Features
- #788 Added
virtualKeyboardState
property to indicate if the virtual
keyboard is currently visible or hidden. The property can also be modified to
show or hide the virtual keyboard. - In read-only mode, do not attempt to load the sounds and do not allow the
virtual keyboard to be shown. - Export
version
(previously available asMathLive.version
). - #199 Added
infty
andint
inline shortcuts.
Bug Fixes
- #708 Pressing on the bottom part of the virtual keyboard keycap did not
trigger the key action. - The asset directory (fonts/sounds) was not properly located in some browsers
when using a CDN to load Mathlive. - Correctly focus the mathfield when the virtual keyboard is invoked.
v0.62
0.62.0 (2021-04-23)
Improvements
- #794 When a keycap on the virtual keyboard with associated alternate keys
is long pressed, the other UI elements on the screen are ignored (a scrim
element is inserted behind the panel to capture events). - On iPad OS prevent the document selection from being altered after
long-pressing an alternate key in some cases.
Bug Fixes
- A
\chi13
(0.1em) gap between the nucleus and the above element was missing
inOverUnder
atoms (\overset
, etc...). - On Safari iOS, correctly display the keyboard toggle glyph.
- #907 When using
renderMathInElement()
orrenderMathInDocument()
,
formulas containing styling information would get too aggressively coalesced,
dropping some styling. - #910 Fixed an issue introduced in 0.61.0 where some content would not get
rendered when callingrenderMathInElement()
orrenderMathInDocument()
.
v0.58
0.58.0 (2020-10-11)
New Features
-
#225 Added
onCommit
listener tomf.options
. This listener is invoked when
the user presses Enter or Return key, or when the field loses focus
and its value has changed since it acquired it.
In addition, achange
event is triggered when using aMathfieldElement
.
The event previously namedchange
has been renamed toinput
.
This mimics the behavior of<input>
and<textarea>
elements. -
#225 Changed the keyboard shortcuts to add columns and rows:
Shortcut Command ctrl/cmd + Return/Enter addRowAfter
ctrl/cmd + shift + Return/Enter addRowBefore
ctrl/cmd + ; addRowAfter
ctrl/cmd + shift + ; addRowBefore
ctrl/cmd + , addColumnAfter
ctrl/cmd + shift + , addColumnBefore
Note that Enter/Return no longer create a matrix/vector when inside a parenthesized expression. Use ctrl/cmd + Return/Enter instead.
-
Added a
commit
command to programmatically trigger theonCommit
listener
change
event. -
Added
mount
andunmount
events toMathfieldElement
-
The
$text()
method, which is deprecated, was accidentally prematurely removed.
It has been added back.
Bug Fixes
- Inline shortcuts would not always be triggered correctly,
for examplex=sin
->x\sin
instead ofx=\sin
- The text in tooltip was not vertically centered in narrow layouts (mobile devices)
- #668 Extensible symbols, such as
\xrightarrow
were incorrectly
treated as if they had an invisible boundary, resulting in the cursor
being positioned incorrectly when navigating with the keyboard.
0.57.0 (2020-10-09)
Major New Feature
This release introduce two major new features which will require code changes.
For now, the older API remains supported but it will be dropped in an
upcoming release.
#665: Web Component
Support for MathfieldElement
custom element/web component and <math-field>
tag.
The makeMathField()
method is still supported, but it will be removed in an upcoming version. You should transition to using <math-field>
or
MathfieldElement
instead.
This transition require the following changes:
- Create mathfields using
MathfieldElement
or declaratively
// Before
let mf = MathLive.makeMathField(document.createElement('div'), {
virtualKeyboardMode: 'manual',
});
mf.$latex('f(x) = \\sin x');
document.body.appendChild(mf.$el());
// After
let mfe = new MathfieldElement({
virtualKeyboardMode: 'manual',
});
mfe.value = 'f(x) = \\sin x';
document.body.appendChild(mfe);
or:
<math-field virtual-keyboard-mode="manual">f(x) = \sin x</math-field>
- Use events instead of callbacks
// Before
mf.setConfig({ onContentDidChange: (mf) => {
console.log(mf.$latex())
});
// After
mfe.addEventListener('input', (ev) => {
console.log(mfe.value);
});
#667 Modernized Public API
Support for web component is an opportunity to revisit the MathLive public API and modernize it.
The goals are:
- clarity. For example, the
$latex()
can be used to read or change the content of the mathfield. - expressiveness. For example,
$selectedText()
can return the value of the selection,
but there is no way to inspect (or save/restore) the selection. - consistency with web platform APIs when applicable, otherwise following the monaco (VSCode editor) or CodeMirror conventions primarily. As part of this proposal, the APIs of TinyMCE, CKEditor and QuillJS were also considered. For example, the method equivalent to
getConfig()
is calledgetOptions()
in most
Javascript text editor libraries.
Mathfield methods
The following Mathfield
methods have been renamed as indicated:
Before | After |
---|---|
$setConfig() |
setOptions() |
getConfig() |
getOptions() and getOption() |
$text() |
getValue() |
$latex() |
value , getValue() and setValue() |
$insert() |
insert() |
$hasFocus() |
hasFocus() |
$focus() |
focus() |
$blur() |
blur() |
$selectedText() |
mf.getValue(mf.selection) |
$selectionIsCollapsed() |
mf.selection[0].collapsed |
$selectionDepth() |
mf.selection[0].depth |
$selectionAtStart() |
mf.position === 0 |
$selectionAtEnd() |
mf.position === mf.lastPosition |
$select() |
select() |
$clearSelection() |
executeCommand('delete-previous-char') |
$keystroke() |
executeCommand() |
$typedText() |
executeCommand('typed-text') |
$perform() |
executeCommand() |
$revertToOriginalContent() |
n/a |
$el() |
n/a |
n/a | selection |
n/a | position |
The methods indicated with "n/a" in the After column have been dropped.
Only the new methods are available on MathfieldElement
(i.e. when using web components). The Mathfield
class retains both the old methods and the
new ones to facilitate the transition, but the old ones will be dropped
in an upcoming version.
There is also a new selection
property on Mathfield
and MathfieldElement
which can be used to inspect and change the selection and a position
property to inspect and change the insertion point (caret).
The getValue()
method also now take an (optional) Range
, which is
the type of the selection
property, to extract a fragment of the expression.
Default Exports
While default exports have the benefits of expediency, particularly when converting an existing code base to ES Modules, they are problematic for effective tree shaking. Therefore the default export will be eliminated.
This means that instead of:
import Mathlive from 'mathlive';
Mathlive.renderMathInDocument();
you will need to use:
import { renderMathInDocument } from 'mathlive';
renderMathInDocument();
The following functions have been renamed:
Before | After |
---|---|
MathLive.latexToAST() |
Use MathJSON |
MathLive.latexToMarkup() |
convertLatexToMarkup() |
MathLive.latexToMathML() |
convertLatexToMathMl() |
MathLive.latexToSpeakableText() |
convertLatexToSpeakableText( ) |
New Features
- #101: added
getCaretPosition()
andsetCaretPosition()
Improvements
- The Typescript types for
Selector
has been improved - The Typescript type for
getOptions()
(getConfig()
) are more accurate - The "sqrt" inline shortcut now inserts an argument
- Don't throw an error if the first argument of
\enclose
is empty - #591: add
upward
anddownward
hooks when navigating out of the
mathfield (now also sent as afocus-out
event) - Improved layout of the virtual keyboard on narrow mobile devices (fill the available width).
Bug Fixes
- #198: typing backspace while typing inline shortcuts would prevent the
shortcuts from being recognized - #573: brackets were not properly styled (i.e. color applied to them)
- #543: spurious focus/blur events were dispatched if
tabIndex
was
set to 0 on the mathfield and some area of the mathfield were clicked on.
The issue was that withtabIndex="0"
the mathfield frame would be focusable
and when that happened the focus would correctly switch to the invisible
<textarea>
element which is normally focused to receive keyboard events,
but this generated an incorrectblur
event (for the container losing focus)
and an incorrectfocus
event (for the<textarea>
gaining focus) - #599: some characters, for example "ü", would not be correctly parsed or
displayed. Note that technically, those characters are ignored by TeX,
but it's a reasonable behavior nowadays to accept them as input. - #628: typing "e" repeatedly inside a matrix would corrupt the emited
- #637: in Chrome, thin lines, such as fraction bars or square root lines
would not display at some zoom levels - The locale was not properly taking into account when it was set manually
- The
config.strings
property did not reflect the state of the localization strings - When configs was updated (e.g. new macros added), the content of the mathfield was not properly re-parsed and rendered
- When making the virtual keyboard visible, the mathfield would not be focused
- The virtual keyboard would not display correctly when the mathfield ...