Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
74 commits
Select commit Hold shift + click to select a range
815ded5
LaTeX: the test cases of latex2mathml and mml2tex, and what they found
simonebortolin Nov 7, 2026
cd20aa9
Tests of characters outside the basic plane to and from OMML [no-new-…
simonebortolin Nov 7, 2026
1ea26a0
LaTeX: limits where TeX puts them, the symbols and environments latex…
simonebortolin Nov 8, 2026
1f07855
OMML reader: styled digits keep their style (𝟏, 𝟙, 𝟣, 𝟭, 𝟷)
simonebortolin Nov 8, 2026
f0c8d73
Merge pull request #6 from simonebortolin/claude/astral-omml-tests-ae…
simonebortolin Nov 8, 2026
b6eeafc
LaTeX reader: the LaTeX and amsmath of the latex2mathml cases it did …
simonebortolin Nov 8, 2026
697efd9
LaTeX reader: spaces before a script ignored, as after \right| (\righ…
simonebortolin Nov 8, 2026
c79283f
LaTeX reader: \lt and \gt, the < and > of MathJax
simonebortolin Nov 8, 2026
6a2697f
LaTeX: the font switches of plain TeX ({\rm rxn}), and upright capita…
simonebortolin Nov 8, 2026
05c7949
LaTeX writer: the degree sign as \degree, not \circ (∘)
simonebortolin Nov 8, 2026
c2cd997
LaTeX writer: the bar on top (menclose top) as \bar, which reads back…
simonebortolin Nov 8, 2026
2fb2c89
LaTeX reader: \overset{a}{b} followed by an identifier stays apart fr…
simonebortolin Nov 8, 2026
db91a8f
UnicodeMath writer: a fraction after a function or a script grouped, …
simonebortolin Nov 8, 2026
9dbafd8
1.0.5
simonebortolin Nov 8, 2026
3d7adb1
Merge pull request #4 from simonebortolin/claude/latex-corpus-tests
simonebortolin Nov 8, 2026
605c728
Merge main (PR #4, the latex2mathml and mml2tex corpora) into claude/…
simonebortolin Nov 8, 2026
0bebb37
Content MathML read through ctop.xsl; amssymb symbols in LaTeX
simonebortolin Nov 8, 2026
c053ada
Writer and reader fixes: bars, empty slashes, operator names, Word's …
simonebortolin Nov 8, 2026
1621231
Downgrade version prefix from 1.0.5 to 1.0.4
simonebortolin Nov 8, 2026
a5171ce
Merge pull request #7 from simonebortolin/claude/latex-webc-fixes
simonebortolin Nov 8, 2026
051b1ac
Structure operators alone (□, √) in standard LaTeX and UnicodeMath
simonebortolin Nov 8, 2026
74fb0c7
Merge main (PR #7) into claude/writer-fixes
simonebortolin Nov 8, 2026
9299685
LaTeX reader: limits of \mathop{x} and of both scripts of \overbrace,…
simonebortolin Nov 8, 2026
848163b
LaTeX reader: \newenvironment and \renewenvironment, expanded as TeX …
simonebortolin Nov 8, 2026
84e05c1
[no-new-version] Merge pull request #8 from simonebortolin/claude/wri…
simonebortolin Nov 8, 2026
da87d71
Merge remote-tracking branch 'origin/main' into claude/latex-limits-d…
simonebortolin Nov 8, 2026
870048c
[no-new-version] Run CI, CodeQL and pre-release cleanup on pull reque…
simonebortolin Nov 8, 2026
4635474
Merge fixes: one \Box in Renamed, the latex2mathml cases b6eeafc read…
simonebortolin Nov 8, 2026
0a1cb6e
Merge main into claude/latex-macros-bd8629
simonebortolin Nov 8, 2026
e2aa20f
[no-new-version] CI on every pull request, not only those against main
simonebortolin Nov 8, 2026
c8afb23
LaTeX reader: math fonts as TeX sets them
simonebortolin Nov 8, 2026
92bfa68
Merge main into claude/latex-fonts-135aed
simonebortolin Nov 8, 2026
bbb24ab
[no-new-version] Merge pull request #14 from simonebortolin/claude/ci…
simonebortolin Nov 8, 2026
65229f0
[no-new-version] Design of an equation editor for Avalonia
claude Nov 9, 2026
a1ef18d
[no-new-version] Equation editor for Avalonia: MathEditBox and MathView
claude Nov 9, 2026
743e607
[no-new-version] Editor: copy API, equation numbers, tools, demo, pac…
claude Nov 9, 2026
b41e4a0
Merge remote-tracking branch 'origin/main' into claude/latex-fonts-13…
simonebortolin Nov 9, 2026
1b6d412
[no-new-version] Commands in the public API, completion, lines, table…
claude Nov 9, 2026
e7f27c9
LaTeX reader: the space commands, \ outside environments, \middle bes…
simonebortolin Nov 9, 2026
4a285b5
Merge main into claude/content-mathml
simonebortolin Nov 9, 2026
9c542f1
Unknown LaTeX control words end at their letters [no-new-version]
simonebortolin Nov 8, 2026
af7a315
[no-new-version] Automatic line breaks of long display equations
claude Nov 9, 2026
6494340
Merge origin/main into claude/latex-bars-spaces
simonebortolin Nov 9, 2026
98cb283
mhchem: \ce and \pu in the LaTeX reader
simonebortolin Nov 9, 2026
b49e592
[no-new-version] LaTeX reader reads every command the writer writes
simonebortolin Nov 8, 2026
5fbb743
[no-new-version] Floating bar and error background in the dark theme
claude Nov 9, 2026
b30239b
[no-new-version] Merge pull request #17 from simonebortolin/claude/la…
simonebortolin Nov 9, 2026
817ed28
[no-new-version] Merge pull request #11 from simonebortolin/claude/l…
simonebortolin Nov 9, 2026
3f2d99b
[no-new-version] Paste the MathML of Word: the clipboard format as UT…
claude Nov 9, 2026
25ad9c4
[no-new-version] Merge pull request #19 from simonebortolin/claude/mh…
simonebortolin Nov 9, 2026
6847bda
Merge origin/main into claude/latex-limits-dacdf3
claude Nov 9, 2026
9c156ab
Merge claude/latex-limits-dacdf3 into claude/latex-macros-bd8629
claude Nov 9, 2026
7e9243e
Merge branch 'macros' into content
claude Nov 9, 2026
4513d53
Fix slnx demo name
simonebortolin Nov 9, 2026
688e13e
mhchem: prescripts written as \prescript, which the LaTeX reader now …
claude Nov 9, 2026
74e621b
Merge claude/content-mathml into claude/latex-unknown-command-space-4…
claude Nov 9, 2026
6a9764e
Merge claude/latex-unknown-command-space-42f4d4 into claude/latex-bar…
claude Nov 9, 2026
d53b57e
[no-new-version] Merge pull request #9 from simonebortolin/claude/lat…
simonebortolin Nov 9, 2026
0922147
[no-new-version] Merge pull request #10 from simonebortolin/claude/la…
simonebortolin Nov 9, 2026
5abcf9d
Merge pull request #13 from simonebortolin/claude/content-mathml
simonebortolin Nov 9, 2026
d24f056
Merge pull request #12 from simonebortolin/claude/latex-unknown-comma…
simonebortolin Nov 9, 2026
2365338
[no-new-version] Merge pull request #18 from simonebortolin/claude/la…
simonebortolin Nov 9, 2026
10e953a
[no-new-version] The equation editor demo on WebAssembly
claude Nov 9, 2026
0ec4cda
[no-new-version] Demo: a change of font that shows on every system
claude Nov 9, 2026
3b68f59
[no-new-version] Test: the controls follow MathFontFamily, from the d…
claude Nov 9, 2026
1d736af
Merge main into claude/focused-clarke-f4k4a9
claude Nov 9, 2026
3e14733
[no-new-version] Editor: a LaTeX command waits for its arguments; the…
claude Nov 9, 2026
0eb2b83
Merge remote-tracking branch 'origin/claude/focused-clarke-f4k4a9' in…
claude Nov 9, 2026
38badf1
[no-new-version] Test: the font each family of the controls is drawn …
claude Nov 9, 2026
52d65fc
Merge remote-tracking branch 'origin/claude/focused-clarke-f4k4a9' in…
claude Nov 9, 2026
f644cb8
Merge claude/xslt-generator: the stylesheets compiled to C#, under th…
claude Nov 9, 2026
6484cf6
[no-new-version] Cambria Math on Windows: the face of cambria.ttc wit…
claude Nov 9, 2026
9a7fe40
[no-new-version] Web demo: compiled ahead of time, without the workar…
claude Nov 9, 2026
16dc228
[no-new-version] Web demo: deployed to GitHub Pages from any branch w…
claude Nov 9, 2026
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
38 changes: 30 additions & 8 deletions .github/workflows/ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -5,8 +5,6 @@ on:
branches:
- main
pull_request:
branches:
- main
workflow_dispatch:

permissions:
Expand All @@ -23,8 +21,14 @@ env:
DOTNET_SKIP_FIRST_TIME_EXPERIENCE: 'true'
NUGET_PACKAGES: ${{ github.workspace }}/.nuget/packages
SOLUTION: SharpEquations.slnx
LIBRARY_PROJECT: src/SharpEquations/SharpEquations.csproj
# the packages, all with the version of BuildVersion.props: the converter, and the equation editor on top of it
LIBRARY_PROJECTS: >-
src/SharpEquations/SharpEquations.csproj
src/SharpEquations.Editing/SharpEquations.Editing.csproj
src/SharpEquations.Rendering/SharpEquations.Rendering.csproj
src/SharpEquations.Avalonia/SharpEquations.Avalonia.csproj
TEST_PROJECT: tests/SharpEquations.Tests/SharpEquations.Tests.csproj
EDITOR_TEST_PROJECT: tests/SharpEquations.Avalonia.Tests/SharpEquations.Avalonia.Tests.csproj
FEED_URL: https://nuget.pkg.github.com/${{ github.repository_owner }}/index.json

# Stages: Resolve Version -> Test (Linux, Windows, macOS) -> Pack NuGet
Expand Down Expand Up @@ -105,18 +109,21 @@ jobs:
label: Linux x64
os: ubuntu-latest
tfms: net10.0 net8.0
editor_tfms: net10.0 net8.0
dotnet: |
8.0.x
10.0.x
- rid: win-x64
label: Windows x64
os: windows-latest
tfms: net10.0 net481
editor_tfms: net10.0
dotnet: 10.0.x
- rid: osx-arm64
label: macOS arm64
os: macos-latest
tfms: net10.0
editor_tfms: net10.0
dotnet: 10.0.x

steps:
Expand Down Expand Up @@ -152,6 +159,19 @@ jobs:
echo "::endgroup::"
done

# the equation editor (Avalonia 12 has no .NET Framework build: net10.0, and net8.0 where it is installed)
- name: Run editor tests
shell: bash
run: |
set -e
for TFM in ${{ matrix.editor_tfms }}; do
echo "::group::editor $TFM"
dotnet run --project "$EDITOR_TEST_PROJECT" -c Release -f "$TFM" --no-build -- \
--report-trx --report-trx-filename "${{ matrix.rid }}.editor.$TFM.trx" \
--results-directory "$GITHUB_WORKSPACE/TestResults"
echo "::endgroup::"
done

- name: Upload test results
if: always()
uses: actions/upload-artifact@v7
Expand Down Expand Up @@ -201,11 +221,13 @@ jobs:
# The .snupkg symbol package is written next to the .nupkg.
- name: Pack
run: |
dotnet pack "$LIBRARY_PROJECT" \
-c Release \
-o artifacts \
-p:VersionSuffix="$VERSION_SUFFIX" \
-p:ContinuousIntegrationBuild=true
for PROJECT in $LIBRARY_PROJECTS; do
dotnet pack "$PROJECT" \
-c Release \
-o artifacts \
-p:VersionSuffix="$VERSION_SUFFIX" \
-p:ContinuousIntegrationBuild=true
done
ls -lh artifacts

# nuget.org shows the README of the package: fail if it is missing or not declared.
Expand Down
2 changes: 0 additions & 2 deletions .github/workflows/codeql.yml
Original file line number Diff line number Diff line change
Expand Up @@ -8,8 +8,6 @@ on:
branches:
- main
pull_request:
branches:
- main
schedule:
- cron: '27 4 * * 3'
workflow_dispatch:
Expand Down
69 changes: 69 additions & 0 deletions .github/workflows/demo.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,69 @@
name: Web demo

# The equation editor on WebAssembly (samples/SharpEquations.Avalonia.Browser.Demo): built on every pull request,
# published to GitHub Pages from main, or from any branch when the workflow is run by hand (Settings → Pages → Source:
# GitHub Actions; a branch other than main must be allowed in Settings → Environments → github-pages).
on:
push:
branches:
- main
pull_request:
workflow_dispatch:

permissions:
contents: read

concurrency:
group: demo-${{ github.ref }}
cancel-in-progress: true

env:
DOTNET_NOLOGO: 'true'
DOTNET_CLI_TELEMETRY_OPTOUT: 'true'
DOTNET_SKIP_FIRST_TIME_EXPERIENCE: 'true'
PROJECT: samples/SharpEquations.Avalonia.Browser.Demo/SharpEquations.Avalonia.Browser.Demo.csproj

jobs:
build:
name: Build the web demo
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v7
with:
persist-credentials: false

- name: Setup .NET
uses: actions/setup-dotnet@v6
with:
dotnet-version: '10.0.x'

- name: Install the WebAssembly workload
run: dotnet workload install wasm-tools

- name: Publish
run: dotnet publish "$PROJECT" -c Release -o publish

# GitHub Pages serves the site from a folder: no Jekyll, and the index for any path that is not a file
- name: Prepare the site
run: |
touch publish/wwwroot/.nojekyll
cp publish/wwwroot/index.html publish/wwwroot/404.html

- uses: actions/upload-pages-artifact@v4
with:
path: publish/wwwroot

deploy:
name: Deploy to GitHub Pages
if: github.event_name == 'workflow_dispatch' || github.event_name == 'push' && github.ref == 'refs/heads/main'
needs: build
runs-on: ubuntu-latest
permissions:
pages: write
id-token: write
environment:
name: github-pages
url: ${{ steps.deployment.outputs.page_url }}
steps:
- id: deployment
uses: actions/deploy-pages@v5
2 changes: 0 additions & 2 deletions .github/workflows/prerelease-cleanup.yml
Original file line number Diff line number Diff line change
Expand Up @@ -5,8 +5,6 @@ name: PR Pre-release Cleanup
on:
pull_request:
types: [closed]
branches:
- main

permissions:
contents: read
Expand Down
39 changes: 36 additions & 3 deletions AGENTS.md
Original file line number Diff line number Diff line change
Expand Up @@ -14,8 +14,14 @@ generated parser, on netstandard2.0): keep it so, and keep containers and other
| `src/SharpEquations/` | The library: `Public/` (the public API), `Internal/` (one folder per format), `Resources/` (XSLT stylesheets) |
| `src/SharpEquations.RegexPolyfill/` | Build time only: the `[GeneratedRegex]` source generator of the netstandard2.0 build |
| `src/SharpEquations.XsltGenerator/` | Build time only: the source generator that compiles the XSLT stylesheets of `Resources/` to C# |
| `src/SharpEquations.Editing/` | The equation editor's model, no user interface: `MathNode` tree, caret, selection, undo, build up and build down |
| `src/SharpEquations.Rendering/` | The layout of MathML Core over the OpenType MATH table, no user interface: `MathLayoutEngine`, `MathLayout` |
| `src/SharpEquations.Avalonia/` | The controls for Avalonia: `MathEditBox` (the editor), `MathView`; embeds Libertinus Math |
| `samples/SharpEquations.Avalonia.Demo/` | A window with the editor (`DemoView`, shared with the web demo) |
| `samples/SharpEquations.Avalonia.Browser.Demo/` | The same demo on WebAssembly (needs the `wasm-tools` workload, so not in the solution; `.github/workflows/demo.yml` publishes it to GitHub Pages) |
| `benchmarks/SharpEquations.Benchmarks/` | BenchmarkDotNet benchmarks of reading, writing and converting the corpora |
| `tests/SharpEquations.Tests/` | TUnit tests, in folders by subject (PublicApi, MathML, Omml, Mtef, UnicodeMath, LaTeX, Property, Regression) |
| `tests/SharpEquations.Avalonia.Tests/` | TUnit tests of the editor (Editing, Rendering, and the controls in a headless Avalonia session with Skia) |
| `tests/data/` | Test data and its provenance (`tests/data/README.md`) |

## Code Style
Expand Down Expand Up @@ -57,7 +63,8 @@ init-only record: `Display`, `Strict`, `PreserveFormatting`, `LaTeXFlavor` stand
`menclose notation="bottom"`. The default intents (`:fenced`, `:function`, `absolute-value`,
`binomial-coefficient`, the matrices...) are not kept, since they would make an equation differ by how it was
written (`\binom`, `⒞`, `(¦)`); `DefaultIntents.Restore` infers them again from the structure for the LaTeX and
UnicodeMath writers.
UnicodeMath writers. Content MathML of the source (`apply`, `ci`, `cn`..., outside the annotations) is first rewritten
as presentation MathML by `ctop.xsl` (David Carlisle's, see `NOTICE`), keeping the presentation MathML around it.
- `Internal/Omml/`: OMML ↔ MathML with the XSLT 1.0 stylesheets of `Resources/` (from the TEI Stylesheets, see
`NOTICE`). OMML is written as Word writes it (plain letters with `m:sty`/`m:scr`,
underbars as `m:bar`), and an upright word of OMML (`max`) is read as one identifier.
Expand All @@ -81,6 +88,27 @@ init-only record: `Display`, `Strict`, `PreserveFormatting`, `LaTeXFlavor` stand
UnicodeMath: a slash is a slash, not a fraction, and a bar without its pair is a bar, not an absolute value), and
written as standard LaTeX or as the LaTeX Word writes (`LaTeXSerializer`).

## The equation editor

`docs/EDITOR.md` is its design. The core does not depend on it: the editor is built on the public API of the core only,
and Avalonia is a dependency of `SharpEquations.Avalonia` alone (Editing and Rendering target netstandard2.0 and
net10.0 with no package, as the core).

- `Editing`: an equation being edited is a tree of `MathNode`s (the normalized MathML with a row, `mrow`, in every
slot) whose only text not built up is in runs. A run builds up with the nodes before it in its row: tokens are written
back as they were typed, structures as placeholders (Yi syllables, which the parsers read as identifiers) put back in
the result; this works because UnicodeMath round-trips exactly. Positions are paths of child indexes; offsets in runs
are code points.
- `Rendering`: `Layout/Engine.cs` lays out after MathML Core with the constants of the MATH table; the ink boxes of the
glyphs come from the outlines of the font (`OpenType/GlyphOutlines.cs`: `glyf`, or the CFF charstrings), never from
the rasterizer, and the tables from a copy of the font file (`OpenType/FontFile.cs`).
- `Avalonia`: `AvaloniaMathFont` reads the font file once with `TryGetStream` and asks Avalonia for its glyph typeface
only to draw, each time (`MathFonts.Register` registers the embedded font again with a new font manager: a headless
test session gives each test one, and a glyph typeface of the old one is released); the tests that use the headless
session are `[NotInParallel("headless")]`, since showing a window or typing runs the jobs of the dispatcher.
- The core's `EquationCommands` (public) lists the control words of UnicodeMath and the commands of LaTeX with their
symbols, for the completion of the editor; `PublicApi/EquationCommandsTests` checks that the parsers read them.

## Building and Testing

```bash
Expand All @@ -93,12 +121,17 @@ net481 (Windows, where the test project targets net10.0 and net481). The 738 exa
`tests/data/unicodemath/` test the UnicodeMath port, and `Property/RoundTripPropertyTests` checks, for all of them and
for the equations of Word documents (`tests/data/omml/`), that an equation written in its own format (UnicodeMath,
OMML) reads back to the same equation, and that one written in another format (standard LaTeX, Word's LaTeX, OMML)
loses only the first time what that format cannot hold. Keep these at 100%.
loses only the first time what that format cannot hold. Keep these at 100%. For the editor, an equation of the corpus
loaded in the editor, or built down to linear text and up again, is the same equation (100%); typed one character at a
time it is the equation of the whole text for 93% of the corpus (`Editing/CorpusTests`) and for 90% of the LaTeX of
latex2mathml (`Editing/RepositoryCorporaTests`), which a change must not lower. The public API of the editor's
packages is tracked in their `PublicAPI.*.txt`, as that of the core.

## Releases

`.github/workflows/ci.yml`, the same pipeline as SharpMediaInfo and Letra200bSharp: it tests on Linux (net10.0, net8.0),
Windows (net10.0, net481) and macOS (net10.0), packs, publishes a `pr-<N>-…` pre-release for each pull request (deleted on close by
Windows (net10.0, net481) and macOS (net10.0), packs the four packages (`SharpEquations` and the editor's `SharpEquations.Editing`, `.Rendering`, `.Avalonia`, with
one version), publishes a `pr-<N>-…` pre-release for each pull request (deleted on close by
`prerelease-cleanup.yml`) and, on `main`, tags `v<VersionPrefix>` of `BuildVersion.props`, creates the GitHub release
and pushes the package to GitHub Packages and nuget.org (Trusted Publishing, repository variable `NUGET_USER`). A change
that should release bumps `VersionPrefix`; one that should not says `[no-new-version]` in its commit message.
7 changes: 7 additions & 0 deletions Directory.Packages.props
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,13 @@
<CentralPackageTransitivePinningEnabled>true</CentralPackageTransitivePinningEnabled>
</PropertyGroup>
<ItemGroup>
<PackageVersion Include="Avalonia" Version="12.1.4" />
<PackageVersion Include="Avalonia.Browser" Version="12.1.4" />
<PackageVersion Include="Avalonia.Desktop" Version="12.1.4" />
<PackageVersion Include="Avalonia.Fonts.Inter" Version="12.1.4" />
<PackageVersion Include="Avalonia.Headless" Version="12.1.4" />
<PackageVersion Include="Avalonia.Skia" Version="12.1.4" />
<PackageVersion Include="Avalonia.Themes.Fluent" Version="12.1.4" />
<PackageVersion Include="BenchmarkDotNet" Version="0.15.8" />
<PackageVersion Include="Microsoft.SourceLink.GitHub" Version="10.0.401" PrivateAssets="All" />
<PackageVersion Include="Microsoft.CodeAnalysis.CSharp" Version="4.8.0" />
Expand Down
127 changes: 127 additions & 0 deletions NOTICE
Original file line number Diff line number Diff line change
Expand Up @@ -182,3 +182,130 @@ SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.

----------------------------------------------------------------------------
src/SharpEquations/Resources/ctop.xsl
tests/data/contentmathml/ctop-*.mml

From https://github.com/davidcarlisle/web-xslt (ctop/ctop.xsl), the XSLT 1.0
stylesheet of Content MathML to presentation MathML, and its test equations
(ctop/tests/ctopxslt.html). The web-xslt collection is distributed under the MIT
licence; ctop.xsl also under the W3C Software Notice and License, Apache 2,
MPL 1.1 or MPL 2.0. SharpEquations uses them under the MIT licence, the stylesheet
modified as described in its header:

Copyright David Carlisle 2001, 2002, 2008, 2009, 2013.

Permission is hereby granted, free of charge, to any person obtaining
a copy of this software and associated documentation files (the
"Software"), to deal in the Software without restriction, including
without limitation the rights to use, copy, modify, merge, publish,
distribute, sublicense, and/or sell copies of the Software, and to
permit persons to whom the Software is furnished to do so, subject to
the following conditions:

The above copyright notice and this permission notice shall be
included in all copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.

----------------------------------------------------------------------------
tests/data/latex/latex2mathml-*.json

Test cases from https://github.com/roniemartinez/latex2mathml:

MIT License

Copyright (c) 2016 Ronie Martinez

Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.

----------------------------------------------------------------------------
tests/data/mathml/mml2tex.json

Test cases from https://github.com/transpect/mml2tex:

Copyright (c) 2015, transpect.io
All rights reserved.

Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions are met:

* Redistributions of source code must retain the above copyright notice, this
list of conditions and the following disclaimer.

* Redistributions in binary form must reproduce the above copyright notice,
this list of conditions and the following disclaimer in the documentation
and/or other materials provided with the distribution.

THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.

----------------------------------------------------------------------------
src/SharpEquations/Internal/LaTeX/Mhchem.cs
tests/data/latex/treeblood-mhchem.json

The rules of mhchem's \ce in Mhchem.cs follow mhchem.go of https://github.com/Wyatt915/treeblood,
rewritten in C# to write LaTeX rather than MathML; the test cases are those of its test/TESTCASES.yaml:

MIT License

Copyright (c) 2024 Wyatt Sheffield

Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.

----------------------------------------------------------------------------
src/SharpEquations.Avalonia/Assets/Fonts/LibertinusMath-Regular.otf

Libertinus Math 7.040, from the Libertinus fonts, https://github.com/alerque/libertinus,
the math font that SharpEquations.Avalonia embeds for the systems without Cambria Math.
Copyright © 2012-2021 The Libertinus Project Authors, with Reserved Font Name
"Linux Libertine", "Biolinum", "STIX Fonts". Licensed under the SIL Open Font License,
Version 1.1: src/SharpEquations.Avalonia/Assets/Fonts/OFL.txt (LibertinusMath-OFL.txt in
the package).
Loading
Loading