diff --git a/.devcontainer/devcontainer.json b/.devcontainer/devcontainer.json index d8ca8bee..17f19e36 100644 --- a/.devcontainer/devcontainer.json +++ b/.devcontainer/devcontainer.json @@ -10,5 +10,5 @@ "settings": { "terminal.integrated.shell.linux": "/bin/bash" }, - "postCreateCommand": "git submodule update --init --recursive && CI=true yarn install" + "postCreateCommand": "CI=true yarn install" } diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 9a2b0904..790a3696 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -16,7 +16,6 @@ jobs: steps: - uses: actions/checkout@v2 with: - submodules: recursive persist-credentials: false # minimize exposure and prevent accidental pushes - name: Use Node.js 12.x @@ -64,7 +63,6 @@ jobs: steps: - uses: actions/checkout@v2 with: - submodules: recursive fetch-depth: 0 - name: Use Node.js 12.x diff --git a/.github/workflows/fonts.yml b/.github/workflows/fonts.yml new file mode 100644 index 00000000..f59ed666 --- /dev/null +++ b/.github/workflows/fonts.yml @@ -0,0 +1,122 @@ +name: Fonts + +on: + pull_request_target: + branches: [ master ] + types: [ labeled ] # 'build fonts' label + +jobs: + docker: + runs-on: ubuntu-latest + if: contains(github.event.pull_request.labels.*.name, 'build fonts') + outputs: + image: ${{ steps.check-image.outputs.result }} + + steps: + - uses: actions/checkout@v2 + with: + ref: ${{ format('refs/pull/{0}/merge', github.event.pull_request.number) }} + persist-credentials: false # minimize exposure and prevent accidental pushes + + - name: Remove label + uses: actions/github-script@v3 + with: + github-token: ${{ secrets.GITHUB_TOKEN }} + script: | + github.issues.removeLabel({ + issue_number: context.issue.number, + owner: context.repo.owner, + repo: context.repo.repo, + name: "build fonts", + }); + + - name: Check image + id: check-image + uses: actions/github-script@v3 + with: + # https://github.community/t/github-token-has-no-access-to-new-container-rest-apis/170395 + github-token: ${{ secrets.GH_PACKAGES_TOKEN }} + result-encoding: string + script: | + /* eslint-disable camelcase, max-len, no-console */ + const org = context.repo.owner; + const package_name = "fonts"; + const version = "${{ hashFiles('dockers/fonts/Dockerfile') }}"; + + let packages; + try { + packages = (await github.request('GET /orgs/{org}/packages/{package_type}/{package_name}/versions', { + org, + package_type: "container", + package_name, + })).data; + } catch (e) { + packages = []; + console.error(e); + } + + core.setOutput("exists", packages.some(p => p.metadata.container.tags.includes(version))); + return `ghcr.io/${org}/${package_name}:${version}`.toLowerCase(); + + - name: Login to GitHub Container Registry + if: ${{ !fromJSON(steps.check-image.outputs.exists) }} + uses: docker/login-action@v1 + with: + registry: ghcr.io + username: KaTeX-bot + # https://github.community/t/cant-authenticate-with-actions-token-for-pr-event/170752 + password: ${{ secrets.GH_PACKAGES_TOKEN }} + + - name: Build and push + if: ${{ !fromJSON(steps.check-image.outputs.exists) }} + uses: docker/build-push-action@v2 + with: + context: dockers/fonts + tags: ${{ steps.check-image.outputs.result }} + push: true + + fonts: + runs-on: ubuntu-latest + needs: docker + container: + image: ${{ needs.docker.outputs.image }} + credentials: + username: KaTeX-bot + # https://github.community/t/cant-authenticate-with-actions-token-for-pr-event/170752 + password: ${{ secrets.GH_PACKAGES_TOKEN }} + + steps: + - uses: actions/checkout@v2 + with: + ref: ${{ format('refs/pull/{0}/merge', github.event.pull_request.number) }} + fetch-depth: 0 + persist-credentials: false + + - name: Build fonts + run: | + export SOURCE_DATE_EPOCH=$(git log -1 --format=%ct -- src/fonts) + make -C src/fonts all + rm -f fonts/*.* + cp src/fonts/ttf/*.ttf fonts + cp src/fonts/woff/*.woff fonts + cp src/fonts/woff2/*.woff2 fonts + echo $SOURCE_DATE_EPOCH > fonts/VERSION + + - name: Build metrics + run: ./dockers/fonts/buildMetrics.sh + + - name: Run git diff + run: | + printf '[diff "font"]\n\tbinary = true\n\ttextconv = ttx -q -i -o -' >> ~/.gitconfig + git diff --exit-code + + - uses: actions/upload-artifact@v2 + if: failure() + with: + name: fonts + path: fonts + - uses: actions/upload-artifact@v2 + if: failure() + with: + name: metrics + path: src/fontMetricsData.js diff --git a/.github/workflows/screenshotter.yml b/.github/workflows/screenshotter.yml index 15e0f98b..2bb6859e 100644 --- a/.github/workflows/screenshotter.yml +++ b/.github/workflows/screenshotter.yml @@ -40,7 +40,6 @@ jobs: - uses: actions/checkout@v2 with: ref: ${{ github.event_name == 'pull_request_target' && format('refs/pull/{0}/merge', github.event.pull_request.number) || '' }} - submodules: recursive persist-credentials: false # do not persist credentials - name: Use Node.js 14 diff --git a/.gitignore b/.gitignore index 683dd5a9..fdf1eed1 100644 --- a/.gitignore +++ b/.gitignore @@ -40,3 +40,7 @@ website/.yarn/* !website/.yarn/plugins !website/.yarn/sdks !website/.yarn/versions + +fonts.tar +fonts.tar.gz +temp/ diff --git a/.gitmodules b/.gitmodules deleted file mode 100644 index a0abb555..00000000 --- a/.gitmodules +++ /dev/null @@ -1,3 +0,0 @@ -[submodule "submodules/katex-fonts"] - path = submodules/katex-fonts - url = https://github.com/KaTeX/katex-fonts diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index fd5621e8..b34e378c 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -151,21 +151,6 @@ Flow by running `yarn test:flow`. See [Flow](https://flow.org/) for more details - commits should be squashed before merging - large pull requests should be broken into separate pull requests (or multiple logically cohesive commits), if possible -## Working with submodules - -The fonts for KaTeX live in a submodule stored in `submodules/katex-fonts`. -When you first clone the KaTeX repository, use -`git submodule update --init --recursive` to download the corresponding -fonts repository. After running `yarn`, you should have Git hooks that -will automatically run this command after switching to branches -where `submodules/katex-fonts` point to different commits. - -When submitting pull requests that update katex-fonts, you'll need to submit -two pull requests: one for [KaTeX/katex-fonts](https://github.com/KaTeX/katex-fonts) and one for [KaTeX/KaTeX](https://github.com/KaTeX/KaTeX). - -For more info about how to use git submodules, -see https://chrisjean.com/git-submodules-adding-using-removing-and-updating/. - ## CLA In order to contribute to KaTeX, you must first sign the CLA, found at www.khanacademy.org/r/cla diff --git a/dockers/fonts/Dockerfile b/dockers/fonts/Dockerfile new file mode 100644 index 00000000..ed0f31b9 --- /dev/null +++ b/dockers/fonts/Dockerfile @@ -0,0 +1,40 @@ +FROM ubuntu:14.04 +MAINTAINER xymostech + +# Install things +RUN apt-get update \ + && DEBIAN_FRONTEND=noninteractive apt-get -y upgrade \ + && DEBIAN_FRONTEND=noninteractive apt-get -y install \ + --no-install-recommends --auto-remove \ + software-properties-common \ + texlive \ + wget \ + fontforge \ + mftrace \ + man-db \ + build-essential \ + python-fontforge \ + python-dev \ + python-pip \ + pkg-config \ + libharfbuzz-dev \ + libfreetype6-dev \ + libjson-perl \ + && add-apt-repository ppa:git-core/ppa \ + && apt-get update \ + && DEBIAN_FRONTEND=noninteractive apt-get -y install \ + --no-install-recommends --auto-remove \ + git \ + && apt-get clean \ + && rm -rf /var/lib/apt/lists/* \ + && pip install fonttools==3.28.0 brotli zopfli + +# Download and compile ttfautohint +RUN wget "http://download.savannah.gnu.org/releases/freetype/ttfautohint-1.3.tar.gz" \ + && tar -xzf ttfautohint-*.tar.gz \ + && cd ttfautohint-*/ \ + && ./configure --without-qt \ + && make \ + && mv frontend/ttfautohint /usr/bin \ + && cd .. \ + && rm -r ttfautohint-* diff --git a/dockers/fonts/README.md b/dockers/fonts/README.md new file mode 100644 index 00000000..9fe1a68e --- /dev/null +++ b/dockers/fonts/README.md @@ -0,0 +1,31 @@ +### How to generate KaTeX fonts and metrics + +Originally based on MathJax font generation + +#### Fonts + +The `buildFonts.sh` script should do everything automatically, +as long as Docker is installed. + +If you want to try out a change +to [the katex-fonts repository](https://github.com/KaTeX/katex-fonts), +create a local clone (or download and unpack the ZIP file) +and specify the path to this directory as an argument to `buildFonts.sh`. +You can also specify a local or remote tarball, +e.g. a GitHub download of your own personal feature branch. + +The script `buildFonts.sh` automatically creates Docker images +from the supplied `Dockerfile`. +It uses the hash of the file to tag the image, so a change to the file +will result in the creation of a new image. +If you want to see all created images, run `docker images katex/fonts`. +To remove all generated images, you can run +`docker rmi $(docker images --format '{{.Repository}}:{{.Tag}}' katex/fonts)`. + +#### Metrics + +The script `buildMetrics.sh` generates [metrics](../../src/fontMetricsData.js) +(dimensions of each character) for the generated fonts. +See [detailed requirements for running this script](../../src/metrics/). + +If there is a problem, file a bug report. diff --git a/dockers/fonts/buildFonts.sh b/dockers/fonts/buildFonts.sh new file mode 100755 index 00000000..5b06b45c --- /dev/null +++ b/dockers/fonts/buildFonts.sh @@ -0,0 +1,101 @@ +#!/usr/bin/env bash +shopt -s extglob + +usage() { + while [[ $# -gt 1 ]]; do + echo "$1" >&2 + shift + done + echo "Usage: ${0##*/} [OPTIONS]" + echo "" + echo "OPTIONS:" + echo " -h|--help display this help" + echo " --image NAME:TAG use the named docker image [$IMAGE]" + exit $1 +} + +used_fonts=( + KaTeX_AMS-Regular + KaTeX_Caligraphic-Bold + KaTeX_Caligraphic-Regular + KaTeX_Fraktur-Bold + KaTeX_Fraktur-Regular + KaTeX_Main-Regular + KaTeX_Main-Bold + KaTeX_Main-Italic + KaTeX_Main-BoldItalic + KaTeX_Math-Italic + KaTeX_Math-BoldItalic + KaTeX_SansSerif-Bold + KaTeX_SansSerif-Italic + KaTeX_SansSerif-Regular + KaTeX_Script-Regular + KaTeX_Size1-Regular + KaTeX_Size2-Regular + KaTeX_Size3-Regular + KaTeX_Size4-Regular + KaTeX_Typewriter-Regular +) + +filetypes=( ttf woff woff2 ) + +set -e +cd "$(dirname "$0")/../.." + +cleanup() { + [[ "${CONTAINER}" ]] \ + && docker stop "${CONTAINER}" >/dev/null \ + && docker rm "${CONTAINER}" >/dev/null + CONTAINER= + [[ -f "${TMPFILE}" ]] && rm "${TMPFILE}" + TMPFILE= +} +CONTAINER= +trap cleanup EXIT + +LAST_COMMIT_DATE="$(git log -1 --format=%ct -- src/fonts)" +IMAGE="katex/fonts:DF-$(openssl sha1 $(dirname "$0")/Dockerfile | tail -c 9)" +TMPFILE="$(mktemp "${TMPDIR:-/tmp}/mjf.XXXXXXXX")" +FILE="$TMPFILE" +pushd "src" +if [[ ! -f fonts/Makefile ]]; then + echo "src does not look like katex-fonts" >&2 + exit 1 +fi +tar cfP "$FILE" ../package.json fonts +popd + +# build image if missing +if [[ $(docker images "$IMAGE" | wc -l) -lt 2 ]]; then + echo "Need to build docker image $IMAGE" + docker build --tag "$IMAGE" "$(dirname "$0")" +fi + +CMDS="set -ex +export SOURCE_DATE_EPOCH=${LAST_COMMIT_DATE} +tar xfP katex-fonts.tar.gz +make -C fonts all +tar cf /fonts.tar ${filetypes[*]/#/fonts/}" + +echo "Creating and starting docker container from image $IMAGE" +CONTAINER=$(docker create "$IMAGE" /bin/sh -c "${CMDS}") +if [[ ${FILE} ]]; then + docker cp "${FILE}" $CONTAINER:/katex-fonts.tar.gz +fi +docker start --attach $CONTAINER +docker cp $CONTAINER:/fonts.tar . +cleanup +echo "Docker executed successfully, will now unpack the fonts" + +tar xf fonts.tar +mv fonts temp +mkdir fonts +for filetype in "${filetypes[@]}"; do + for font in "${used_fonts[@]}"; do + echo "$filetype/$font" + mv "temp/$filetype/$font".* ./fonts/ + done +done +rm -rf temp fonts.tar + +echo $LAST_COMMIT_DATE > fonts/VERSION diff --git a/dockers/fonts/buildMetrics.sh b/dockers/fonts/buildMetrics.sh new file mode 100755 index 00000000..829a5a74 --- /dev/null +++ b/dockers/fonts/buildMetrics.sh @@ -0,0 +1,7 @@ +#!/bin/sh +# Generates fontMetricsData.js +PERL="perl" +PYTHON=`python2 --version >/dev/null 2>&1 && echo python2 || echo python` + +cd src/metrics +$PERL ./mapping.pl | $PYTHON ./extract_tfms.py | $PYTHON ./extract_ttfs.py | $PYTHON ./format_json.py --width > ../fontMetricsData.js diff --git a/docs/font.md b/docs/font.md index e7b30d11..1f7c886c 100644 --- a/docs/font.md +++ b/docs/font.md @@ -2,7 +2,7 @@ id: font title: Font --- -By changing the variables in the `fonts.less` file at the [katex-fonts submodule](https://github.com/KaTeX/katex-fonts/), +By changing the variables in the `src/fonts.less` file, several properties of the way fonts are used can be changed. ## Font size and lengths diff --git a/docs/node.md b/docs/node.md index cf5e5e6a..8be06e12 100644 --- a/docs/node.md +++ b/docs/node.md @@ -24,9 +24,9 @@ yarn global add katex ### Building from Source To build you will need Git, Node.js 10 or later, and Yarn. -Clone a copy of the GitHub source repository and its submodules: +Clone a copy of the GitHub source repository: ```bash -git clone --recursive https://github.com/KaTeX/KaTeX.git +git clone https://github.com/KaTeX/KaTeX.git cd KaTeX ``` diff --git a/fonts/KaTeX_AMS-Regular.ttf b/fonts/KaTeX_AMS-Regular.ttf new file mode 100644 index 00000000..aff53337 Binary files /dev/null and b/fonts/KaTeX_AMS-Regular.ttf differ diff --git a/fonts/KaTeX_AMS-Regular.woff b/fonts/KaTeX_AMS-Regular.woff new file mode 100644 index 00000000..9b826783 Binary files /dev/null and b/fonts/KaTeX_AMS-Regular.woff differ diff --git a/fonts/KaTeX_AMS-Regular.woff2 b/fonts/KaTeX_AMS-Regular.woff2 new file mode 100644 index 00000000..e0a9e4d0 Binary files /dev/null and b/fonts/KaTeX_AMS-Regular.woff2 differ diff --git a/fonts/KaTeX_Caligraphic-Bold.ttf b/fonts/KaTeX_Caligraphic-Bold.ttf new file mode 100644 index 00000000..17f601df Binary files /dev/null and b/fonts/KaTeX_Caligraphic-Bold.ttf differ diff --git a/fonts/KaTeX_Caligraphic-Bold.woff b/fonts/KaTeX_Caligraphic-Bold.woff new file mode 100644 index 00000000..d0e5f820 Binary files /dev/null and b/fonts/KaTeX_Caligraphic-Bold.woff differ diff --git a/fonts/KaTeX_Caligraphic-Bold.woff2 b/fonts/KaTeX_Caligraphic-Bold.woff2 new file mode 100644 index 00000000..9fffa809 Binary files /dev/null and b/fonts/KaTeX_Caligraphic-Bold.woff2 differ diff --git a/fonts/KaTeX_Caligraphic-Regular.ttf b/fonts/KaTeX_Caligraphic-Regular.ttf new file mode 100644 index 00000000..4a3bfa8b Binary files /dev/null and b/fonts/KaTeX_Caligraphic-Regular.ttf differ diff --git a/fonts/KaTeX_Caligraphic-Regular.woff b/fonts/KaTeX_Caligraphic-Regular.woff new file mode 100644 index 00000000..325fa0a2 Binary files /dev/null and b/fonts/KaTeX_Caligraphic-Regular.woff differ diff --git a/fonts/KaTeX_Caligraphic-Regular.woff2 b/fonts/KaTeX_Caligraphic-Regular.woff2 new file mode 100644 index 00000000..1be84ba9 Binary files /dev/null and b/fonts/KaTeX_Caligraphic-Regular.woff2 differ diff --git a/fonts/KaTeX_Fraktur-Bold.ttf b/fonts/KaTeX_Fraktur-Bold.ttf new file mode 100644 index 00000000..0b682b98 Binary files /dev/null and b/fonts/KaTeX_Fraktur-Bold.ttf differ diff --git a/fonts/KaTeX_Fraktur-Bold.woff b/fonts/KaTeX_Fraktur-Bold.woff new file mode 100644 index 00000000..25a39aea Binary files /dev/null and b/fonts/KaTeX_Fraktur-Bold.woff differ diff --git a/fonts/KaTeX_Fraktur-Bold.woff2 b/fonts/KaTeX_Fraktur-Bold.woff2 new file mode 100644 index 00000000..78249c2a Binary files /dev/null and b/fonts/KaTeX_Fraktur-Bold.woff2 differ diff --git a/fonts/KaTeX_Fraktur-Regular.ttf b/fonts/KaTeX_Fraktur-Regular.ttf new file mode 100644 index 00000000..ec340ff6 Binary files /dev/null and b/fonts/KaTeX_Fraktur-Regular.ttf differ diff --git a/fonts/KaTeX_Fraktur-Regular.woff b/fonts/KaTeX_Fraktur-Regular.woff new file mode 100644 index 00000000..e042e7cb Binary files /dev/null and b/fonts/KaTeX_Fraktur-Regular.woff differ diff --git a/fonts/KaTeX_Fraktur-Regular.woff2 b/fonts/KaTeX_Fraktur-Regular.woff2 new file mode 100644 index 00000000..a074dfb7 Binary files /dev/null and b/fonts/KaTeX_Fraktur-Regular.woff2 differ diff --git a/fonts/KaTeX_Main-Bold.ttf b/fonts/KaTeX_Main-Bold.ttf new file mode 100644 index 00000000..fecf8e62 Binary files /dev/null and b/fonts/KaTeX_Main-Bold.ttf differ diff --git a/fonts/KaTeX_Main-Bold.woff b/fonts/KaTeX_Main-Bold.woff new file mode 100644 index 00000000..49ee886a Binary files /dev/null and b/fonts/KaTeX_Main-Bold.woff differ diff --git a/fonts/KaTeX_Main-Bold.woff2 b/fonts/KaTeX_Main-Bold.woff2 new file mode 100644 index 00000000..a57328e1 Binary files /dev/null and b/fonts/KaTeX_Main-Bold.woff2 differ diff --git a/fonts/KaTeX_Main-BoldItalic.ttf b/fonts/KaTeX_Main-BoldItalic.ttf new file mode 100644 index 00000000..302f1b5e Binary files /dev/null and b/fonts/KaTeX_Main-BoldItalic.ttf differ diff --git a/fonts/KaTeX_Main-BoldItalic.woff b/fonts/KaTeX_Main-BoldItalic.woff new file mode 100644 index 00000000..d6ea5a6e Binary files /dev/null and b/fonts/KaTeX_Main-BoldItalic.woff differ diff --git a/fonts/KaTeX_Main-BoldItalic.woff2 b/fonts/KaTeX_Main-BoldItalic.woff2 new file mode 100644 index 00000000..429768e2 Binary files /dev/null and b/fonts/KaTeX_Main-BoldItalic.woff2 differ diff --git a/fonts/KaTeX_Main-Italic.ttf b/fonts/KaTeX_Main-Italic.ttf new file mode 100644 index 00000000..14599bbe Binary files /dev/null and b/fonts/KaTeX_Main-Italic.ttf differ diff --git a/fonts/KaTeX_Main-Italic.woff b/fonts/KaTeX_Main-Italic.woff new file mode 100644 index 00000000..3728e330 Binary files /dev/null and b/fonts/KaTeX_Main-Italic.woff differ diff --git a/fonts/KaTeX_Main-Italic.woff2 b/fonts/KaTeX_Main-Italic.woff2 new file mode 100644 index 00000000..a732e3e3 Binary files /dev/null and b/fonts/KaTeX_Main-Italic.woff2 differ diff --git a/fonts/KaTeX_Main-Regular.ttf b/fonts/KaTeX_Main-Regular.ttf new file mode 100644 index 00000000..28ca0854 Binary files /dev/null and b/fonts/KaTeX_Main-Regular.ttf differ diff --git a/fonts/KaTeX_Main-Regular.woff b/fonts/KaTeX_Main-Regular.woff new file mode 100644 index 00000000..5c681b1a Binary files /dev/null and b/fonts/KaTeX_Main-Regular.woff differ diff --git a/fonts/KaTeX_Main-Regular.woff2 b/fonts/KaTeX_Main-Regular.woff2 new file mode 100644 index 00000000..8275bd68 Binary files /dev/null and b/fonts/KaTeX_Main-Regular.woff2 differ diff --git a/fonts/KaTeX_Math-BoldItalic.ttf b/fonts/KaTeX_Math-BoldItalic.ttf new file mode 100644 index 00000000..d653a409 Binary files /dev/null and b/fonts/KaTeX_Math-BoldItalic.ttf differ diff --git a/fonts/KaTeX_Math-BoldItalic.woff b/fonts/KaTeX_Math-BoldItalic.woff new file mode 100644 index 00000000..b1aebf3f Binary files /dev/null and b/fonts/KaTeX_Math-BoldItalic.woff differ diff --git a/fonts/KaTeX_Math-BoldItalic.woff2 b/fonts/KaTeX_Math-BoldItalic.woff2 new file mode 100644 index 00000000..86d6a7d9 Binary files /dev/null and b/fonts/KaTeX_Math-BoldItalic.woff2 differ diff --git a/fonts/KaTeX_Math-Italic.ttf b/fonts/KaTeX_Math-Italic.ttf new file mode 100644 index 00000000..ce7f3675 Binary files /dev/null and b/fonts/KaTeX_Math-Italic.ttf differ diff --git a/fonts/KaTeX_Math-Italic.woff b/fonts/KaTeX_Math-Italic.woff new file mode 100644 index 00000000..3126ebec Binary files /dev/null and b/fonts/KaTeX_Math-Italic.woff differ diff --git a/fonts/KaTeX_Math-Italic.woff2 b/fonts/KaTeX_Math-Italic.woff2 new file mode 100644 index 00000000..12a6443e Binary files /dev/null and b/fonts/KaTeX_Math-Italic.woff2 differ diff --git a/fonts/KaTeX_SansSerif-Bold.ttf b/fonts/KaTeX_SansSerif-Bold.ttf new file mode 100644 index 00000000..ad7d54c8 Binary files /dev/null and b/fonts/KaTeX_SansSerif-Bold.ttf differ diff --git a/fonts/KaTeX_SansSerif-Bold.woff b/fonts/KaTeX_SansSerif-Bold.woff new file mode 100644 index 00000000..42ee2273 Binary files /dev/null and b/fonts/KaTeX_SansSerif-Bold.woff differ diff --git a/fonts/KaTeX_SansSerif-Bold.woff2 b/fonts/KaTeX_SansSerif-Bold.woff2 new file mode 100644 index 00000000..d7ba3b8d Binary files /dev/null and b/fonts/KaTeX_SansSerif-Bold.woff2 differ diff --git a/fonts/KaTeX_SansSerif-Italic.ttf b/fonts/KaTeX_SansSerif-Italic.ttf new file mode 100644 index 00000000..e95fe2d0 Binary files /dev/null and b/fonts/KaTeX_SansSerif-Italic.ttf differ diff --git a/fonts/KaTeX_SansSerif-Italic.woff b/fonts/KaTeX_SansSerif-Italic.woff new file mode 100644 index 00000000..b4c1660d Binary files /dev/null and b/fonts/KaTeX_SansSerif-Italic.woff differ diff --git a/fonts/KaTeX_SansSerif-Italic.woff2 b/fonts/KaTeX_SansSerif-Italic.woff2 new file mode 100644 index 00000000..04a65b7d Binary files /dev/null and b/fonts/KaTeX_SansSerif-Italic.woff2 differ diff --git a/fonts/KaTeX_SansSerif-Regular.ttf b/fonts/KaTeX_SansSerif-Regular.ttf new file mode 100644 index 00000000..a172aa55 Binary files /dev/null and b/fonts/KaTeX_SansSerif-Regular.ttf differ diff --git a/fonts/KaTeX_SansSerif-Regular.woff b/fonts/KaTeX_SansSerif-Regular.woff new file mode 100644 index 00000000..b068a8e1 Binary files /dev/null and b/fonts/KaTeX_SansSerif-Regular.woff differ diff --git a/fonts/KaTeX_SansSerif-Regular.woff2 b/fonts/KaTeX_SansSerif-Regular.woff2 new file mode 100644 index 00000000..1f43ffea Binary files /dev/null and b/fonts/KaTeX_SansSerif-Regular.woff2 differ diff --git a/fonts/KaTeX_Script-Regular.ttf b/fonts/KaTeX_Script-Regular.ttf new file mode 100644 index 00000000..f57e6d36 Binary files /dev/null and b/fonts/KaTeX_Script-Regular.ttf differ diff --git a/fonts/KaTeX_Script-Regular.woff b/fonts/KaTeX_Script-Regular.woff new file mode 100644 index 00000000..fe4cb846 Binary files /dev/null and b/fonts/KaTeX_Script-Regular.woff differ diff --git a/fonts/KaTeX_Script-Regular.woff2 b/fonts/KaTeX_Script-Regular.woff2 new file mode 100644 index 00000000..a7383c7c Binary files /dev/null and b/fonts/KaTeX_Script-Regular.woff2 differ diff --git a/fonts/KaTeX_Size1-Regular.ttf b/fonts/KaTeX_Size1-Regular.ttf new file mode 100644 index 00000000..1744d015 Binary files /dev/null and b/fonts/KaTeX_Size1-Regular.ttf differ diff --git a/fonts/KaTeX_Size1-Regular.woff b/fonts/KaTeX_Size1-Regular.woff new file mode 100644 index 00000000..ae27c249 Binary files /dev/null and b/fonts/KaTeX_Size1-Regular.woff differ diff --git a/fonts/KaTeX_Size1-Regular.woff2 b/fonts/KaTeX_Size1-Regular.woff2 new file mode 100644 index 00000000..25c3f163 Binary files /dev/null and b/fonts/KaTeX_Size1-Regular.woff2 differ diff --git a/fonts/KaTeX_Size2-Regular.ttf b/fonts/KaTeX_Size2-Regular.ttf new file mode 100644 index 00000000..e948f54a Binary files /dev/null and b/fonts/KaTeX_Size2-Regular.ttf differ diff --git a/fonts/KaTeX_Size2-Regular.woff b/fonts/KaTeX_Size2-Regular.woff new file mode 100644 index 00000000..8285fed1 Binary files /dev/null and b/fonts/KaTeX_Size2-Regular.woff differ diff --git a/fonts/KaTeX_Size2-Regular.woff2 b/fonts/KaTeX_Size2-Regular.woff2 new file mode 100644 index 00000000..620a8c69 Binary files /dev/null and b/fonts/KaTeX_Size2-Regular.woff2 differ diff --git a/fonts/KaTeX_Size3-Regular.ttf b/fonts/KaTeX_Size3-Regular.ttf new file mode 100644 index 00000000..4e0777ad Binary files /dev/null and b/fonts/KaTeX_Size3-Regular.ttf differ diff --git a/fonts/KaTeX_Size3-Regular.woff b/fonts/KaTeX_Size3-Regular.woff new file mode 100644 index 00000000..03bb3113 Binary files /dev/null and b/fonts/KaTeX_Size3-Regular.woff differ diff --git a/fonts/KaTeX_Size3-Regular.woff2 b/fonts/KaTeX_Size3-Regular.woff2 new file mode 100644 index 00000000..76d0dd0d Binary files /dev/null and b/fonts/KaTeX_Size3-Regular.woff2 differ diff --git a/fonts/KaTeX_Size4-Regular.ttf b/fonts/KaTeX_Size4-Regular.ttf new file mode 100644 index 00000000..1822c42c Binary files /dev/null and b/fonts/KaTeX_Size4-Regular.ttf differ diff --git a/fonts/KaTeX_Size4-Regular.woff b/fonts/KaTeX_Size4-Regular.woff new file mode 100644 index 00000000..5c99d778 Binary files /dev/null and b/fonts/KaTeX_Size4-Regular.woff differ diff --git a/fonts/KaTeX_Size4-Regular.woff2 b/fonts/KaTeX_Size4-Regular.woff2 new file mode 100644 index 00000000..5e78b5ba Binary files /dev/null and b/fonts/KaTeX_Size4-Regular.woff2 differ diff --git a/fonts/KaTeX_Typewriter-Regular.ttf b/fonts/KaTeX_Typewriter-Regular.ttf new file mode 100644 index 00000000..35c74cd7 Binary files /dev/null and b/fonts/KaTeX_Typewriter-Regular.ttf differ diff --git a/fonts/KaTeX_Typewriter-Regular.woff b/fonts/KaTeX_Typewriter-Regular.woff new file mode 100644 index 00000000..ea5be728 Binary files /dev/null and b/fonts/KaTeX_Typewriter-Regular.woff differ diff --git a/fonts/KaTeX_Typewriter-Regular.woff2 b/fonts/KaTeX_Typewriter-Regular.woff2 new file mode 100644 index 00000000..efa222d5 Binary files /dev/null and b/fonts/KaTeX_Typewriter-Regular.woff2 differ diff --git a/fonts/VERSION b/fonts/VERSION new file mode 100644 index 00000000..beffc792 --- /dev/null +++ b/fonts/VERSION @@ -0,0 +1 @@ +1615612969 diff --git a/package.json b/package.json index 0e957079..29e4aa21 100644 --- a/package.json +++ b/package.json @@ -114,9 +114,7 @@ }, "husky": { "hooks": { - "pre-commit": "yarn test:lint", - "post-merge": "git submodule update --init --recursive", - "post-checkout": "git submodule update --init --recursive" + "pre-commit": "yarn test:lint" } }, "jest": { diff --git a/renovate.json b/renovate.json index 5519e32c..7edf20a7 100644 --- a/renovate.json +++ b/renovate.json @@ -6,9 +6,6 @@ ":prNotPending", "group:linters" ], - "git-submodules": { - "enabled": true - }, "lockFileMaintenance": { "enabled": true, "schedule": ["at any time"], diff --git a/src/delimiter.js b/src/delimiter.js index 7c688a00..4947b624 100644 --- a/src/delimiter.js +++ b/src/delimiter.js @@ -30,7 +30,7 @@ import buildCommon from "./buildCommon"; import {getCharacterMetrics} from "./fontMetrics"; import symbols from "./symbols"; import utils from "./utils"; -import fontMetricsData from "../submodules/katex-fonts/fontMetricsData"; +import fontMetricsData from "./fontMetricsData"; import type Options from "./Options"; import type {CharacterMetrics} from "./fontMetrics"; diff --git a/src/fontMetrics.js b/src/fontMetrics.js index ead7559a..3e459540 100644 --- a/src/fontMetrics.js +++ b/src/fontMetrics.js @@ -96,7 +96,7 @@ const sigmasAndXis = { // metrics, including height, depth, italic correction, and skew (kern from the // character to the corresponding \skewchar) // This map is generated via `make metrics`. It should not be changed manually. -import metricMap from "../submodules/katex-fonts/fontMetricsData"; +import metricMap from "./fontMetricsData"; // These are very rough approximations. We default to Times New Roman which // should have Latin-1 and Cyrillic characters, but may not depending on the diff --git a/src/fontMetricsData.js b/src/fontMetricsData.js new file mode 100644 index 00000000..9bc224e6 --- /dev/null +++ b/src/fontMetricsData.js @@ -0,0 +1,2076 @@ +// This file is GENERATED by buildMetrics.sh. DO NOT MODIFY. +export default { + "AMS-Regular": { + "32": [0, 0, 0, 0, 0.25], + "65": [0, 0.68889, 0, 0, 0.72222], + "66": [0, 0.68889, 0, 0, 0.66667], + "67": [0, 0.68889, 0, 0, 0.72222], + "68": [0, 0.68889, 0, 0, 0.72222], + "69": [0, 0.68889, 0, 0, 0.66667], + "70": [0, 0.68889, 0, 0, 0.61111], + "71": [0, 0.68889, 0, 0, 0.77778], + "72": [0, 0.68889, 0, 0, 0.77778], + "73": [0, 0.68889, 0, 0, 0.38889], + "74": [0.16667, 0.68889, 0, 0, 0.5], + "75": [0, 0.68889, 0, 0, 0.77778], + "76": [0, 0.68889, 0, 0, 0.66667], + "77": [0, 0.68889, 0, 0, 0.94445], + "78": [0, 0.68889, 0, 0, 0.72222], + "79": [0.16667, 0.68889, 0, 0, 0.77778], + "80": [0, 0.68889, 0, 0, 0.61111], + "81": [0.16667, 0.68889, 0, 0, 0.77778], + "82": [0, 0.68889, 0, 0, 0.72222], + "83": [0, 0.68889, 0, 0, 0.55556], + "84": [0, 0.68889, 0, 0, 0.66667], + "85": [0, 0.68889, 0, 0, 0.72222], + "86": [0, 0.68889, 0, 0, 0.72222], + "87": [0, 0.68889, 0, 0, 1.0], + "88": [0, 0.68889, 0, 0, 0.72222], + "89": [0, 0.68889, 0, 0, 0.72222], + "90": [0, 0.68889, 0, 0, 0.66667], + "107": [0, 0.68889, 0, 0, 0.55556], + "160": [0, 0, 0, 0, 0.25], + "165": [0, 0.675, 0.025, 0, 0.75], + "174": [0.15559, 0.69224, 0, 0, 0.94666], + "240": [0, 0.68889, 0, 0, 0.55556], + "295": [0, 0.68889, 0, 0, 0.54028], + "710": [0, 0.825, 0, 0, 2.33334], + "732": [0, 0.9, 0, 0, 2.33334], + "770": [0, 0.825, 0, 0, 2.33334], + "771": [0, 0.9, 0, 0, 2.33334], + "989": [0.08167, 0.58167, 0, 0, 0.77778], + "1008": [0, 0.43056, 0.04028, 0, 0.66667], + "8245": [0, 0.54986, 0, 0, 0.275], + "8463": [0, 0.68889, 0, 0, 0.54028], + "8487": [0, 0.68889, 0, 0, 0.72222], + "8498": [0, 0.68889, 0, 0, 0.55556], + "8502": [0, 0.68889, 0, 0, 0.66667], + "8503": [0, 0.68889, 0, 0, 0.44445], + "8504": [0, 0.68889, 0, 0, 0.66667], + "8513": [0, 0.68889, 0, 0, 0.63889], + "8592": [-0.03598, 0.46402, 0, 0, 0.5], + "8594": [-0.03598, 0.46402, 0, 0, 0.5], + "8602": [-0.13313, 0.36687, 0, 0, 1.0], + "8603": [-0.13313, 0.36687, 0, 0, 1.0], + "8606": [0.01354, 0.52239, 0, 0, 1.0], + "8608": [0.01354, 0.52239, 0, 0, 1.0], + "8610": [0.01354, 0.52239, 0, 0, 1.11111], + "8611": [0.01354, 0.52239, 0, 0, 1.11111], + "8619": [0, 0.54986, 0, 0, 1.0], + "8620": [0, 0.54986, 0, 0, 1.0], + "8621": [-0.13313, 0.37788, 0, 0, 1.38889], + "8622": [-0.13313, 0.36687, 0, 0, 1.0], + "8624": [0, 0.69224, 0, 0, 0.5], + "8625": [0, 0.69224, 0, 0, 0.5], + "8630": [0, 0.43056, 0, 0, 1.0], + "8631": [0, 0.43056, 0, 0, 1.0], + "8634": [0.08198, 0.58198, 0, 0, 0.77778], + "8635": [0.08198, 0.58198, 0, 0, 0.77778], + "8638": [0.19444, 0.69224, 0, 0, 0.41667], + "8639": [0.19444, 0.69224, 0, 0, 0.41667], + "8642": [0.19444, 0.69224, 0, 0, 0.41667], + "8643": [0.19444, 0.69224, 0, 0, 0.41667], + "8644": [0.1808, 0.675, 0, 0, 1.0], + "8646": [0.1808, 0.675, 0, 0, 1.0], + "8647": [0.1808, 0.675, 0, 0, 1.0], + "8648": [0.19444, 0.69224, 0, 0, 0.83334], + "8649": [0.1808, 0.675, 0, 0, 1.0], + "8650": [0.19444, 0.69224, 0, 0, 0.83334], + "8651": [0.01354, 0.52239, 0, 0, 1.0], + "8652": [0.01354, 0.52239, 0, 0, 1.0], + "8653": [-0.13313, 0.36687, 0, 0, 1.0], + "8654": [-0.13313, 0.36687, 0, 0, 1.0], + "8655": [-0.13313, 0.36687, 0, 0, 1.0], + "8666": [0.13667, 0.63667, 0, 0, 1.0], + "8667": [0.13667, 0.63667, 0, 0, 1.0], + "8669": [-0.13313, 0.37788, 0, 0, 1.0], + "8672": [-0.064, 0.437, 0, 0, 1.334], + "8674": [-0.064, 0.437, 0, 0, 1.334], + "8705": [0, 0.825, 0, 0, 0.5], + "8708": [0, 0.68889, 0, 0, 0.55556], + "8709": [0.08167, 0.58167, 0, 0, 0.77778], + "8717": [0, 0.43056, 0, 0, 0.42917], + "8722": [-0.03598, 0.46402, 0, 0, 0.5], + "8724": [0.08198, 0.69224, 0, 0, 0.77778], + "8726": [0.08167, 0.58167, 0, 0, 0.77778], + "8733": [0, 0.69224, 0, 0, 0.77778], + "8736": [0, 0.69224, 0, 0, 0.72222], + "8737": [0, 0.69224, 0, 0, 0.72222], + "8738": [0.03517, 0.52239, 0, 0, 0.72222], + "8739": [0.08167, 0.58167, 0, 0, 0.22222], + "8740": [0.25142, 0.74111, 0, 0, 0.27778], + "8741": [0.08167, 0.58167, 0, 0, 0.38889], + "8742": [0.25142, 0.74111, 0, 0, 0.5], + "8756": [0, 0.69224, 0, 0, 0.66667], + "8757": [0, 0.69224, 0, 0, 0.66667], + "8764": [-0.13313, 0.36687, 0, 0, 0.77778], + "8765": [-0.13313, 0.37788, 0, 0, 0.77778], + "8769": [-0.13313, 0.36687, 0, 0, 0.77778], + "8770": [-0.03625, 0.46375, 0, 0, 0.77778], + "8774": [0.30274, 0.79383, 0, 0, 0.77778], + "8776": [-0.01688, 0.48312, 0, 0, 0.77778], + "8778": [0.08167, 0.58167, 0, 0, 0.77778], + "8782": [0.06062, 0.54986, 0, 0, 0.77778], + "8783": [0.06062, 0.54986, 0, 0, 0.77778], + "8785": [0.08198, 0.58198, 0, 0, 0.77778], + "8786": [0.08198, 0.58198, 0, 0, 0.77778], + "8787": [0.08198, 0.58198, 0, 0, 0.77778], + "8790": [0, 0.69224, 0, 0, 0.77778], + "8791": [0.22958, 0.72958, 0, 0, 0.77778], + "8796": [0.08198, 0.91667, 0, 0, 0.77778], + "8806": [0.25583, 0.75583, 0, 0, 0.77778], + "8807": [0.25583, 0.75583, 0, 0, 0.77778], + "8808": [0.25142, 0.75726, 0, 0, 0.77778], + "8809": [0.25142, 0.75726, 0, 0, 0.77778], + "8812": [0.25583, 0.75583, 0, 0, 0.5], + "8814": [0.20576, 0.70576, 0, 0, 0.77778], + "8815": [0.20576, 0.70576, 0, 0, 0.77778], + "8816": [0.30274, 0.79383, 0, 0, 0.77778], + "8817": [0.30274, 0.79383, 0, 0, 0.77778], + "8818": [0.22958, 0.72958, 0, 0, 0.77778], + "8819": [0.22958, 0.72958, 0, 0, 0.77778], + "8822": [0.1808, 0.675, 0, 0, 0.77778], + "8823": [0.1808, 0.675, 0, 0, 0.77778], + "8828": [0.13667, 0.63667, 0, 0, 0.77778], + "8829": [0.13667, 0.63667, 0, 0, 0.77778], + "8830": [0.22958, 0.72958, 0, 0, 0.77778], + "8831": [0.22958, 0.72958, 0, 0, 0.77778], + "8832": [0.20576, 0.70576, 0, 0, 0.77778], + "8833": [0.20576, 0.70576, 0, 0, 0.77778], + "8840": [0.30274, 0.79383, 0, 0, 0.77778], + "8841": [0.30274, 0.79383, 0, 0, 0.77778], + "8842": [0.13597, 0.63597, 0, 0, 0.77778], + "8843": [0.13597, 0.63597, 0, 0, 0.77778], + "8847": [0.03517, 0.54986, 0, 0, 0.77778], + "8848": [0.03517, 0.54986, 0, 0, 0.77778], + "8858": [0.08198, 0.58198, 0, 0, 0.77778], + "8859": [0.08198, 0.58198, 0, 0, 0.77778], + "8861": [0.08198, 0.58198, 0, 0, 0.77778], + "8862": [0, 0.675, 0, 0, 0.77778], + "8863": [0, 0.675, 0, 0, 0.77778], + "8864": [0, 0.675, 0, 0, 0.77778], + "8865": [0, 0.675, 0, 0, 0.77778], + "8872": [0, 0.69224, 0, 0, 0.61111], + "8873": [0, 0.69224, 0, 0, 0.72222], + "8874": [0, 0.69224, 0, 0, 0.88889], + "8876": [0, 0.68889, 0, 0, 0.61111], + "8877": [0, 0.68889, 0, 0, 0.61111], + "8878": [0, 0.68889, 0, 0, 0.72222], + "8879": [0, 0.68889, 0, 0, 0.72222], + "8882": [0.03517, 0.54986, 0, 0, 0.77778], + "8883": [0.03517, 0.54986, 0, 0, 0.77778], + "8884": [0.13667, 0.63667, 0, 0, 0.77778], + "8885": [0.13667, 0.63667, 0, 0, 0.77778], + "8888": [0, 0.54986, 0, 0, 1.11111], + "8890": [0.19444, 0.43056, 0, 0, 0.55556], + "8891": [0.19444, 0.69224, 0, 0, 0.61111], + "8892": [0.19444, 0.69224, 0, 0, 0.61111], + "8901": [0, 0.54986, 0, 0, 0.27778], + "8903": [0.08167, 0.58167, 0, 0, 0.77778], + "8905": [0.08167, 0.58167, 0, 0, 0.77778], + "8906": [0.08167, 0.58167, 0, 0, 0.77778], + "8907": [0, 0.69224, 0, 0, 0.77778], + "8908": [0, 0.69224, 0, 0, 0.77778], + "8909": [-0.03598, 0.46402, 0, 0, 0.77778], + "8910": [0, 0.54986, 0, 0, 0.76042], + "8911": [0, 0.54986, 0, 0, 0.76042], + "8912": [0.03517, 0.54986, 0, 0, 0.77778], + "8913": [0.03517, 0.54986, 0, 0, 0.77778], + "8914": [0, 0.54986, 0, 0, 0.66667], + "8915": [0, 0.54986, 0, 0, 0.66667], + "8916": [0, 0.69224, 0, 0, 0.66667], + "8918": [0.0391, 0.5391, 0, 0, 0.77778], + "8919": [0.0391, 0.5391, 0, 0, 0.77778], + "8920": [0.03517, 0.54986, 0, 0, 1.33334], + "8921": [0.03517, 0.54986, 0, 0, 1.33334], + "8922": [0.38569, 0.88569, 0, 0, 0.77778], + "8923": [0.38569, 0.88569, 0, 0, 0.77778], + "8926": [0.13667, 0.63667, 0, 0, 0.77778], + "8927": [0.13667, 0.63667, 0, 0, 0.77778], + "8928": [0.30274, 0.79383, 0, 0, 0.77778], + "8929": [0.30274, 0.79383, 0, 0, 0.77778], + "8934": [0.23222, 0.74111, 0, 0, 0.77778], + "8935": [0.23222, 0.74111, 0, 0, 0.77778], + "8936": [0.23222, 0.74111, 0, 0, 0.77778], + "8937": [0.23222, 0.74111, 0, 0, 0.77778], + "8938": [0.20576, 0.70576, 0, 0, 0.77778], + "8939": [0.20576, 0.70576, 0, 0, 0.77778], + "8940": [0.30274, 0.79383, 0, 0, 0.77778], + "8941": [0.30274, 0.79383, 0, 0, 0.77778], + "8994": [0.19444, 0.69224, 0, 0, 0.77778], + "8995": [0.19444, 0.69224, 0, 0, 0.77778], + "9416": [0.15559, 0.69224, 0, 0, 0.90222], + "9484": [0, 0.69224, 0, 0, 0.5], + "9488": [0, 0.69224, 0, 0, 0.5], + "9492": [0, 0.37788, 0, 0, 0.5], + "9496": [0, 0.37788, 0, 0, 0.5], + "9585": [0.19444, 0.68889, 0, 0, 0.88889], + "9586": [0.19444, 0.74111, 0, 0, 0.88889], + "9632": [0, 0.675, 0, 0, 0.77778], + "9633": [0, 0.675, 0, 0, 0.77778], + "9650": [0, 0.54986, 0, 0, 0.72222], + "9651": [0, 0.54986, 0, 0, 0.72222], + "9654": [0.03517, 0.54986, 0, 0, 0.77778], + "9660": [0, 0.54986, 0, 0, 0.72222], + "9661": [0, 0.54986, 0, 0, 0.72222], + "9664": [0.03517, 0.54986, 0, 0, 0.77778], + "9674": [0.11111, 0.69224, 0, 0, 0.66667], + "9733": [0.19444, 0.69224, 0, 0, 0.94445], + "10003": [0, 0.69224, 0, 0, 0.83334], + "10016": [0, 0.69224, 0, 0, 0.83334], + "10731": [0.11111, 0.69224, 0, 0, 0.66667], + "10846": [0.19444, 0.75583, 0, 0, 0.61111], + "10877": [0.13667, 0.63667, 0, 0, 0.77778], + "10878": [0.13667, 0.63667, 0, 0, 0.77778], + "10885": [0.25583, 0.75583, 0, 0, 0.77778], + "10886": [0.25583, 0.75583, 0, 0, 0.77778], + "10887": [0.13597, 0.63597, 0, 0, 0.77778], + "10888": [0.13597, 0.63597, 0, 0, 0.77778], + "10889": [0.26167, 0.75726, 0, 0, 0.77778], + "10890": [0.26167, 0.75726, 0, 0, 0.77778], + "10891": [0.48256, 0.98256, 0, 0, 0.77778], + "10892": [0.48256, 0.98256, 0, 0, 0.77778], + "10901": [0.13667, 0.63667, 0, 0, 0.77778], + "10902": [0.13667, 0.63667, 0, 0, 0.77778], + "10933": [0.25142, 0.75726, 0, 0, 0.77778], + "10934": [0.25142, 0.75726, 0, 0, 0.77778], + "10935": [0.26167, 0.75726, 0, 0, 0.77778], + "10936": [0.26167, 0.75726, 0, 0, 0.77778], + "10937": [0.26167, 0.75726, 0, 0, 0.77778], + "10938": [0.26167, 0.75726, 0, 0, 0.77778], + "10949": [0.25583, 0.75583, 0, 0, 0.77778], + "10950": [0.25583, 0.75583, 0, 0, 0.77778], + "10955": [0.28481, 0.79383, 0, 0, 0.77778], + "10956": [0.28481, 0.79383, 0, 0, 0.77778], + "57350": [0.08167, 0.58167, 0, 0, 0.22222], + "57351": [0.08167, 0.58167, 0, 0, 0.38889], + "57352": [0.08167, 0.58167, 0, 0, 0.77778], + "57353": [0, 0.43056, 0.04028, 0, 0.66667], + "57356": [0.25142, 0.75726, 0, 0, 0.77778], + "57357": [0.25142, 0.75726, 0, 0, 0.77778], + "57358": [0.41951, 0.91951, 0, 0, 0.77778], + "57359": [0.30274, 0.79383, 0, 0, 0.77778], + "57360": [0.30274, 0.79383, 0, 0, 0.77778], + "57361": [0.41951, 0.91951, 0, 0, 0.77778], + "57366": [0.25142, 0.75726, 0, 0, 0.77778], + "57367": [0.25142, 0.75726, 0, 0, 0.77778], + "57368": [0.25142, 0.75726, 0, 0, 0.77778], + "57369": [0.25142, 0.75726, 0, 0, 0.77778], + "57370": [0.13597, 0.63597, 0, 0, 0.77778], + "57371": [0.13597, 0.63597, 0, 0, 0.77778], + }, + "Caligraphic-Regular": { + "32": [0, 0, 0, 0, 0.25], + "65": [0, 0.68333, 0, 0.19445, 0.79847], + "66": [0, 0.68333, 0.03041, 0.13889, 0.65681], + "67": [0, 0.68333, 0.05834, 0.13889, 0.52653], + "68": [0, 0.68333, 0.02778, 0.08334, 0.77139], + "69": [0, 0.68333, 0.08944, 0.11111, 0.52778], + "70": [0, 0.68333, 0.09931, 0.11111, 0.71875], + "71": [0.09722, 0.68333, 0.0593, 0.11111, 0.59487], + "72": [0, 0.68333, 0.00965, 0.11111, 0.84452], + "73": [0, 0.68333, 0.07382, 0, 0.54452], + "74": [0.09722, 0.68333, 0.18472, 0.16667, 0.67778], + "75": [0, 0.68333, 0.01445, 0.05556, 0.76195], + "76": [0, 0.68333, 0, 0.13889, 0.68972], + "77": [0, 0.68333, 0, 0.13889, 1.2009], + "78": [0, 0.68333, 0.14736, 0.08334, 0.82049], + "79": [0, 0.68333, 0.02778, 0.11111, 0.79611], + "80": [0, 0.68333, 0.08222, 0.08334, 0.69556], + "81": [0.09722, 0.68333, 0, 0.11111, 0.81667], + "82": [0, 0.68333, 0, 0.08334, 0.8475], + "83": [0, 0.68333, 0.075, 0.13889, 0.60556], + "84": [0, 0.68333, 0.25417, 0, 0.54464], + "85": [0, 0.68333, 0.09931, 0.08334, 0.62583], + "86": [0, 0.68333, 0.08222, 0, 0.61278], + "87": [0, 0.68333, 0.08222, 0.08334, 0.98778], + "88": [0, 0.68333, 0.14643, 0.13889, 0.7133], + "89": [0.09722, 0.68333, 0.08222, 0.08334, 0.66834], + "90": [0, 0.68333, 0.07944, 0.13889, 0.72473], + "160": [0, 0, 0, 0, 0.25], + }, + "Fraktur-Regular": { + "32": [0, 0, 0, 0, 0.25], + "33": [0, 0.69141, 0, 0, 0.29574], + "34": [0, 0.69141, 0, 0, 0.21471], + "38": [0, 0.69141, 0, 0, 0.73786], + "39": [0, 0.69141, 0, 0, 0.21201], + "40": [0.24982, 0.74947, 0, 0, 0.38865], + "41": [0.24982, 0.74947, 0, 0, 0.38865], + "42": [0, 0.62119, 0, 0, 0.27764], + "43": [0.08319, 0.58283, 0, 0, 0.75623], + "44": [0, 0.10803, 0, 0, 0.27764], + "45": [0.08319, 0.58283, 0, 0, 0.75623], + "46": [0, 0.10803, 0, 0, 0.27764], + "47": [0.24982, 0.74947, 0, 0, 0.50181], + "48": [0, 0.47534, 0, 0, 0.50181], + "49": [0, 0.47534, 0, 0, 0.50181], + "50": [0, 0.47534, 0, 0, 0.50181], + "51": [0.18906, 0.47534, 0, 0, 0.50181], + "52": [0.18906, 0.47534, 0, 0, 0.50181], + "53": [0.18906, 0.47534, 0, 0, 0.50181], + "54": [0, 0.69141, 0, 0, 0.50181], + "55": [0.18906, 0.47534, 0, 0, 0.50181], + "56": [0, 0.69141, 0, 0, 0.50181], + "57": [0.18906, 0.47534, 0, 0, 0.50181], + "58": [0, 0.47534, 0, 0, 0.21606], + "59": [0.12604, 0.47534, 0, 0, 0.21606], + "61": [-0.13099, 0.36866, 0, 0, 0.75623], + "63": [0, 0.69141, 0, 0, 0.36245], + "65": [0, 0.69141, 0, 0, 0.7176], + "66": [0, 0.69141, 0, 0, 0.88397], + "67": [0, 0.69141, 0, 0, 0.61254], + "68": [0, 0.69141, 0, 0, 0.83158], + "69": [0, 0.69141, 0, 0, 0.66278], + "70": [0.12604, 0.69141, 0, 0, 0.61119], + "71": [0, 0.69141, 0, 0, 0.78539], + "72": [0.06302, 0.69141, 0, 0, 0.7203], + "73": [0, 0.69141, 0, 0, 0.55448], + "74": [0.12604, 0.69141, 0, 0, 0.55231], + "75": [0, 0.69141, 0, 0, 0.66845], + "76": [0, 0.69141, 0, 0, 0.66602], + "77": [0, 0.69141, 0, 0, 1.04953], + "78": [0, 0.69141, 0, 0, 0.83212], + "79": [0, 0.69141, 0, 0, 0.82699], + "80": [0.18906, 0.69141, 0, 0, 0.82753], + "81": [0.03781, 0.69141, 0, 0, 0.82699], + "82": [0, 0.69141, 0, 0, 0.82807], + "83": [0, 0.69141, 0, 0, 0.82861], + "84": [0, 0.69141, 0, 0, 0.66899], + "85": [0, 0.69141, 0, 0, 0.64576], + "86": [0, 0.69141, 0, 0, 0.83131], + "87": [0, 0.69141, 0, 0, 1.04602], + "88": [0, 0.69141, 0, 0, 0.71922], + "89": [0.18906, 0.69141, 0, 0, 0.83293], + "90": [0.12604, 0.69141, 0, 0, 0.60201], + "91": [0.24982, 0.74947, 0, 0, 0.27764], + "93": [0.24982, 0.74947, 0, 0, 0.27764], + "94": [0, 0.69141, 0, 0, 0.49965], + "97": [0, 0.47534, 0, 0, 0.50046], + "98": [0, 0.69141, 0, 0, 0.51315], + "99": [0, 0.47534, 0, 0, 0.38946], + "100": [0, 0.62119, 0, 0, 0.49857], + "101": [0, 0.47534, 0, 0, 0.40053], + "102": [0.18906, 0.69141, 0, 0, 0.32626], + "103": [0.18906, 0.47534, 0, 0, 0.5037], + "104": [0.18906, 0.69141, 0, 0, 0.52126], + "105": [0, 0.69141, 0, 0, 0.27899], + "106": [0, 0.69141, 0, 0, 0.28088], + "107": [0, 0.69141, 0, 0, 0.38946], + "108": [0, 0.69141, 0, 0, 0.27953], + "109": [0, 0.47534, 0, 0, 0.76676], + "110": [0, 0.47534, 0, 0, 0.52666], + "111": [0, 0.47534, 0, 0, 0.48885], + "112": [0.18906, 0.52396, 0, 0, 0.50046], + "113": [0.18906, 0.47534, 0, 0, 0.48912], + "114": [0, 0.47534, 0, 0, 0.38919], + "115": [0, 0.47534, 0, 0, 0.44266], + "116": [0, 0.62119, 0, 0, 0.33301], + "117": [0, 0.47534, 0, 0, 0.5172], + "118": [0, 0.52396, 0, 0, 0.5118], + "119": [0, 0.52396, 0, 0, 0.77351], + "120": [0.18906, 0.47534, 0, 0, 0.38865], + "121": [0.18906, 0.47534, 0, 0, 0.49884], + "122": [0.18906, 0.47534, 0, 0, 0.39054], + "160": [0, 0, 0, 0, 0.25], + "8216": [0, 0.69141, 0, 0, 0.21471], + "8217": [0, 0.69141, 0, 0, 0.21471], + "58112": [0, 0.62119, 0, 0, 0.49749], + "58113": [0, 0.62119, 0, 0, 0.4983], + "58114": [0.18906, 0.69141, 0, 0, 0.33328], + "58115": [0.18906, 0.69141, 0, 0, 0.32923], + "58116": [0.18906, 0.47534, 0, 0, 0.50343], + "58117": [0, 0.69141, 0, 0, 0.33301], + "58118": [0, 0.62119, 0, 0, 0.33409], + "58119": [0, 0.47534, 0, 0, 0.50073], + }, + "Main-Bold": { + "32": [0, 0, 0, 0, 0.25], + "33": [0, 0.69444, 0, 0, 0.35], + "34": [0, 0.69444, 0, 0, 0.60278], + "35": [0.19444, 0.69444, 0, 0, 0.95833], + "36": [0.05556, 0.75, 0, 0, 0.575], + "37": [0.05556, 0.75, 0, 0, 0.95833], + "38": [0, 0.69444, 0, 0, 0.89444], + "39": [0, 0.69444, 0, 0, 0.31944], + "40": [0.25, 0.75, 0, 0, 0.44722], + "41": [0.25, 0.75, 0, 0, 0.44722], + "42": [0, 0.75, 0, 0, 0.575], + "43": [0.13333, 0.63333, 0, 0, 0.89444], + "44": [0.19444, 0.15556, 0, 0, 0.31944], + "45": [0, 0.44444, 0, 0, 0.38333], + "46": [0, 0.15556, 0, 0, 0.31944], + "47": [0.25, 0.75, 0, 0, 0.575], + "48": [0, 0.64444, 0, 0, 0.575], + "49": [0, 0.64444, 0, 0, 0.575], + "50": [0, 0.64444, 0, 0, 0.575], + "51": [0, 0.64444, 0, 0, 0.575], + "52": [0, 0.64444, 0, 0, 0.575], + "53": [0, 0.64444, 0, 0, 0.575], + "54": [0, 0.64444, 0, 0, 0.575], + "55": [0, 0.64444, 0, 0, 0.575], + "56": [0, 0.64444, 0, 0, 0.575], + "57": [0, 0.64444, 0, 0, 0.575], + "58": [0, 0.44444, 0, 0, 0.31944], + "59": [0.19444, 0.44444, 0, 0, 0.31944], + "60": [0.08556, 0.58556, 0, 0, 0.89444], + "61": [-0.10889, 0.39111, 0, 0, 0.89444], + "62": [0.08556, 0.58556, 0, 0, 0.89444], + "63": [0, 0.69444, 0, 0, 0.54305], + "64": [0, 0.69444, 0, 0, 0.89444], + "65": [0, 0.68611, 0, 0, 0.86944], + "66": [0, 0.68611, 0, 0, 0.81805], + "67": [0, 0.68611, 0, 0, 0.83055], + "68": [0, 0.68611, 0, 0, 0.88194], + "69": [0, 0.68611, 0, 0, 0.75555], + "70": [0, 0.68611, 0, 0, 0.72361], + "71": [0, 0.68611, 0, 0, 0.90416], + "72": [0, 0.68611, 0, 0, 0.9], + "73": [0, 0.68611, 0, 0, 0.43611], + "74": [0, 0.68611, 0, 0, 0.59444], + "75": [0, 0.68611, 0, 0, 0.90138], + "76": [0, 0.68611, 0, 0, 0.69166], + "77": [0, 0.68611, 0, 0, 1.09166], + "78": [0, 0.68611, 0, 0, 0.9], + "79": [0, 0.68611, 0, 0, 0.86388], + "80": [0, 0.68611, 0, 0, 0.78611], + "81": [0.19444, 0.68611, 0, 0, 0.86388], + "82": [0, 0.68611, 0, 0, 0.8625], + "83": [0, 0.68611, 0, 0, 0.63889], + "84": [0, 0.68611, 0, 0, 0.8], + "85": [0, 0.68611, 0, 0, 0.88472], + "86": [0, 0.68611, 0.01597, 0, 0.86944], + "87": [0, 0.68611, 0.01597, 0, 1.18888], + "88": [0, 0.68611, 0, 0, 0.86944], + "89": [0, 0.68611, 0.02875, 0, 0.86944], + "90": [0, 0.68611, 0, 0, 0.70277], + "91": [0.25, 0.75, 0, 0, 0.31944], + "92": [0.25, 0.75, 0, 0, 0.575], + "93": [0.25, 0.75, 0, 0, 0.31944], + "94": [0, 0.69444, 0, 0, 0.575], + "95": [0.31, 0.13444, 0.03194, 0, 0.575], + "97": [0, 0.44444, 0, 0, 0.55902], + "98": [0, 0.69444, 0, 0, 0.63889], + "99": [0, 0.44444, 0, 0, 0.51111], + "100": [0, 0.69444, 0, 0, 0.63889], + "101": [0, 0.44444, 0, 0, 0.52708], + "102": [0, 0.69444, 0.10903, 0, 0.35139], + "103": [0.19444, 0.44444, 0.01597, 0, 0.575], + "104": [0, 0.69444, 0, 0, 0.63889], + "105": [0, 0.69444, 0, 0, 0.31944], + "106": [0.19444, 0.69444, 0, 0, 0.35139], + "107": [0, 0.69444, 0, 0, 0.60694], + "108": [0, 0.69444, 0, 0, 0.31944], + "109": [0, 0.44444, 0, 0, 0.95833], + "110": [0, 0.44444, 0, 0, 0.63889], + "111": [0, 0.44444, 0, 0, 0.575], + "112": [0.19444, 0.44444, 0, 0, 0.63889], + "113": [0.19444, 0.44444, 0, 0, 0.60694], + "114": [0, 0.44444, 0, 0, 0.47361], + "115": [0, 0.44444, 0, 0, 0.45361], + "116": [0, 0.63492, 0, 0, 0.44722], + "117": [0, 0.44444, 0, 0, 0.63889], + "118": [0, 0.44444, 0.01597, 0, 0.60694], + "119": [0, 0.44444, 0.01597, 0, 0.83055], + "120": [0, 0.44444, 0, 0, 0.60694], + "121": [0.19444, 0.44444, 0.01597, 0, 0.60694], + "122": [0, 0.44444, 0, 0, 0.51111], + "123": [0.25, 0.75, 0, 0, 0.575], + "124": [0.25, 0.75, 0, 0, 0.31944], + "125": [0.25, 0.75, 0, 0, 0.575], + "126": [0.35, 0.34444, 0, 0, 0.575], + "160": [0, 0, 0, 0, 0.25], + "163": [0, 0.69444, 0, 0, 0.86853], + "168": [0, 0.69444, 0, 0, 0.575], + "172": [0, 0.44444, 0, 0, 0.76666], + "176": [0, 0.69444, 0, 0, 0.86944], + "177": [0.13333, 0.63333, 0, 0, 0.89444], + "184": [0.17014, 0, 0, 0, 0.51111], + "198": [0, 0.68611, 0, 0, 1.04166], + "215": [0.13333, 0.63333, 0, 0, 0.89444], + "216": [0.04861, 0.73472, 0, 0, 0.89444], + "223": [0, 0.69444, 0, 0, 0.59722], + "230": [0, 0.44444, 0, 0, 0.83055], + "247": [0.13333, 0.63333, 0, 0, 0.89444], + "248": [0.09722, 0.54167, 0, 0, 0.575], + "305": [0, 0.44444, 0, 0, 0.31944], + "338": [0, 0.68611, 0, 0, 1.16944], + "339": [0, 0.44444, 0, 0, 0.89444], + "567": [0.19444, 0.44444, 0, 0, 0.35139], + "710": [0, 0.69444, 0, 0, 0.575], + "711": [0, 0.63194, 0, 0, 0.575], + "713": [0, 0.59611, 0, 0, 0.575], + "714": [0, 0.69444, 0, 0, 0.575], + "715": [0, 0.69444, 0, 0, 0.575], + "728": [0, 0.69444, 0, 0, 0.575], + "729": [0, 0.69444, 0, 0, 0.31944], + "730": [0, 0.69444, 0, 0, 0.86944], + "732": [0, 0.69444, 0, 0, 0.575], + "733": [0, 0.69444, 0, 0, 0.575], + "915": [0, 0.68611, 0, 0, 0.69166], + "916": [0, 0.68611, 0, 0, 0.95833], + "920": [0, 0.68611, 0, 0, 0.89444], + "923": [0, 0.68611, 0, 0, 0.80555], + "926": [0, 0.68611, 0, 0, 0.76666], + "928": [0, 0.68611, 0, 0, 0.9], + "931": [0, 0.68611, 0, 0, 0.83055], + "933": [0, 0.68611, 0, 0, 0.89444], + "934": [0, 0.68611, 0, 0, 0.83055], + "936": [0, 0.68611, 0, 0, 0.89444], + "937": [0, 0.68611, 0, 0, 0.83055], + "8211": [0, 0.44444, 0.03194, 0, 0.575], + "8212": [0, 0.44444, 0.03194, 0, 1.14999], + "8216": [0, 0.69444, 0, 0, 0.31944], + "8217": [0, 0.69444, 0, 0, 0.31944], + "8220": [0, 0.69444, 0, 0, 0.60278], + "8221": [0, 0.69444, 0, 0, 0.60278], + "8224": [0.19444, 0.69444, 0, 0, 0.51111], + "8225": [0.19444, 0.69444, 0, 0, 0.51111], + "8242": [0, 0.55556, 0, 0, 0.34444], + "8407": [0, 0.72444, 0.15486, 0, 0.575], + "8463": [0, 0.69444, 0, 0, 0.66759], + "8465": [0, 0.69444, 0, 0, 0.83055], + "8467": [0, 0.69444, 0, 0, 0.47361], + "8472": [0.19444, 0.44444, 0, 0, 0.74027], + "8476": [0, 0.69444, 0, 0, 0.83055], + "8501": [0, 0.69444, 0, 0, 0.70277], + "8592": [-0.10889, 0.39111, 0, 0, 1.14999], + "8593": [0.19444, 0.69444, 0, 0, 0.575], + "8594": [-0.10889, 0.39111, 0, 0, 1.14999], + "8595": [0.19444, 0.69444, 0, 0, 0.575], + "8596": [-0.10889, 0.39111, 0, 0, 1.14999], + "8597": [0.25, 0.75, 0, 0, 0.575], + "8598": [0.19444, 0.69444, 0, 0, 1.14999], + "8599": [0.19444, 0.69444, 0, 0, 1.14999], + "8600": [0.19444, 0.69444, 0, 0, 1.14999], + "8601": [0.19444, 0.69444, 0, 0, 1.14999], + "8636": [-0.10889, 0.39111, 0, 0, 1.14999], + "8637": [-0.10889, 0.39111, 0, 0, 1.14999], + "8640": [-0.10889, 0.39111, 0, 0, 1.14999], + "8641": [-0.10889, 0.39111, 0, 0, 1.14999], + "8656": [-0.10889, 0.39111, 0, 0, 1.14999], + "8657": [0.19444, 0.69444, 0, 0, 0.70277], + "8658": [-0.10889, 0.39111, 0, 0, 1.14999], + "8659": [0.19444, 0.69444, 0, 0, 0.70277], + "8660": [-0.10889, 0.39111, 0, 0, 1.14999], + "8661": [0.25, 0.75, 0, 0, 0.70277], + "8704": [0, 0.69444, 0, 0, 0.63889], + "8706": [0, 0.69444, 0.06389, 0, 0.62847], + "8707": [0, 0.69444, 0, 0, 0.63889], + "8709": [0.05556, 0.75, 0, 0, 0.575], + "8711": [0, 0.68611, 0, 0, 0.95833], + "8712": [0.08556, 0.58556, 0, 0, 0.76666], + "8715": [0.08556, 0.58556, 0, 0, 0.76666], + "8722": [0.13333, 0.63333, 0, 0, 0.89444], + "8723": [0.13333, 0.63333, 0, 0, 0.89444], + "8725": [0.25, 0.75, 0, 0, 0.575], + "8726": [0.25, 0.75, 0, 0, 0.575], + "8727": [-0.02778, 0.47222, 0, 0, 0.575], + "8728": [-0.02639, 0.47361, 0, 0, 0.575], + "8729": [-0.02639, 0.47361, 0, 0, 0.575], + "8730": [0.18, 0.82, 0, 0, 0.95833], + "8733": [0, 0.44444, 0, 0, 0.89444], + "8734": [0, 0.44444, 0, 0, 1.14999], + "8736": [0, 0.69224, 0, 0, 0.72222], + "8739": [0.25, 0.75, 0, 0, 0.31944], + "8741": [0.25, 0.75, 0, 0, 0.575], + "8743": [0, 0.55556, 0, 0, 0.76666], + "8744": [0, 0.55556, 0, 0, 0.76666], + "8745": [0, 0.55556, 0, 0, 0.76666], + "8746": [0, 0.55556, 0, 0, 0.76666], + "8747": [0.19444, 0.69444, 0.12778, 0, 0.56875], + "8764": [-0.10889, 0.39111, 0, 0, 0.89444], + "8768": [0.19444, 0.69444, 0, 0, 0.31944], + "8771": [0.00222, 0.50222, 0, 0, 0.89444], + "8776": [0.02444, 0.52444, 0, 0, 0.89444], + "8781": [0.00222, 0.50222, 0, 0, 0.89444], + "8801": [0.00222, 0.50222, 0, 0, 0.89444], + "8804": [0.19667, 0.69667, 0, 0, 0.89444], + "8805": [0.19667, 0.69667, 0, 0, 0.89444], + "8810": [0.08556, 0.58556, 0, 0, 1.14999], + "8811": [0.08556, 0.58556, 0, 0, 1.14999], + "8826": [0.08556, 0.58556, 0, 0, 0.89444], + "8827": [0.08556, 0.58556, 0, 0, 0.89444], + "8834": [0.08556, 0.58556, 0, 0, 0.89444], + "8835": [0.08556, 0.58556, 0, 0, 0.89444], + "8838": [0.19667, 0.69667, 0, 0, 0.89444], + "8839": [0.19667, 0.69667, 0, 0, 0.89444], + "8846": [0, 0.55556, 0, 0, 0.76666], + "8849": [0.19667, 0.69667, 0, 0, 0.89444], + "8850": [0.19667, 0.69667, 0, 0, 0.89444], + "8851": [0, 0.55556, 0, 0, 0.76666], + "8852": [0, 0.55556, 0, 0, 0.76666], + "8853": [0.13333, 0.63333, 0, 0, 0.89444], + "8854": [0.13333, 0.63333, 0, 0, 0.89444], + "8855": [0.13333, 0.63333, 0, 0, 0.89444], + "8856": [0.13333, 0.63333, 0, 0, 0.89444], + "8857": [0.13333, 0.63333, 0, 0, 0.89444], + "8866": [0, 0.69444, 0, 0, 0.70277], + "8867": [0, 0.69444, 0, 0, 0.70277], + "8868": [0, 0.69444, 0, 0, 0.89444], + "8869": [0, 0.69444, 0, 0, 0.89444], + "8900": [-0.02639, 0.47361, 0, 0, 0.575], + "8901": [-0.02639, 0.47361, 0, 0, 0.31944], + "8902": [-0.02778, 0.47222, 0, 0, 0.575], + "8968": [0.25, 0.75, 0, 0, 0.51111], + "8969": [0.25, 0.75, 0, 0, 0.51111], + "8970": [0.25, 0.75, 0, 0, 0.51111], + "8971": [0.25, 0.75, 0, 0, 0.51111], + "8994": [-0.13889, 0.36111, 0, 0, 1.14999], + "8995": [-0.13889, 0.36111, 0, 0, 1.14999], + "9651": [0.19444, 0.69444, 0, 0, 1.02222], + "9657": [-0.02778, 0.47222, 0, 0, 0.575], + "9661": [0.19444, 0.69444, 0, 0, 1.02222], + "9667": [-0.02778, 0.47222, 0, 0, 0.575], + "9711": [0.19444, 0.69444, 0, 0, 1.14999], + "9824": [0.12963, 0.69444, 0, 0, 0.89444], + "9825": [0.12963, 0.69444, 0, 0, 0.89444], + "9826": [0.12963, 0.69444, 0, 0, 0.89444], + "9827": [0.12963, 0.69444, 0, 0, 0.89444], + "9837": [0, 0.75, 0, 0, 0.44722], + "9838": [0.19444, 0.69444, 0, 0, 0.44722], + "9839": [0.19444, 0.69444, 0, 0, 0.44722], + "10216": [0.25, 0.75, 0, 0, 0.44722], + "10217": [0.25, 0.75, 0, 0, 0.44722], + "10815": [0, 0.68611, 0, 0, 0.9], + "10927": [0.19667, 0.69667, 0, 0, 0.89444], + "10928": [0.19667, 0.69667, 0, 0, 0.89444], + "57376": [0.19444, 0.69444, 0, 0, 0], + }, + "Main-BoldItalic": { + "32": [0, 0, 0, 0, 0.25], + "33": [0, 0.69444, 0.11417, 0, 0.38611], + "34": [0, 0.69444, 0.07939, 0, 0.62055], + "35": [0.19444, 0.69444, 0.06833, 0, 0.94444], + "37": [0.05556, 0.75, 0.12861, 0, 0.94444], + "38": [0, 0.69444, 0.08528, 0, 0.88555], + "39": [0, 0.69444, 0.12945, 0, 0.35555], + "40": [0.25, 0.75, 0.15806, 0, 0.47333], + "41": [0.25, 0.75, 0.03306, 0, 0.47333], + "42": [0, 0.75, 0.14333, 0, 0.59111], + "43": [0.10333, 0.60333, 0.03306, 0, 0.88555], + "44": [0.19444, 0.14722, 0, 0, 0.35555], + "45": [0, 0.44444, 0.02611, 0, 0.41444], + "46": [0, 0.14722, 0, 0, 0.35555], + "47": [0.25, 0.75, 0.15806, 0, 0.59111], + "48": [0, 0.64444, 0.13167, 0, 0.59111], + "49": [0, 0.64444, 0.13167, 0, 0.59111], + "50": [0, 0.64444, 0.13167, 0, 0.59111], + "51": [0, 0.64444, 0.13167, 0, 0.59111], + "52": [0.19444, 0.64444, 0.13167, 0, 0.59111], + "53": [0, 0.64444, 0.13167, 0, 0.59111], + "54": [0, 0.64444, 0.13167, 0, 0.59111], + "55": [0.19444, 0.64444, 0.13167, 0, 0.59111], + "56": [0, 0.64444, 0.13167, 0, 0.59111], + "57": [0, 0.64444, 0.13167, 0, 0.59111], + "58": [0, 0.44444, 0.06695, 0, 0.35555], + "59": [0.19444, 0.44444, 0.06695, 0, 0.35555], + "61": [-0.10889, 0.39111, 0.06833, 0, 0.88555], + "63": [0, 0.69444, 0.11472, 0, 0.59111], + "64": [0, 0.69444, 0.09208, 0, 0.88555], + "65": [0, 0.68611, 0, 0, 0.86555], + "66": [0, 0.68611, 0.0992, 0, 0.81666], + "67": [0, 0.68611, 0.14208, 0, 0.82666], + "68": [0, 0.68611, 0.09062, 0, 0.87555], + "69": [0, 0.68611, 0.11431, 0, 0.75666], + "70": [0, 0.68611, 0.12903, 0, 0.72722], + "71": [0, 0.68611, 0.07347, 0, 0.89527], + "72": [0, 0.68611, 0.17208, 0, 0.8961], + "73": [0, 0.68611, 0.15681, 0, 0.47166], + "74": [0, 0.68611, 0.145, 0, 0.61055], + "75": [0, 0.68611, 0.14208, 0, 0.89499], + "76": [0, 0.68611, 0, 0, 0.69777], + "77": [0, 0.68611, 0.17208, 0, 1.07277], + "78": [0, 0.68611, 0.17208, 0, 0.8961], + "79": [0, 0.68611, 0.09062, 0, 0.85499], + "80": [0, 0.68611, 0.0992, 0, 0.78721], + "81": [0.19444, 0.68611, 0.09062, 0, 0.85499], + "82": [0, 0.68611, 0.02559, 0, 0.85944], + "83": [0, 0.68611, 0.11264, 0, 0.64999], + "84": [0, 0.68611, 0.12903, 0, 0.7961], + "85": [0, 0.68611, 0.17208, 0, 0.88083], + "86": [0, 0.68611, 0.18625, 0, 0.86555], + "87": [0, 0.68611, 0.18625, 0, 1.15999], + "88": [0, 0.68611, 0.15681, 0, 0.86555], + "89": [0, 0.68611, 0.19803, 0, 0.86555], + "90": [0, 0.68611, 0.14208, 0, 0.70888], + "91": [0.25, 0.75, 0.1875, 0, 0.35611], + "93": [0.25, 0.75, 0.09972, 0, 0.35611], + "94": [0, 0.69444, 0.06709, 0, 0.59111], + "95": [0.31, 0.13444, 0.09811, 0, 0.59111], + "97": [0, 0.44444, 0.09426, 0, 0.59111], + "98": [0, 0.69444, 0.07861, 0, 0.53222], + "99": [0, 0.44444, 0.05222, 0, 0.53222], + "100": [0, 0.69444, 0.10861, 0, 0.59111], + "101": [0, 0.44444, 0.085, 0, 0.53222], + "102": [0.19444, 0.69444, 0.21778, 0, 0.4], + "103": [0.19444, 0.44444, 0.105, 0, 0.53222], + "104": [0, 0.69444, 0.09426, 0, 0.59111], + "105": [0, 0.69326, 0.11387, 0, 0.35555], + "106": [0.19444, 0.69326, 0.1672, 0, 0.35555], + "107": [0, 0.69444, 0.11111, 0, 0.53222], + "108": [0, 0.69444, 0.10861, 0, 0.29666], + "109": [0, 0.44444, 0.09426, 0, 0.94444], + "110": [0, 0.44444, 0.09426, 0, 0.64999], + "111": [0, 0.44444, 0.07861, 0, 0.59111], + "112": [0.19444, 0.44444, 0.07861, 0, 0.59111], + "113": [0.19444, 0.44444, 0.105, 0, 0.53222], + "114": [0, 0.44444, 0.11111, 0, 0.50167], + "115": [0, 0.44444, 0.08167, 0, 0.48694], + "116": [0, 0.63492, 0.09639, 0, 0.385], + "117": [0, 0.44444, 0.09426, 0, 0.62055], + "118": [0, 0.44444, 0.11111, 0, 0.53222], + "119": [0, 0.44444, 0.11111, 0, 0.76777], + "120": [0, 0.44444, 0.12583, 0, 0.56055], + "121": [0.19444, 0.44444, 0.105, 0, 0.56166], + "122": [0, 0.44444, 0.13889, 0, 0.49055], + "126": [0.35, 0.34444, 0.11472, 0, 0.59111], + "160": [0, 0, 0, 0, 0.25], + "168": [0, 0.69444, 0.11473, 0, 0.59111], + "176": [0, 0.69444, 0, 0, 0.94888], + "184": [0.17014, 0, 0, 0, 0.53222], + "198": [0, 0.68611, 0.11431, 0, 1.02277], + "216": [0.04861, 0.73472, 0.09062, 0, 0.88555], + "223": [0.19444, 0.69444, 0.09736, 0, 0.665], + "230": [0, 0.44444, 0.085, 0, 0.82666], + "248": [0.09722, 0.54167, 0.09458, 0, 0.59111], + "305": [0, 0.44444, 0.09426, 0, 0.35555], + "338": [0, 0.68611, 0.11431, 0, 1.14054], + "339": [0, 0.44444, 0.085, 0, 0.82666], + "567": [0.19444, 0.44444, 0.04611, 0, 0.385], + "710": [0, 0.69444, 0.06709, 0, 0.59111], + "711": [0, 0.63194, 0.08271, 0, 0.59111], + "713": [0, 0.59444, 0.10444, 0, 0.59111], + "714": [0, 0.69444, 0.08528, 0, 0.59111], + "715": [0, 0.69444, 0, 0, 0.59111], + "728": [0, 0.69444, 0.10333, 0, 0.59111], + "729": [0, 0.69444, 0.12945, 0, 0.35555], + "730": [0, 0.69444, 0, 0, 0.94888], + "732": [0, 0.69444, 0.11472, 0, 0.59111], + "733": [0, 0.69444, 0.11472, 0, 0.59111], + "915": [0, 0.68611, 0.12903, 0, 0.69777], + "916": [0, 0.68611, 0, 0, 0.94444], + "920": [0, 0.68611, 0.09062, 0, 0.88555], + "923": [0, 0.68611, 0, 0, 0.80666], + "926": [0, 0.68611, 0.15092, 0, 0.76777], + "928": [0, 0.68611, 0.17208, 0, 0.8961], + "931": [0, 0.68611, 0.11431, 0, 0.82666], + "933": [0, 0.68611, 0.10778, 0, 0.88555], + "934": [0, 0.68611, 0.05632, 0, 0.82666], + "936": [0, 0.68611, 0.10778, 0, 0.88555], + "937": [0, 0.68611, 0.0992, 0, 0.82666], + "8211": [0, 0.44444, 0.09811, 0, 0.59111], + "8212": [0, 0.44444, 0.09811, 0, 1.18221], + "8216": [0, 0.69444, 0.12945, 0, 0.35555], + "8217": [0, 0.69444, 0.12945, 0, 0.35555], + "8220": [0, 0.69444, 0.16772, 0, 0.62055], + "8221": [0, 0.69444, 0.07939, 0, 0.62055], + }, + "Main-Italic": { + "32": [0, 0, 0, 0, 0.25], + "33": [0, 0.69444, 0.12417, 0, 0.30667], + "34": [0, 0.69444, 0.06961, 0, 0.51444], + "35": [0.19444, 0.69444, 0.06616, 0, 0.81777], + "37": [0.05556, 0.75, 0.13639, 0, 0.81777], + "38": [0, 0.69444, 0.09694, 0, 0.76666], + "39": [0, 0.69444, 0.12417, 0, 0.30667], + "40": [0.25, 0.75, 0.16194, 0, 0.40889], + "41": [0.25, 0.75, 0.03694, 0, 0.40889], + "42": [0, 0.75, 0.14917, 0, 0.51111], + "43": [0.05667, 0.56167, 0.03694, 0, 0.76666], + "44": [0.19444, 0.10556, 0, 0, 0.30667], + "45": [0, 0.43056, 0.02826, 0, 0.35778], + "46": [0, 0.10556, 0, 0, 0.30667], + "47": [0.25, 0.75, 0.16194, 0, 0.51111], + "48": [0, 0.64444, 0.13556, 0, 0.51111], + "49": [0, 0.64444, 0.13556, 0, 0.51111], + "50": [0, 0.64444, 0.13556, 0, 0.51111], + "51": [0, 0.64444, 0.13556, 0, 0.51111], + "52": [0.19444, 0.64444, 0.13556, 0, 0.51111], + "53": [0, 0.64444, 0.13556, 0, 0.51111], + "54": [0, 0.64444, 0.13556, 0, 0.51111], + "55": [0.19444, 0.64444, 0.13556, 0, 0.51111], + "56": [0, 0.64444, 0.13556, 0, 0.51111], + "57": [0, 0.64444, 0.13556, 0, 0.51111], + "58": [0, 0.43056, 0.0582, 0, 0.30667], + "59": [0.19444, 0.43056, 0.0582, 0, 0.30667], + "61": [-0.13313, 0.36687, 0.06616, 0, 0.76666], + "63": [0, 0.69444, 0.1225, 0, 0.51111], + "64": [0, 0.69444, 0.09597, 0, 0.76666], + "65": [0, 0.68333, 0, 0, 0.74333], + "66": [0, 0.68333, 0.10257, 0, 0.70389], + "67": [0, 0.68333, 0.14528, 0, 0.71555], + "68": [0, 0.68333, 0.09403, 0, 0.755], + "69": [0, 0.68333, 0.12028, 0, 0.67833], + "70": [0, 0.68333, 0.13305, 0, 0.65277], + "71": [0, 0.68333, 0.08722, 0, 0.77361], + "72": [0, 0.68333, 0.16389, 0, 0.74333], + "73": [0, 0.68333, 0.15806, 0, 0.38555], + "74": [0, 0.68333, 0.14028, 0, 0.525], + "75": [0, 0.68333, 0.14528, 0, 0.76888], + "76": [0, 0.68333, 0, 0, 0.62722], + "77": [0, 0.68333, 0.16389, 0, 0.89666], + "78": [0, 0.68333, 0.16389, 0, 0.74333], + "79": [0, 0.68333, 0.09403, 0, 0.76666], + "80": [0, 0.68333, 0.10257, 0, 0.67833], + "81": [0.19444, 0.68333, 0.09403, 0, 0.76666], + "82": [0, 0.68333, 0.03868, 0, 0.72944], + "83": [0, 0.68333, 0.11972, 0, 0.56222], + "84": [0, 0.68333, 0.13305, 0, 0.71555], + "85": [0, 0.68333, 0.16389, 0, 0.74333], + "86": [0, 0.68333, 0.18361, 0, 0.74333], + "87": [0, 0.68333, 0.18361, 0, 0.99888], + "88": [0, 0.68333, 0.15806, 0, 0.74333], + "89": [0, 0.68333, 0.19383, 0, 0.74333], + "90": [0, 0.68333, 0.14528, 0, 0.61333], + "91": [0.25, 0.75, 0.1875, 0, 0.30667], + "93": [0.25, 0.75, 0.10528, 0, 0.30667], + "94": [0, 0.69444, 0.06646, 0, 0.51111], + "95": [0.31, 0.12056, 0.09208, 0, 0.51111], + "97": [0, 0.43056, 0.07671, 0, 0.51111], + "98": [0, 0.69444, 0.06312, 0, 0.46], + "99": [0, 0.43056, 0.05653, 0, 0.46], + "100": [0, 0.69444, 0.10333, 0, 0.51111], + "101": [0, 0.43056, 0.07514, 0, 0.46], + "102": [0.19444, 0.69444, 0.21194, 0, 0.30667], + "103": [0.19444, 0.43056, 0.08847, 0, 0.46], + "104": [0, 0.69444, 0.07671, 0, 0.51111], + "105": [0, 0.65536, 0.1019, 0, 0.30667], + "106": [0.19444, 0.65536, 0.14467, 0, 0.30667], + "107": [0, 0.69444, 0.10764, 0, 0.46], + "108": [0, 0.69444, 0.10333, 0, 0.25555], + "109": [0, 0.43056, 0.07671, 0, 0.81777], + "110": [0, 0.43056, 0.07671, 0, 0.56222], + "111": [0, 0.43056, 0.06312, 0, 0.51111], + "112": [0.19444, 0.43056, 0.06312, 0, 0.51111], + "113": [0.19444, 0.43056, 0.08847, 0, 0.46], + "114": [0, 0.43056, 0.10764, 0, 0.42166], + "115": [0, 0.43056, 0.08208, 0, 0.40889], + "116": [0, 0.61508, 0.09486, 0, 0.33222], + "117": [0, 0.43056, 0.07671, 0, 0.53666], + "118": [0, 0.43056, 0.10764, 0, 0.46], + "119": [0, 0.43056, 0.10764, 0, 0.66444], + "120": [0, 0.43056, 0.12042, 0, 0.46389], + "121": [0.19444, 0.43056, 0.08847, 0, 0.48555], + "122": [0, 0.43056, 0.12292, 0, 0.40889], + "126": [0.35, 0.31786, 0.11585, 0, 0.51111], + "160": [0, 0, 0, 0, 0.25], + "168": [0, 0.66786, 0.10474, 0, 0.51111], + "176": [0, 0.69444, 0, 0, 0.83129], + "184": [0.17014, 0, 0, 0, 0.46], + "198": [0, 0.68333, 0.12028, 0, 0.88277], + "216": [0.04861, 0.73194, 0.09403, 0, 0.76666], + "223": [0.19444, 0.69444, 0.10514, 0, 0.53666], + "230": [0, 0.43056, 0.07514, 0, 0.71555], + "248": [0.09722, 0.52778, 0.09194, 0, 0.51111], + "338": [0, 0.68333, 0.12028, 0, 0.98499], + "339": [0, 0.43056, 0.07514, 0, 0.71555], + "710": [0, 0.69444, 0.06646, 0, 0.51111], + "711": [0, 0.62847, 0.08295, 0, 0.51111], + "713": [0, 0.56167, 0.10333, 0, 0.51111], + "714": [0, 0.69444, 0.09694, 0, 0.51111], + "715": [0, 0.69444, 0, 0, 0.51111], + "728": [0, 0.69444, 0.10806, 0, 0.51111], + "729": [0, 0.66786, 0.11752, 0, 0.30667], + "730": [0, 0.69444, 0, 0, 0.83129], + "732": [0, 0.66786, 0.11585, 0, 0.51111], + "733": [0, 0.69444, 0.1225, 0, 0.51111], + "915": [0, 0.68333, 0.13305, 0, 0.62722], + "916": [0, 0.68333, 0, 0, 0.81777], + "920": [0, 0.68333, 0.09403, 0, 0.76666], + "923": [0, 0.68333, 0, 0, 0.69222], + "926": [0, 0.68333, 0.15294, 0, 0.66444], + "928": [0, 0.68333, 0.16389, 0, 0.74333], + "931": [0, 0.68333, 0.12028, 0, 0.71555], + "933": [0, 0.68333, 0.11111, 0, 0.76666], + "934": [0, 0.68333, 0.05986, 0, 0.71555], + "936": [0, 0.68333, 0.11111, 0, 0.76666], + "937": [0, 0.68333, 0.10257, 0, 0.71555], + "8211": [0, 0.43056, 0.09208, 0, 0.51111], + "8212": [0, 0.43056, 0.09208, 0, 1.02222], + "8216": [0, 0.69444, 0.12417, 0, 0.30667], + "8217": [0, 0.69444, 0.12417, 0, 0.30667], + "8220": [0, 0.69444, 0.1685, 0, 0.51444], + "8221": [0, 0.69444, 0.06961, 0, 0.51444], + "8463": [0, 0.68889, 0, 0, 0.54028], + }, + "Main-Regular": { + "32": [0, 0, 0, 0, 0.25], + "33": [0, 0.69444, 0, 0, 0.27778], + "34": [0, 0.69444, 0, 0, 0.5], + "35": [0.19444, 0.69444, 0, 0, 0.83334], + "36": [0.05556, 0.75, 0, 0, 0.5], + "37": [0.05556, 0.75, 0, 0, 0.83334], + "38": [0, 0.69444, 0, 0, 0.77778], + "39": [0, 0.69444, 0, 0, 0.27778], + "40": [0.25, 0.75, 0, 0, 0.38889], + "41": [0.25, 0.75, 0, 0, 0.38889], + "42": [0, 0.75, 0, 0, 0.5], + "43": [0.08333, 0.58333, 0, 0, 0.77778], + "44": [0.19444, 0.10556, 0, 0, 0.27778], + "45": [0, 0.43056, 0, 0, 0.33333], + "46": [0, 0.10556, 0, 0, 0.27778], + "47": [0.25, 0.75, 0, 0, 0.5], + "48": [0, 0.64444, 0, 0, 0.5], + "49": [0, 0.64444, 0, 0, 0.5], + "50": [0, 0.64444, 0, 0, 0.5], + "51": [0, 0.64444, 0, 0, 0.5], + "52": [0, 0.64444, 0, 0, 0.5], + "53": [0, 0.64444, 0, 0, 0.5], + "54": [0, 0.64444, 0, 0, 0.5], + "55": [0, 0.64444, 0, 0, 0.5], + "56": [0, 0.64444, 0, 0, 0.5], + "57": [0, 0.64444, 0, 0, 0.5], + "58": [0, 0.43056, 0, 0, 0.27778], + "59": [0.19444, 0.43056, 0, 0, 0.27778], + "60": [0.0391, 0.5391, 0, 0, 0.77778], + "61": [-0.13313, 0.36687, 0, 0, 0.77778], + "62": [0.0391, 0.5391, 0, 0, 0.77778], + "63": [0, 0.69444, 0, 0, 0.47222], + "64": [0, 0.69444, 0, 0, 0.77778], + "65": [0, 0.68333, 0, 0, 0.75], + "66": [0, 0.68333, 0, 0, 0.70834], + "67": [0, 0.68333, 0, 0, 0.72222], + "68": [0, 0.68333, 0, 0, 0.76389], + "69": [0, 0.68333, 0, 0, 0.68056], + "70": [0, 0.68333, 0, 0, 0.65278], + "71": [0, 0.68333, 0, 0, 0.78472], + "72": [0, 0.68333, 0, 0, 0.75], + "73": [0, 0.68333, 0, 0, 0.36111], + "74": [0, 0.68333, 0, 0, 0.51389], + "75": [0, 0.68333, 0, 0, 0.77778], + "76": [0, 0.68333, 0, 0, 0.625], + "77": [0, 0.68333, 0, 0, 0.91667], + "78": [0, 0.68333, 0, 0, 0.75], + "79": [0, 0.68333, 0, 0, 0.77778], + "80": [0, 0.68333, 0, 0, 0.68056], + "81": [0.19444, 0.68333, 0, 0, 0.77778], + "82": [0, 0.68333, 0, 0, 0.73611], + "83": [0, 0.68333, 0, 0, 0.55556], + "84": [0, 0.68333, 0, 0, 0.72222], + "85": [0, 0.68333, 0, 0, 0.75], + "86": [0, 0.68333, 0.01389, 0, 0.75], + "87": [0, 0.68333, 0.01389, 0, 1.02778], + "88": [0, 0.68333, 0, 0, 0.75], + "89": [0, 0.68333, 0.025, 0, 0.75], + "90": [0, 0.68333, 0, 0, 0.61111], + "91": [0.25, 0.75, 0, 0, 0.27778], + "92": [0.25, 0.75, 0, 0, 0.5], + "93": [0.25, 0.75, 0, 0, 0.27778], + "94": [0, 0.69444, 0, 0, 0.5], + "95": [0.31, 0.12056, 0.02778, 0, 0.5], + "97": [0, 0.43056, 0, 0, 0.5], + "98": [0, 0.69444, 0, 0, 0.55556], + "99": [0, 0.43056, 0, 0, 0.44445], + "100": [0, 0.69444, 0, 0, 0.55556], + "101": [0, 0.43056, 0, 0, 0.44445], + "102": [0, 0.69444, 0.07778, 0, 0.30556], + "103": [0.19444, 0.43056, 0.01389, 0, 0.5], + "104": [0, 0.69444, 0, 0, 0.55556], + "105": [0, 0.66786, 0, 0, 0.27778], + "106": [0.19444, 0.66786, 0, 0, 0.30556], + "107": [0, 0.69444, 0, 0, 0.52778], + "108": [0, 0.69444, 0, 0, 0.27778], + "109": [0, 0.43056, 0, 0, 0.83334], + "110": [0, 0.43056, 0, 0, 0.55556], + "111": [0, 0.43056, 0, 0, 0.5], + "112": [0.19444, 0.43056, 0, 0, 0.55556], + "113": [0.19444, 0.43056, 0, 0, 0.52778], + "114": [0, 0.43056, 0, 0, 0.39167], + "115": [0, 0.43056, 0, 0, 0.39445], + "116": [0, 0.61508, 0, 0, 0.38889], + "117": [0, 0.43056, 0, 0, 0.55556], + "118": [0, 0.43056, 0.01389, 0, 0.52778], + "119": [0, 0.43056, 0.01389, 0, 0.72222], + "120": [0, 0.43056, 0, 0, 0.52778], + "121": [0.19444, 0.43056, 0.01389, 0, 0.52778], + "122": [0, 0.43056, 0, 0, 0.44445], + "123": [0.25, 0.75, 0, 0, 0.5], + "124": [0.25, 0.75, 0, 0, 0.27778], + "125": [0.25, 0.75, 0, 0, 0.5], + "126": [0.35, 0.31786, 0, 0, 0.5], + "160": [0, 0, 0, 0, 0.25], + "163": [0, 0.69444, 0, 0, 0.76909], + "167": [0.19444, 0.69444, 0, 0, 0.44445], + "168": [0, 0.66786, 0, 0, 0.5], + "172": [0, 0.43056, 0, 0, 0.66667], + "176": [0, 0.69444, 0, 0, 0.75], + "177": [0.08333, 0.58333, 0, 0, 0.77778], + "182": [0.19444, 0.69444, 0, 0, 0.61111], + "184": [0.17014, 0, 0, 0, 0.44445], + "198": [0, 0.68333, 0, 0, 0.90278], + "215": [0.08333, 0.58333, 0, 0, 0.77778], + "216": [0.04861, 0.73194, 0, 0, 0.77778], + "223": [0, 0.69444, 0, 0, 0.5], + "230": [0, 0.43056, 0, 0, 0.72222], + "247": [0.08333, 0.58333, 0, 0, 0.77778], + "248": [0.09722, 0.52778, 0, 0, 0.5], + "305": [0, 0.43056, 0, 0, 0.27778], + "338": [0, 0.68333, 0, 0, 1.01389], + "339": [0, 0.43056, 0, 0, 0.77778], + "567": [0.19444, 0.43056, 0, 0, 0.30556], + "710": [0, 0.69444, 0, 0, 0.5], + "711": [0, 0.62847, 0, 0, 0.5], + "713": [0, 0.56778, 0, 0, 0.5], + "714": [0, 0.69444, 0, 0, 0.5], + "715": [0, 0.69444, 0, 0, 0.5], + "728": [0, 0.69444, 0, 0, 0.5], + "729": [0, 0.66786, 0, 0, 0.27778], + "730": [0, 0.69444, 0, 0, 0.75], + "732": [0, 0.66786, 0, 0, 0.5], + "733": [0, 0.69444, 0, 0, 0.5], + "915": [0, 0.68333, 0, 0, 0.625], + "916": [0, 0.68333, 0, 0, 0.83334], + "920": [0, 0.68333, 0, 0, 0.77778], + "923": [0, 0.68333, 0, 0, 0.69445], + "926": [0, 0.68333, 0, 0, 0.66667], + "928": [0, 0.68333, 0, 0, 0.75], + "931": [0, 0.68333, 0, 0, 0.72222], + "933": [0, 0.68333, 0, 0, 0.77778], + "934": [0, 0.68333, 0, 0, 0.72222], + "936": [0, 0.68333, 0, 0, 0.77778], + "937": [0, 0.68333, 0, 0, 0.72222], + "8211": [0, 0.43056, 0.02778, 0, 0.5], + "8212": [0, 0.43056, 0.02778, 0, 1.0], + "8216": [0, 0.69444, 0, 0, 0.27778], + "8217": [0, 0.69444, 0, 0, 0.27778], + "8220": [0, 0.69444, 0, 0, 0.5], + "8221": [0, 0.69444, 0, 0, 0.5], + "8224": [0.19444, 0.69444, 0, 0, 0.44445], + "8225": [0.19444, 0.69444, 0, 0, 0.44445], + "8230": [0, 0.12, 0, 0, 1.172], + "8242": [0, 0.55556, 0, 0, 0.275], + "8407": [0, 0.71444, 0.15382, 0, 0.5], + "8463": [0, 0.68889, 0, 0, 0.54028], + "8465": [0, 0.69444, 0, 0, 0.72222], + "8467": [0, 0.69444, 0, 0.11111, 0.41667], + "8472": [0.19444, 0.43056, 0, 0.11111, 0.63646], + "8476": [0, 0.69444, 0, 0, 0.72222], + "8501": [0, 0.69444, 0, 0, 0.61111], + "8592": [-0.13313, 0.36687, 0, 0, 1.0], + "8593": [0.19444, 0.69444, 0, 0, 0.5], + "8594": [-0.13313, 0.36687, 0, 0, 1.0], + "8595": [0.19444, 0.69444, 0, 0, 0.5], + "8596": [-0.13313, 0.36687, 0, 0, 1.0], + "8597": [0.25, 0.75, 0, 0, 0.5], + "8598": [0.19444, 0.69444, 0, 0, 1.0], + "8599": [0.19444, 0.69444, 0, 0, 1.0], + "8600": [0.19444, 0.69444, 0, 0, 1.0], + "8601": [0.19444, 0.69444, 0, 0, 1.0], + "8614": [0.011, 0.511, 0, 0, 1.0], + "8617": [0.011, 0.511, 0, 0, 1.126], + "8618": [0.011, 0.511, 0, 0, 1.126], + "8636": [-0.13313, 0.36687, 0, 0, 1.0], + "8637": [-0.13313, 0.36687, 0, 0, 1.0], + "8640": [-0.13313, 0.36687, 0, 0, 1.0], + "8641": [-0.13313, 0.36687, 0, 0, 1.0], + "8652": [0.011, 0.671, 0, 0, 1.0], + "8656": [-0.13313, 0.36687, 0, 0, 1.0], + "8657": [0.19444, 0.69444, 0, 0, 0.61111], + "8658": [-0.13313, 0.36687, 0, 0, 1.0], + "8659": [0.19444, 0.69444, 0, 0, 0.61111], + "8660": [-0.13313, 0.36687, 0, 0, 1.0], + "8661": [0.25, 0.75, 0, 0, 0.61111], + "8704": [0, 0.69444, 0, 0, 0.55556], + "8706": [0, 0.69444, 0.05556, 0.08334, 0.5309], + "8707": [0, 0.69444, 0, 0, 0.55556], + "8709": [0.05556, 0.75, 0, 0, 0.5], + "8711": [0, 0.68333, 0, 0, 0.83334], + "8712": [0.0391, 0.5391, 0, 0, 0.66667], + "8715": [0.0391, 0.5391, 0, 0, 0.66667], + "8722": [0.08333, 0.58333, 0, 0, 0.77778], + "8723": [0.08333, 0.58333, 0, 0, 0.77778], + "8725": [0.25, 0.75, 0, 0, 0.5], + "8726": [0.25, 0.75, 0, 0, 0.5], + "8727": [-0.03472, 0.46528, 0, 0, 0.5], + "8728": [-0.05555, 0.44445, 0, 0, 0.5], + "8729": [-0.05555, 0.44445, 0, 0, 0.5], + "8730": [0.2, 0.8, 0, 0, 0.83334], + "8733": [0, 0.43056, 0, 0, 0.77778], + "8734": [0, 0.43056, 0, 0, 1.0], + "8736": [0, 0.69224, 0, 0, 0.72222], + "8739": [0.25, 0.75, 0, 0, 0.27778], + "8741": [0.25, 0.75, 0, 0, 0.5], + "8743": [0, 0.55556, 0, 0, 0.66667], + "8744": [0, 0.55556, 0, 0, 0.66667], + "8745": [0, 0.55556, 0, 0, 0.66667], + "8746": [0, 0.55556, 0, 0, 0.66667], + "8747": [0.19444, 0.69444, 0.11111, 0, 0.41667], + "8764": [-0.13313, 0.36687, 0, 0, 0.77778], + "8768": [0.19444, 0.69444, 0, 0, 0.27778], + "8771": [-0.03625, 0.46375, 0, 0, 0.77778], + "8773": [-0.022, 0.589, 0, 0, 1.0], + "8776": [-0.01688, 0.48312, 0, 0, 0.77778], + "8781": [-0.03625, 0.46375, 0, 0, 0.77778], + "8784": [-0.133, 0.67, 0, 0, 0.778], + "8801": [-0.03625, 0.46375, 0, 0, 0.77778], + "8804": [0.13597, 0.63597, 0, 0, 0.77778], + "8805": [0.13597, 0.63597, 0, 0, 0.77778], + "8810": [0.0391, 0.5391, 0, 0, 1.0], + "8811": [0.0391, 0.5391, 0, 0, 1.0], + "8826": [0.0391, 0.5391, 0, 0, 0.77778], + "8827": [0.0391, 0.5391, 0, 0, 0.77778], + "8834": [0.0391, 0.5391, 0, 0, 0.77778], + "8835": [0.0391, 0.5391, 0, 0, 0.77778], + "8838": [0.13597, 0.63597, 0, 0, 0.77778], + "8839": [0.13597, 0.63597, 0, 0, 0.77778], + "8846": [0, 0.55556, 0, 0, 0.66667], + "8849": [0.13597, 0.63597, 0, 0, 0.77778], + "8850": [0.13597, 0.63597, 0, 0, 0.77778], + "8851": [0, 0.55556, 0, 0, 0.66667], + "8852": [0, 0.55556, 0, 0, 0.66667], + "8853": [0.08333, 0.58333, 0, 0, 0.77778], + "8854": [0.08333, 0.58333, 0, 0, 0.77778], + "8855": [0.08333, 0.58333, 0, 0, 0.77778], + "8856": [0.08333, 0.58333, 0, 0, 0.77778], + "8857": [0.08333, 0.58333, 0, 0, 0.77778], + "8866": [0, 0.69444, 0, 0, 0.61111], + "8867": [0, 0.69444, 0, 0, 0.61111], + "8868": [0, 0.69444, 0, 0, 0.77778], + "8869": [0, 0.69444, 0, 0, 0.77778], + "8872": [0.249, 0.75, 0, 0, 0.867], + "8900": [-0.05555, 0.44445, 0, 0, 0.5], + "8901": [-0.05555, 0.44445, 0, 0, 0.27778], + "8902": [-0.03472, 0.46528, 0, 0, 0.5], + "8904": [0.005, 0.505, 0, 0, 0.9], + "8942": [0.03, 0.9, 0, 0, 0.278], + "8943": [-0.19, 0.31, 0, 0, 1.172], + "8945": [-0.1, 0.82, 0, 0, 1.282], + "8968": [0.25, 0.75, 0, 0, 0.44445], + "8969": [0.25, 0.75, 0, 0, 0.44445], + "8970": [0.25, 0.75, 0, 0, 0.44445], + "8971": [0.25, 0.75, 0, 0, 0.44445], + "8994": [-0.14236, 0.35764, 0, 0, 1.0], + "8995": [-0.14236, 0.35764, 0, 0, 1.0], + "9136": [0.244, 0.744, 0, 0, 0.412], + "9137": [0.244, 0.744, 0, 0, 0.412], + "9651": [0.19444, 0.69444, 0, 0, 0.88889], + "9657": [-0.03472, 0.46528, 0, 0, 0.5], + "9661": [0.19444, 0.69444, 0, 0, 0.88889], + "9667": [-0.03472, 0.46528, 0, 0, 0.5], + "9711": [0.19444, 0.69444, 0, 0, 1.0], + "9824": [0.12963, 0.69444, 0, 0, 0.77778], + "9825": [0.12963, 0.69444, 0, 0, 0.77778], + "9826": [0.12963, 0.69444, 0, 0, 0.77778], + "9827": [0.12963, 0.69444, 0, 0, 0.77778], + "9837": [0, 0.75, 0, 0, 0.38889], + "9838": [0.19444, 0.69444, 0, 0, 0.38889], + "9839": [0.19444, 0.69444, 0, 0, 0.38889], + "10216": [0.25, 0.75, 0, 0, 0.38889], + "10217": [0.25, 0.75, 0, 0, 0.38889], + "10222": [0.244, 0.744, 0, 0, 0.412], + "10223": [0.244, 0.744, 0, 0, 0.412], + "10229": [0.011, 0.511, 0, 0, 1.609], + "10230": [0.011, 0.511, 0, 0, 1.638], + "10231": [0.011, 0.511, 0, 0, 1.859], + "10232": [0.024, 0.525, 0, 0, 1.609], + "10233": [0.024, 0.525, 0, 0, 1.638], + "10234": [0.024, 0.525, 0, 0, 1.858], + "10236": [0.011, 0.511, 0, 0, 1.638], + "10815": [0, 0.68333, 0, 0, 0.75], + "10927": [0.13597, 0.63597, 0, 0, 0.77778], + "10928": [0.13597, 0.63597, 0, 0, 0.77778], + "57376": [0.19444, 0.69444, 0, 0, 0], + }, + "Math-BoldItalic": { + "32": [0, 0, 0, 0, 0.25], + "48": [0, 0.44444, 0, 0, 0.575], + "49": [0, 0.44444, 0, 0, 0.575], + "50": [0, 0.44444, 0, 0, 0.575], + "51": [0.19444, 0.44444, 0, 0, 0.575], + "52": [0.19444, 0.44444, 0, 0, 0.575], + "53": [0.19444, 0.44444, 0, 0, 0.575], + "54": [0, 0.64444, 0, 0, 0.575], + "55": [0.19444, 0.44444, 0, 0, 0.575], + "56": [0, 0.64444, 0, 0, 0.575], + "57": [0.19444, 0.44444, 0, 0, 0.575], + "65": [0, 0.68611, 0, 0, 0.86944], + "66": [0, 0.68611, 0.04835, 0, 0.8664], + "67": [0, 0.68611, 0.06979, 0, 0.81694], + "68": [0, 0.68611, 0.03194, 0, 0.93812], + "69": [0, 0.68611, 0.05451, 0, 0.81007], + "70": [0, 0.68611, 0.15972, 0, 0.68889], + "71": [0, 0.68611, 0, 0, 0.88673], + "72": [0, 0.68611, 0.08229, 0, 0.98229], + "73": [0, 0.68611, 0.07778, 0, 0.51111], + "74": [0, 0.68611, 0.10069, 0, 0.63125], + "75": [0, 0.68611, 0.06979, 0, 0.97118], + "76": [0, 0.68611, 0, 0, 0.75555], + "77": [0, 0.68611, 0.11424, 0, 1.14201], + "78": [0, 0.68611, 0.11424, 0, 0.95034], + "79": [0, 0.68611, 0.03194, 0, 0.83666], + "80": [0, 0.68611, 0.15972, 0, 0.72309], + "81": [0.19444, 0.68611, 0, 0, 0.86861], + "82": [0, 0.68611, 0.00421, 0, 0.87235], + "83": [0, 0.68611, 0.05382, 0, 0.69271], + "84": [0, 0.68611, 0.15972, 0, 0.63663], + "85": [0, 0.68611, 0.11424, 0, 0.80027], + "86": [0, 0.68611, 0.25555, 0, 0.67778], + "87": [0, 0.68611, 0.15972, 0, 1.09305], + "88": [0, 0.68611, 0.07778, 0, 0.94722], + "89": [0, 0.68611, 0.25555, 0, 0.67458], + "90": [0, 0.68611, 0.06979, 0, 0.77257], + "97": [0, 0.44444, 0, 0, 0.63287], + "98": [0, 0.69444, 0, 0, 0.52083], + "99": [0, 0.44444, 0, 0, 0.51342], + "100": [0, 0.69444, 0, 0, 0.60972], + "101": [0, 0.44444, 0, 0, 0.55361], + "102": [0.19444, 0.69444, 0.11042, 0, 0.56806], + "103": [0.19444, 0.44444, 0.03704, 0, 0.5449], + "104": [0, 0.69444, 0, 0, 0.66759], + "105": [0, 0.69326, 0, 0, 0.4048], + "106": [0.19444, 0.69326, 0.0622, 0, 0.47083], + "107": [0, 0.69444, 0.01852, 0, 0.6037], + "108": [0, 0.69444, 0.0088, 0, 0.34815], + "109": [0, 0.44444, 0, 0, 1.0324], + "110": [0, 0.44444, 0, 0, 0.71296], + "111": [0, 0.44444, 0, 0, 0.58472], + "112": [0.19444, 0.44444, 0, 0, 0.60092], + "113": [0.19444, 0.44444, 0.03704, 0, 0.54213], + "114": [0, 0.44444, 0.03194, 0, 0.5287], + "115": [0, 0.44444, 0, 0, 0.53125], + "116": [0, 0.63492, 0, 0, 0.41528], + "117": [0, 0.44444, 0, 0, 0.68102], + "118": [0, 0.44444, 0.03704, 0, 0.56666], + "119": [0, 0.44444, 0.02778, 0, 0.83148], + "120": [0, 0.44444, 0, 0, 0.65903], + "121": [0.19444, 0.44444, 0.03704, 0, 0.59028], + "122": [0, 0.44444, 0.04213, 0, 0.55509], + "160": [0, 0, 0, 0, 0.25], + "915": [0, 0.68611, 0.15972, 0, 0.65694], + "916": [0, 0.68611, 0, 0, 0.95833], + "920": [0, 0.68611, 0.03194, 0, 0.86722], + "923": [0, 0.68611, 0, 0, 0.80555], + "926": [0, 0.68611, 0.07458, 0, 0.84125], + "928": [0, 0.68611, 0.08229, 0, 0.98229], + "931": [0, 0.68611, 0.05451, 0, 0.88507], + "933": [0, 0.68611, 0.15972, 0, 0.67083], + "934": [0, 0.68611, 0, 0, 0.76666], + "936": [0, 0.68611, 0.11653, 0, 0.71402], + "937": [0, 0.68611, 0.04835, 0, 0.8789], + "945": [0, 0.44444, 0, 0, 0.76064], + "946": [0.19444, 0.69444, 0.03403, 0, 0.65972], + "947": [0.19444, 0.44444, 0.06389, 0, 0.59003], + "948": [0, 0.69444, 0.03819, 0, 0.52222], + "949": [0, 0.44444, 0, 0, 0.52882], + "950": [0.19444, 0.69444, 0.06215, 0, 0.50833], + "951": [0.19444, 0.44444, 0.03704, 0, 0.6], + "952": [0, 0.69444, 0.03194, 0, 0.5618], + "953": [0, 0.44444, 0, 0, 0.41204], + "954": [0, 0.44444, 0, 0, 0.66759], + "955": [0, 0.69444, 0, 0, 0.67083], + "956": [0.19444, 0.44444, 0, 0, 0.70787], + "957": [0, 0.44444, 0.06898, 0, 0.57685], + "958": [0.19444, 0.69444, 0.03021, 0, 0.50833], + "959": [0, 0.44444, 0, 0, 0.58472], + "960": [0, 0.44444, 0.03704, 0, 0.68241], + "961": [0.19444, 0.44444, 0, 0, 0.6118], + "962": [0.09722, 0.44444, 0.07917, 0, 0.42361], + "963": [0, 0.44444, 0.03704, 0, 0.68588], + "964": [0, 0.44444, 0.13472, 0, 0.52083], + "965": [0, 0.44444, 0.03704, 0, 0.63055], + "966": [0.19444, 0.44444, 0, 0, 0.74722], + "967": [0.19444, 0.44444, 0, 0, 0.71805], + "968": [0.19444, 0.69444, 0.03704, 0, 0.75833], + "969": [0, 0.44444, 0.03704, 0, 0.71782], + "977": [0, 0.69444, 0, 0, 0.69155], + "981": [0.19444, 0.69444, 0, 0, 0.7125], + "982": [0, 0.44444, 0.03194, 0, 0.975], + "1009": [0.19444, 0.44444, 0, 0, 0.6118], + "1013": [0, 0.44444, 0, 0, 0.48333], + "57649": [0, 0.44444, 0, 0, 0.39352], + "57911": [0.19444, 0.44444, 0, 0, 0.43889], + }, + "Math-Italic": { + "32": [0, 0, 0, 0, 0.25], + "48": [0, 0.43056, 0, 0, 0.5], + "49": [0, 0.43056, 0, 0, 0.5], + "50": [0, 0.43056, 0, 0, 0.5], + "51": [0.19444, 0.43056, 0, 0, 0.5], + "52": [0.19444, 0.43056, 0, 0, 0.5], + "53": [0.19444, 0.43056, 0, 0, 0.5], + "54": [0, 0.64444, 0, 0, 0.5], + "55": [0.19444, 0.43056, 0, 0, 0.5], + "56": [0, 0.64444, 0, 0, 0.5], + "57": [0.19444, 0.43056, 0, 0, 0.5], + "65": [0, 0.68333, 0, 0.13889, 0.75], + "66": [0, 0.68333, 0.05017, 0.08334, 0.75851], + "67": [0, 0.68333, 0.07153, 0.08334, 0.71472], + "68": [0, 0.68333, 0.02778, 0.05556, 0.82792], + "69": [0, 0.68333, 0.05764, 0.08334, 0.7382], + "70": [0, 0.68333, 0.13889, 0.08334, 0.64306], + "71": [0, 0.68333, 0, 0.08334, 0.78625], + "72": [0, 0.68333, 0.08125, 0.05556, 0.83125], + "73": [0, 0.68333, 0.07847, 0.11111, 0.43958], + "74": [0, 0.68333, 0.09618, 0.16667, 0.55451], + "75": [0, 0.68333, 0.07153, 0.05556, 0.84931], + "76": [0, 0.68333, 0, 0.02778, 0.68056], + "77": [0, 0.68333, 0.10903, 0.08334, 0.97014], + "78": [0, 0.68333, 0.10903, 0.08334, 0.80347], + "79": [0, 0.68333, 0.02778, 0.08334, 0.76278], + "80": [0, 0.68333, 0.13889, 0.08334, 0.64201], + "81": [0.19444, 0.68333, 0, 0.08334, 0.79056], + "82": [0, 0.68333, 0.00773, 0.08334, 0.75929], + "83": [0, 0.68333, 0.05764, 0.08334, 0.6132], + "84": [0, 0.68333, 0.13889, 0.08334, 0.58438], + "85": [0, 0.68333, 0.10903, 0.02778, 0.68278], + "86": [0, 0.68333, 0.22222, 0, 0.58333], + "87": [0, 0.68333, 0.13889, 0, 0.94445], + "88": [0, 0.68333, 0.07847, 0.08334, 0.82847], + "89": [0, 0.68333, 0.22222, 0, 0.58056], + "90": [0, 0.68333, 0.07153, 0.08334, 0.68264], + "97": [0, 0.43056, 0, 0, 0.52859], + "98": [0, 0.69444, 0, 0, 0.42917], + "99": [0, 0.43056, 0, 0.05556, 0.43276], + "100": [0, 0.69444, 0, 0.16667, 0.52049], + "101": [0, 0.43056, 0, 0.05556, 0.46563], + "102": [0.19444, 0.69444, 0.10764, 0.16667, 0.48959], + "103": [0.19444, 0.43056, 0.03588, 0.02778, 0.47697], + "104": [0, 0.69444, 0, 0, 0.57616], + "105": [0, 0.65952, 0, 0, 0.34451], + "106": [0.19444, 0.65952, 0.05724, 0, 0.41181], + "107": [0, 0.69444, 0.03148, 0, 0.5206], + "108": [0, 0.69444, 0.01968, 0.08334, 0.29838], + "109": [0, 0.43056, 0, 0, 0.87801], + "110": [0, 0.43056, 0, 0, 0.60023], + "111": [0, 0.43056, 0, 0.05556, 0.48472], + "112": [0.19444, 0.43056, 0, 0.08334, 0.50313], + "113": [0.19444, 0.43056, 0.03588, 0.08334, 0.44641], + "114": [0, 0.43056, 0.02778, 0.05556, 0.45116], + "115": [0, 0.43056, 0, 0.05556, 0.46875], + "116": [0, 0.61508, 0, 0.08334, 0.36111], + "117": [0, 0.43056, 0, 0.02778, 0.57246], + "118": [0, 0.43056, 0.03588, 0.02778, 0.48472], + "119": [0, 0.43056, 0.02691, 0.08334, 0.71592], + "120": [0, 0.43056, 0, 0.02778, 0.57153], + "121": [0.19444, 0.43056, 0.03588, 0.05556, 0.49028], + "122": [0, 0.43056, 0.04398, 0.05556, 0.46505], + "160": [0, 0, 0, 0, 0.25], + "915": [0, 0.68333, 0.13889, 0.08334, 0.61528], + "916": [0, 0.68333, 0, 0.16667, 0.83334], + "920": [0, 0.68333, 0.02778, 0.08334, 0.76278], + "923": [0, 0.68333, 0, 0.16667, 0.69445], + "926": [0, 0.68333, 0.07569, 0.08334, 0.74236], + "928": [0, 0.68333, 0.08125, 0.05556, 0.83125], + "931": [0, 0.68333, 0.05764, 0.08334, 0.77986], + "933": [0, 0.68333, 0.13889, 0.05556, 0.58333], + "934": [0, 0.68333, 0, 0.08334, 0.66667], + "936": [0, 0.68333, 0.11, 0.05556, 0.61222], + "937": [0, 0.68333, 0.05017, 0.08334, 0.7724], + "945": [0, 0.43056, 0.0037, 0.02778, 0.6397], + "946": [0.19444, 0.69444, 0.05278, 0.08334, 0.56563], + "947": [0.19444, 0.43056, 0.05556, 0, 0.51773], + "948": [0, 0.69444, 0.03785, 0.05556, 0.44444], + "949": [0, 0.43056, 0, 0.08334, 0.46632], + "950": [0.19444, 0.69444, 0.07378, 0.08334, 0.4375], + "951": [0.19444, 0.43056, 0.03588, 0.05556, 0.49653], + "952": [0, 0.69444, 0.02778, 0.08334, 0.46944], + "953": [0, 0.43056, 0, 0.05556, 0.35394], + "954": [0, 0.43056, 0, 0, 0.57616], + "955": [0, 0.69444, 0, 0, 0.58334], + "956": [0.19444, 0.43056, 0, 0.02778, 0.60255], + "957": [0, 0.43056, 0.06366, 0.02778, 0.49398], + "958": [0.19444, 0.69444, 0.04601, 0.11111, 0.4375], + "959": [0, 0.43056, 0, 0.05556, 0.48472], + "960": [0, 0.43056, 0.03588, 0, 0.57003], + "961": [0.19444, 0.43056, 0, 0.08334, 0.51702], + "962": [0.09722, 0.43056, 0.07986, 0.08334, 0.36285], + "963": [0, 0.43056, 0.03588, 0, 0.57141], + "964": [0, 0.43056, 0.1132, 0.02778, 0.43715], + "965": [0, 0.43056, 0.03588, 0.02778, 0.54028], + "966": [0.19444, 0.43056, 0, 0.08334, 0.65417], + "967": [0.19444, 0.43056, 0, 0.05556, 0.62569], + "968": [0.19444, 0.69444, 0.03588, 0.11111, 0.65139], + "969": [0, 0.43056, 0.03588, 0, 0.62245], + "977": [0, 0.69444, 0, 0.08334, 0.59144], + "981": [0.19444, 0.69444, 0, 0.08334, 0.59583], + "982": [0, 0.43056, 0.02778, 0, 0.82813], + "1009": [0.19444, 0.43056, 0, 0.08334, 0.51702], + "1013": [0, 0.43056, 0, 0.05556, 0.4059], + "57649": [0, 0.43056, 0, 0.02778, 0.32246], + "57911": [0.19444, 0.43056, 0, 0.08334, 0.38403], + }, + "SansSerif-Bold": { + "32": [0, 0, 0, 0, 0.25], + "33": [0, 0.69444, 0, 0, 0.36667], + "34": [0, 0.69444, 0, 0, 0.55834], + "35": [0.19444, 0.69444, 0, 0, 0.91667], + "36": [0.05556, 0.75, 0, 0, 0.55], + "37": [0.05556, 0.75, 0, 0, 1.02912], + "38": [0, 0.69444, 0, 0, 0.83056], + "39": [0, 0.69444, 0, 0, 0.30556], + "40": [0.25, 0.75, 0, 0, 0.42778], + "41": [0.25, 0.75, 0, 0, 0.42778], + "42": [0, 0.75, 0, 0, 0.55], + "43": [0.11667, 0.61667, 0, 0, 0.85556], + "44": [0.10556, 0.13056, 0, 0, 0.30556], + "45": [0, 0.45833, 0, 0, 0.36667], + "46": [0, 0.13056, 0, 0, 0.30556], + "47": [0.25, 0.75, 0, 0, 0.55], + "48": [0, 0.69444, 0, 0, 0.55], + "49": [0, 0.69444, 0, 0, 0.55], + "50": [0, 0.69444, 0, 0, 0.55], + "51": [0, 0.69444, 0, 0, 0.55], + "52": [0, 0.69444, 0, 0, 0.55], + "53": [0, 0.69444, 0, 0, 0.55], + "54": [0, 0.69444, 0, 0, 0.55], + "55": [0, 0.69444, 0, 0, 0.55], + "56": [0, 0.69444, 0, 0, 0.55], + "57": [0, 0.69444, 0, 0, 0.55], + "58": [0, 0.45833, 0, 0, 0.30556], + "59": [0.10556, 0.45833, 0, 0, 0.30556], + "61": [-0.09375, 0.40625, 0, 0, 0.85556], + "63": [0, 0.69444, 0, 0, 0.51945], + "64": [0, 0.69444, 0, 0, 0.73334], + "65": [0, 0.69444, 0, 0, 0.73334], + "66": [0, 0.69444, 0, 0, 0.73334], + "67": [0, 0.69444, 0, 0, 0.70278], + "68": [0, 0.69444, 0, 0, 0.79445], + "69": [0, 0.69444, 0, 0, 0.64167], + "70": [0, 0.69444, 0, 0, 0.61111], + "71": [0, 0.69444, 0, 0, 0.73334], + "72": [0, 0.69444, 0, 0, 0.79445], + "73": [0, 0.69444, 0, 0, 0.33056], + "74": [0, 0.69444, 0, 0, 0.51945], + "75": [0, 0.69444, 0, 0, 0.76389], + "76": [0, 0.69444, 0, 0, 0.58056], + "77": [0, 0.69444, 0, 0, 0.97778], + "78": [0, 0.69444, 0, 0, 0.79445], + "79": [0, 0.69444, 0, 0, 0.79445], + "80": [0, 0.69444, 0, 0, 0.70278], + "81": [0.10556, 0.69444, 0, 0, 0.79445], + "82": [0, 0.69444, 0, 0, 0.70278], + "83": [0, 0.69444, 0, 0, 0.61111], + "84": [0, 0.69444, 0, 0, 0.73334], + "85": [0, 0.69444, 0, 0, 0.76389], + "86": [0, 0.69444, 0.01528, 0, 0.73334], + "87": [0, 0.69444, 0.01528, 0, 1.03889], + "88": [0, 0.69444, 0, 0, 0.73334], + "89": [0, 0.69444, 0.0275, 0, 0.73334], + "90": [0, 0.69444, 0, 0, 0.67223], + "91": [0.25, 0.75, 0, 0, 0.34306], + "93": [0.25, 0.75, 0, 0, 0.34306], + "94": [0, 0.69444, 0, 0, 0.55], + "95": [0.35, 0.10833, 0.03056, 0, 0.55], + "97": [0, 0.45833, 0, 0, 0.525], + "98": [0, 0.69444, 0, 0, 0.56111], + "99": [0, 0.45833, 0, 0, 0.48889], + "100": [0, 0.69444, 0, 0, 0.56111], + "101": [0, 0.45833, 0, 0, 0.51111], + "102": [0, 0.69444, 0.07639, 0, 0.33611], + "103": [0.19444, 0.45833, 0.01528, 0, 0.55], + "104": [0, 0.69444, 0, 0, 0.56111], + "105": [0, 0.69444, 0, 0, 0.25556], + "106": [0.19444, 0.69444, 0, 0, 0.28611], + "107": [0, 0.69444, 0, 0, 0.53056], + "108": [0, 0.69444, 0, 0, 0.25556], + "109": [0, 0.45833, 0, 0, 0.86667], + "110": [0, 0.45833, 0, 0, 0.56111], + "111": [0, 0.45833, 0, 0, 0.55], + "112": [0.19444, 0.45833, 0, 0, 0.56111], + "113": [0.19444, 0.45833, 0, 0, 0.56111], + "114": [0, 0.45833, 0.01528, 0, 0.37222], + "115": [0, 0.45833, 0, 0, 0.42167], + "116": [0, 0.58929, 0, 0, 0.40417], + "117": [0, 0.45833, 0, 0, 0.56111], + "118": [0, 0.45833, 0.01528, 0, 0.5], + "119": [0, 0.45833, 0.01528, 0, 0.74445], + "120": [0, 0.45833, 0, 0, 0.5], + "121": [0.19444, 0.45833, 0.01528, 0, 0.5], + "122": [0, 0.45833, 0, 0, 0.47639], + "126": [0.35, 0.34444, 0, 0, 0.55], + "160": [0, 0, 0, 0, 0.25], + "168": [0, 0.69444, 0, 0, 0.55], + "176": [0, 0.69444, 0, 0, 0.73334], + "180": [0, 0.69444, 0, 0, 0.55], + "184": [0.17014, 0, 0, 0, 0.48889], + "305": [0, 0.45833, 0, 0, 0.25556], + "567": [0.19444, 0.45833, 0, 0, 0.28611], + "710": [0, 0.69444, 0, 0, 0.55], + "711": [0, 0.63542, 0, 0, 0.55], + "713": [0, 0.63778, 0, 0, 0.55], + "728": [0, 0.69444, 0, 0, 0.55], + "729": [0, 0.69444, 0, 0, 0.30556], + "730": [0, 0.69444, 0, 0, 0.73334], + "732": [0, 0.69444, 0, 0, 0.55], + "733": [0, 0.69444, 0, 0, 0.55], + "915": [0, 0.69444, 0, 0, 0.58056], + "916": [0, 0.69444, 0, 0, 0.91667], + "920": [0, 0.69444, 0, 0, 0.85556], + "923": [0, 0.69444, 0, 0, 0.67223], + "926": [0, 0.69444, 0, 0, 0.73334], + "928": [0, 0.69444, 0, 0, 0.79445], + "931": [0, 0.69444, 0, 0, 0.79445], + "933": [0, 0.69444, 0, 0, 0.85556], + "934": [0, 0.69444, 0, 0, 0.79445], + "936": [0, 0.69444, 0, 0, 0.85556], + "937": [0, 0.69444, 0, 0, 0.79445], + "8211": [0, 0.45833, 0.03056, 0, 0.55], + "8212": [0, 0.45833, 0.03056, 0, 1.10001], + "8216": [0, 0.69444, 0, 0, 0.30556], + "8217": [0, 0.69444, 0, 0, 0.30556], + "8220": [0, 0.69444, 0, 0, 0.55834], + "8221": [0, 0.69444, 0, 0, 0.55834], + }, + "SansSerif-Italic": { + "32": [0, 0, 0, 0, 0.25], + "33": [0, 0.69444, 0.05733, 0, 0.31945], + "34": [0, 0.69444, 0.00316, 0, 0.5], + "35": [0.19444, 0.69444, 0.05087, 0, 0.83334], + "36": [0.05556, 0.75, 0.11156, 0, 0.5], + "37": [0.05556, 0.75, 0.03126, 0, 0.83334], + "38": [0, 0.69444, 0.03058, 0, 0.75834], + "39": [0, 0.69444, 0.07816, 0, 0.27778], + "40": [0.25, 0.75, 0.13164, 0, 0.38889], + "41": [0.25, 0.75, 0.02536, 0, 0.38889], + "42": [0, 0.75, 0.11775, 0, 0.5], + "43": [0.08333, 0.58333, 0.02536, 0, 0.77778], + "44": [0.125, 0.08333, 0, 0, 0.27778], + "45": [0, 0.44444, 0.01946, 0, 0.33333], + "46": [0, 0.08333, 0, 0, 0.27778], + "47": [0.25, 0.75, 0.13164, 0, 0.5], + "48": [0, 0.65556, 0.11156, 0, 0.5], + "49": [0, 0.65556, 0.11156, 0, 0.5], + "50": [0, 0.65556, 0.11156, 0, 0.5], + "51": [0, 0.65556, 0.11156, 0, 0.5], + "52": [0, 0.65556, 0.11156, 0, 0.5], + "53": [0, 0.65556, 0.11156, 0, 0.5], + "54": [0, 0.65556, 0.11156, 0, 0.5], + "55": [0, 0.65556, 0.11156, 0, 0.5], + "56": [0, 0.65556, 0.11156, 0, 0.5], + "57": [0, 0.65556, 0.11156, 0, 0.5], + "58": [0, 0.44444, 0.02502, 0, 0.27778], + "59": [0.125, 0.44444, 0.02502, 0, 0.27778], + "61": [-0.13, 0.37, 0.05087, 0, 0.77778], + "63": [0, 0.69444, 0.11809, 0, 0.47222], + "64": [0, 0.69444, 0.07555, 0, 0.66667], + "65": [0, 0.69444, 0, 0, 0.66667], + "66": [0, 0.69444, 0.08293, 0, 0.66667], + "67": [0, 0.69444, 0.11983, 0, 0.63889], + "68": [0, 0.69444, 0.07555, 0, 0.72223], + "69": [0, 0.69444, 0.11983, 0, 0.59722], + "70": [0, 0.69444, 0.13372, 0, 0.56945], + "71": [0, 0.69444, 0.11983, 0, 0.66667], + "72": [0, 0.69444, 0.08094, 0, 0.70834], + "73": [0, 0.69444, 0.13372, 0, 0.27778], + "74": [0, 0.69444, 0.08094, 0, 0.47222], + "75": [0, 0.69444, 0.11983, 0, 0.69445], + "76": [0, 0.69444, 0, 0, 0.54167], + "77": [0, 0.69444, 0.08094, 0, 0.875], + "78": [0, 0.69444, 0.08094, 0, 0.70834], + "79": [0, 0.69444, 0.07555, 0, 0.73611], + "80": [0, 0.69444, 0.08293, 0, 0.63889], + "81": [0.125, 0.69444, 0.07555, 0, 0.73611], + "82": [0, 0.69444, 0.08293, 0, 0.64584], + "83": [0, 0.69444, 0.09205, 0, 0.55556], + "84": [0, 0.69444, 0.13372, 0, 0.68056], + "85": [0, 0.69444, 0.08094, 0, 0.6875], + "86": [0, 0.69444, 0.1615, 0, 0.66667], + "87": [0, 0.69444, 0.1615, 0, 0.94445], + "88": [0, 0.69444, 0.13372, 0, 0.66667], + "89": [0, 0.69444, 0.17261, 0, 0.66667], + "90": [0, 0.69444, 0.11983, 0, 0.61111], + "91": [0.25, 0.75, 0.15942, 0, 0.28889], + "93": [0.25, 0.75, 0.08719, 0, 0.28889], + "94": [0, 0.69444, 0.0799, 0, 0.5], + "95": [0.35, 0.09444, 0.08616, 0, 0.5], + "97": [0, 0.44444, 0.00981, 0, 0.48056], + "98": [0, 0.69444, 0.03057, 0, 0.51667], + "99": [0, 0.44444, 0.08336, 0, 0.44445], + "100": [0, 0.69444, 0.09483, 0, 0.51667], + "101": [0, 0.44444, 0.06778, 0, 0.44445], + "102": [0, 0.69444, 0.21705, 0, 0.30556], + "103": [0.19444, 0.44444, 0.10836, 0, 0.5], + "104": [0, 0.69444, 0.01778, 0, 0.51667], + "105": [0, 0.67937, 0.09718, 0, 0.23889], + "106": [0.19444, 0.67937, 0.09162, 0, 0.26667], + "107": [0, 0.69444, 0.08336, 0, 0.48889], + "108": [0, 0.69444, 0.09483, 0, 0.23889], + "109": [0, 0.44444, 0.01778, 0, 0.79445], + "110": [0, 0.44444, 0.01778, 0, 0.51667], + "111": [0, 0.44444, 0.06613, 0, 0.5], + "112": [0.19444, 0.44444, 0.0389, 0, 0.51667], + "113": [0.19444, 0.44444, 0.04169, 0, 0.51667], + "114": [0, 0.44444, 0.10836, 0, 0.34167], + "115": [0, 0.44444, 0.0778, 0, 0.38333], + "116": [0, 0.57143, 0.07225, 0, 0.36111], + "117": [0, 0.44444, 0.04169, 0, 0.51667], + "118": [0, 0.44444, 0.10836, 0, 0.46111], + "119": [0, 0.44444, 0.10836, 0, 0.68334], + "120": [0, 0.44444, 0.09169, 0, 0.46111], + "121": [0.19444, 0.44444, 0.10836, 0, 0.46111], + "122": [0, 0.44444, 0.08752, 0, 0.43472], + "126": [0.35, 0.32659, 0.08826, 0, 0.5], + "160": [0, 0, 0, 0, 0.25], + "168": [0, 0.67937, 0.06385, 0, 0.5], + "176": [0, 0.69444, 0, 0, 0.73752], + "184": [0.17014, 0, 0, 0, 0.44445], + "305": [0, 0.44444, 0.04169, 0, 0.23889], + "567": [0.19444, 0.44444, 0.04169, 0, 0.26667], + "710": [0, 0.69444, 0.0799, 0, 0.5], + "711": [0, 0.63194, 0.08432, 0, 0.5], + "713": [0, 0.60889, 0.08776, 0, 0.5], + "714": [0, 0.69444, 0.09205, 0, 0.5], + "715": [0, 0.69444, 0, 0, 0.5], + "728": [0, 0.69444, 0.09483, 0, 0.5], + "729": [0, 0.67937, 0.07774, 0, 0.27778], + "730": [0, 0.69444, 0, 0, 0.73752], + "732": [0, 0.67659, 0.08826, 0, 0.5], + "733": [0, 0.69444, 0.09205, 0, 0.5], + "915": [0, 0.69444, 0.13372, 0, 0.54167], + "916": [0, 0.69444, 0, 0, 0.83334], + "920": [0, 0.69444, 0.07555, 0, 0.77778], + "923": [0, 0.69444, 0, 0, 0.61111], + "926": [0, 0.69444, 0.12816, 0, 0.66667], + "928": [0, 0.69444, 0.08094, 0, 0.70834], + "931": [0, 0.69444, 0.11983, 0, 0.72222], + "933": [0, 0.69444, 0.09031, 0, 0.77778], + "934": [0, 0.69444, 0.04603, 0, 0.72222], + "936": [0, 0.69444, 0.09031, 0, 0.77778], + "937": [0, 0.69444, 0.08293, 0, 0.72222], + "8211": [0, 0.44444, 0.08616, 0, 0.5], + "8212": [0, 0.44444, 0.08616, 0, 1.0], + "8216": [0, 0.69444, 0.07816, 0, 0.27778], + "8217": [0, 0.69444, 0.07816, 0, 0.27778], + "8220": [0, 0.69444, 0.14205, 0, 0.5], + "8221": [0, 0.69444, 0.00316, 0, 0.5], + }, + "SansSerif-Regular": { + "32": [0, 0, 0, 0, 0.25], + "33": [0, 0.69444, 0, 0, 0.31945], + "34": [0, 0.69444, 0, 0, 0.5], + "35": [0.19444, 0.69444, 0, 0, 0.83334], + "36": [0.05556, 0.75, 0, 0, 0.5], + "37": [0.05556, 0.75, 0, 0, 0.83334], + "38": [0, 0.69444, 0, 0, 0.75834], + "39": [0, 0.69444, 0, 0, 0.27778], + "40": [0.25, 0.75, 0, 0, 0.38889], + "41": [0.25, 0.75, 0, 0, 0.38889], + "42": [0, 0.75, 0, 0, 0.5], + "43": [0.08333, 0.58333, 0, 0, 0.77778], + "44": [0.125, 0.08333, 0, 0, 0.27778], + "45": [0, 0.44444, 0, 0, 0.33333], + "46": [0, 0.08333, 0, 0, 0.27778], + "47": [0.25, 0.75, 0, 0, 0.5], + "48": [0, 0.65556, 0, 0, 0.5], + "49": [0, 0.65556, 0, 0, 0.5], + "50": [0, 0.65556, 0, 0, 0.5], + "51": [0, 0.65556, 0, 0, 0.5], + "52": [0, 0.65556, 0, 0, 0.5], + "53": [0, 0.65556, 0, 0, 0.5], + "54": [0, 0.65556, 0, 0, 0.5], + "55": [0, 0.65556, 0, 0, 0.5], + "56": [0, 0.65556, 0, 0, 0.5], + "57": [0, 0.65556, 0, 0, 0.5], + "58": [0, 0.44444, 0, 0, 0.27778], + "59": [0.125, 0.44444, 0, 0, 0.27778], + "61": [-0.13, 0.37, 0, 0, 0.77778], + "63": [0, 0.69444, 0, 0, 0.47222], + "64": [0, 0.69444, 0, 0, 0.66667], + "65": [0, 0.69444, 0, 0, 0.66667], + "66": [0, 0.69444, 0, 0, 0.66667], + "67": [0, 0.69444, 0, 0, 0.63889], + "68": [0, 0.69444, 0, 0, 0.72223], + "69": [0, 0.69444, 0, 0, 0.59722], + "70": [0, 0.69444, 0, 0, 0.56945], + "71": [0, 0.69444, 0, 0, 0.66667], + "72": [0, 0.69444, 0, 0, 0.70834], + "73": [0, 0.69444, 0, 0, 0.27778], + "74": [0, 0.69444, 0, 0, 0.47222], + "75": [0, 0.69444, 0, 0, 0.69445], + "76": [0, 0.69444, 0, 0, 0.54167], + "77": [0, 0.69444, 0, 0, 0.875], + "78": [0, 0.69444, 0, 0, 0.70834], + "79": [0, 0.69444, 0, 0, 0.73611], + "80": [0, 0.69444, 0, 0, 0.63889], + "81": [0.125, 0.69444, 0, 0, 0.73611], + "82": [0, 0.69444, 0, 0, 0.64584], + "83": [0, 0.69444, 0, 0, 0.55556], + "84": [0, 0.69444, 0, 0, 0.68056], + "85": [0, 0.69444, 0, 0, 0.6875], + "86": [0, 0.69444, 0.01389, 0, 0.66667], + "87": [0, 0.69444, 0.01389, 0, 0.94445], + "88": [0, 0.69444, 0, 0, 0.66667], + "89": [0, 0.69444, 0.025, 0, 0.66667], + "90": [0, 0.69444, 0, 0, 0.61111], + "91": [0.25, 0.75, 0, 0, 0.28889], + "93": [0.25, 0.75, 0, 0, 0.28889], + "94": [0, 0.69444, 0, 0, 0.5], + "95": [0.35, 0.09444, 0.02778, 0, 0.5], + "97": [0, 0.44444, 0, 0, 0.48056], + "98": [0, 0.69444, 0, 0, 0.51667], + "99": [0, 0.44444, 0, 0, 0.44445], + "100": [0, 0.69444, 0, 0, 0.51667], + "101": [0, 0.44444, 0, 0, 0.44445], + "102": [0, 0.69444, 0.06944, 0, 0.30556], + "103": [0.19444, 0.44444, 0.01389, 0, 0.5], + "104": [0, 0.69444, 0, 0, 0.51667], + "105": [0, 0.67937, 0, 0, 0.23889], + "106": [0.19444, 0.67937, 0, 0, 0.26667], + "107": [0, 0.69444, 0, 0, 0.48889], + "108": [0, 0.69444, 0, 0, 0.23889], + "109": [0, 0.44444, 0, 0, 0.79445], + "110": [0, 0.44444, 0, 0, 0.51667], + "111": [0, 0.44444, 0, 0, 0.5], + "112": [0.19444, 0.44444, 0, 0, 0.51667], + "113": [0.19444, 0.44444, 0, 0, 0.51667], + "114": [0, 0.44444, 0.01389, 0, 0.34167], + "115": [0, 0.44444, 0, 0, 0.38333], + "116": [0, 0.57143, 0, 0, 0.36111], + "117": [0, 0.44444, 0, 0, 0.51667], + "118": [0, 0.44444, 0.01389, 0, 0.46111], + "119": [0, 0.44444, 0.01389, 0, 0.68334], + "120": [0, 0.44444, 0, 0, 0.46111], + "121": [0.19444, 0.44444, 0.01389, 0, 0.46111], + "122": [0, 0.44444, 0, 0, 0.43472], + "126": [0.35, 0.32659, 0, 0, 0.5], + "160": [0, 0, 0, 0, 0.25], + "168": [0, 0.67937, 0, 0, 0.5], + "176": [0, 0.69444, 0, 0, 0.66667], + "184": [0.17014, 0, 0, 0, 0.44445], + "305": [0, 0.44444, 0, 0, 0.23889], + "567": [0.19444, 0.44444, 0, 0, 0.26667], + "710": [0, 0.69444, 0, 0, 0.5], + "711": [0, 0.63194, 0, 0, 0.5], + "713": [0, 0.60889, 0, 0, 0.5], + "714": [0, 0.69444, 0, 0, 0.5], + "715": [0, 0.69444, 0, 0, 0.5], + "728": [0, 0.69444, 0, 0, 0.5], + "729": [0, 0.67937, 0, 0, 0.27778], + "730": [0, 0.69444, 0, 0, 0.66667], + "732": [0, 0.67659, 0, 0, 0.5], + "733": [0, 0.69444, 0, 0, 0.5], + "915": [0, 0.69444, 0, 0, 0.54167], + "916": [0, 0.69444, 0, 0, 0.83334], + "920": [0, 0.69444, 0, 0, 0.77778], + "923": [0, 0.69444, 0, 0, 0.61111], + "926": [0, 0.69444, 0, 0, 0.66667], + "928": [0, 0.69444, 0, 0, 0.70834], + "931": [0, 0.69444, 0, 0, 0.72222], + "933": [0, 0.69444, 0, 0, 0.77778], + "934": [0, 0.69444, 0, 0, 0.72222], + "936": [0, 0.69444, 0, 0, 0.77778], + "937": [0, 0.69444, 0, 0, 0.72222], + "8211": [0, 0.44444, 0.02778, 0, 0.5], + "8212": [0, 0.44444, 0.02778, 0, 1.0], + "8216": [0, 0.69444, 0, 0, 0.27778], + "8217": [0, 0.69444, 0, 0, 0.27778], + "8220": [0, 0.69444, 0, 0, 0.5], + "8221": [0, 0.69444, 0, 0, 0.5], + }, + "Script-Regular": { + "32": [0, 0, 0, 0, 0.25], + "65": [0, 0.7, 0.22925, 0, 0.80253], + "66": [0, 0.7, 0.04087, 0, 0.90757], + "67": [0, 0.7, 0.1689, 0, 0.66619], + "68": [0, 0.7, 0.09371, 0, 0.77443], + "69": [0, 0.7, 0.18583, 0, 0.56162], + "70": [0, 0.7, 0.13634, 0, 0.89544], + "71": [0, 0.7, 0.17322, 0, 0.60961], + "72": [0, 0.7, 0.29694, 0, 0.96919], + "73": [0, 0.7, 0.19189, 0, 0.80907], + "74": [0.27778, 0.7, 0.19189, 0, 1.05159], + "75": [0, 0.7, 0.31259, 0, 0.91364], + "76": [0, 0.7, 0.19189, 0, 0.87373], + "77": [0, 0.7, 0.15981, 0, 1.08031], + "78": [0, 0.7, 0.3525, 0, 0.9015], + "79": [0, 0.7, 0.08078, 0, 0.73787], + "80": [0, 0.7, 0.08078, 0, 1.01262], + "81": [0, 0.7, 0.03305, 0, 0.88282], + "82": [0, 0.7, 0.06259, 0, 0.85], + "83": [0, 0.7, 0.19189, 0, 0.86767], + "84": [0, 0.7, 0.29087, 0, 0.74697], + "85": [0, 0.7, 0.25815, 0, 0.79996], + "86": [0, 0.7, 0.27523, 0, 0.62204], + "87": [0, 0.7, 0.27523, 0, 0.80532], + "88": [0, 0.7, 0.26006, 0, 0.94445], + "89": [0, 0.7, 0.2939, 0, 0.70961], + "90": [0, 0.7, 0.24037, 0, 0.8212], + "160": [0, 0, 0, 0, 0.25], + }, + "Size1-Regular": { + "32": [0, 0, 0, 0, 0.25], + "40": [0.35001, 0.85, 0, 0, 0.45834], + "41": [0.35001, 0.85, 0, 0, 0.45834], + "47": [0.35001, 0.85, 0, 0, 0.57778], + "91": [0.35001, 0.85, 0, 0, 0.41667], + "92": [0.35001, 0.85, 0, 0, 0.57778], + "93": [0.35001, 0.85, 0, 0, 0.41667], + "123": [0.35001, 0.85, 0, 0, 0.58334], + "125": [0.35001, 0.85, 0, 0, 0.58334], + "160": [0, 0, 0, 0, 0.25], + "710": [0, 0.72222, 0, 0, 0.55556], + "732": [0, 0.72222, 0, 0, 0.55556], + "770": [0, 0.72222, 0, 0, 0.55556], + "771": [0, 0.72222, 0, 0, 0.55556], + "8214": [-0.00099, 0.601, 0, 0, 0.77778], + "8593": [1e-05, 0.6, 0, 0, 0.66667], + "8595": [1e-05, 0.6, 0, 0, 0.66667], + "8657": [1e-05, 0.6, 0, 0, 0.77778], + "8659": [1e-05, 0.6, 0, 0, 0.77778], + "8719": [0.25001, 0.75, 0, 0, 0.94445], + "8720": [0.25001, 0.75, 0, 0, 0.94445], + "8721": [0.25001, 0.75, 0, 0, 1.05556], + "8730": [0.35001, 0.85, 0, 0, 1.0], + "8739": [-0.00599, 0.606, 0, 0, 0.33333], + "8741": [-0.00599, 0.606, 0, 0, 0.55556], + "8747": [0.30612, 0.805, 0.19445, 0, 0.47222], + "8748": [0.306, 0.805, 0.19445, 0, 0.47222], + "8749": [0.306, 0.805, 0.19445, 0, 0.47222], + "8750": [0.30612, 0.805, 0.19445, 0, 0.47222], + "8896": [0.25001, 0.75, 0, 0, 0.83334], + "8897": [0.25001, 0.75, 0, 0, 0.83334], + "8898": [0.25001, 0.75, 0, 0, 0.83334], + "8899": [0.25001, 0.75, 0, 0, 0.83334], + "8968": [0.35001, 0.85, 0, 0, 0.47222], + "8969": [0.35001, 0.85, 0, 0, 0.47222], + "8970": [0.35001, 0.85, 0, 0, 0.47222], + "8971": [0.35001, 0.85, 0, 0, 0.47222], + "9168": [-0.00099, 0.601, 0, 0, 0.66667], + "10216": [0.35001, 0.85, 0, 0, 0.47222], + "10217": [0.35001, 0.85, 0, 0, 0.47222], + "10752": [0.25001, 0.75, 0, 0, 1.11111], + "10753": [0.25001, 0.75, 0, 0, 1.11111], + "10754": [0.25001, 0.75, 0, 0, 1.11111], + "10756": [0.25001, 0.75, 0, 0, 0.83334], + "10758": [0.25001, 0.75, 0, 0, 0.83334], + }, + "Size2-Regular": { + "32": [0, 0, 0, 0, 0.25], + "40": [0.65002, 1.15, 0, 0, 0.59722], + "41": [0.65002, 1.15, 0, 0, 0.59722], + "47": [0.65002, 1.15, 0, 0, 0.81111], + "91": [0.65002, 1.15, 0, 0, 0.47222], + "92": [0.65002, 1.15, 0, 0, 0.81111], + "93": [0.65002, 1.15, 0, 0, 0.47222], + "123": [0.65002, 1.15, 0, 0, 0.66667], + "125": [0.65002, 1.15, 0, 0, 0.66667], + "160": [0, 0, 0, 0, 0.25], + "710": [0, 0.75, 0, 0, 1.0], + "732": [0, 0.75, 0, 0, 1.0], + "770": [0, 0.75, 0, 0, 1.0], + "771": [0, 0.75, 0, 0, 1.0], + "8719": [0.55001, 1.05, 0, 0, 1.27778], + "8720": [0.55001, 1.05, 0, 0, 1.27778], + "8721": [0.55001, 1.05, 0, 0, 1.44445], + "8730": [0.65002, 1.15, 0, 0, 1.0], + "8747": [0.86225, 1.36, 0.44445, 0, 0.55556], + "8748": [0.862, 1.36, 0.44445, 0, 0.55556], + "8749": [0.862, 1.36, 0.44445, 0, 0.55556], + "8750": [0.86225, 1.36, 0.44445, 0, 0.55556], + "8896": [0.55001, 1.05, 0, 0, 1.11111], + "8897": [0.55001, 1.05, 0, 0, 1.11111], + "8898": [0.55001, 1.05, 0, 0, 1.11111], + "8899": [0.55001, 1.05, 0, 0, 1.11111], + "8968": [0.65002, 1.15, 0, 0, 0.52778], + "8969": [0.65002, 1.15, 0, 0, 0.52778], + "8970": [0.65002, 1.15, 0, 0, 0.52778], + "8971": [0.65002, 1.15, 0, 0, 0.52778], + "10216": [0.65002, 1.15, 0, 0, 0.61111], + "10217": [0.65002, 1.15, 0, 0, 0.61111], + "10752": [0.55001, 1.05, 0, 0, 1.51112], + "10753": [0.55001, 1.05, 0, 0, 1.51112], + "10754": [0.55001, 1.05, 0, 0, 1.51112], + "10756": [0.55001, 1.05, 0, 0, 1.11111], + "10758": [0.55001, 1.05, 0, 0, 1.11111], + }, + "Size3-Regular": { + "32": [0, 0, 0, 0, 0.25], + "40": [0.95003, 1.45, 0, 0, 0.73611], + "41": [0.95003, 1.45, 0, 0, 0.73611], + "47": [0.95003, 1.45, 0, 0, 1.04445], + "91": [0.95003, 1.45, 0, 0, 0.52778], + "92": [0.95003, 1.45, 0, 0, 1.04445], + "93": [0.95003, 1.45, 0, 0, 0.52778], + "123": [0.95003, 1.45, 0, 0, 0.75], + "125": [0.95003, 1.45, 0, 0, 0.75], + "160": [0, 0, 0, 0, 0.25], + "710": [0, 0.75, 0, 0, 1.44445], + "732": [0, 0.75, 0, 0, 1.44445], + "770": [0, 0.75, 0, 0, 1.44445], + "771": [0, 0.75, 0, 0, 1.44445], + "8730": [0.95003, 1.45, 0, 0, 1.0], + "8968": [0.95003, 1.45, 0, 0, 0.58334], + "8969": [0.95003, 1.45, 0, 0, 0.58334], + "8970": [0.95003, 1.45, 0, 0, 0.58334], + "8971": [0.95003, 1.45, 0, 0, 0.58334], + "10216": [0.95003, 1.45, 0, 0, 0.75], + "10217": [0.95003, 1.45, 0, 0, 0.75], + }, + "Size4-Regular": { + "32": [0, 0, 0, 0, 0.25], + "40": [1.25003, 1.75, 0, 0, 0.79167], + "41": [1.25003, 1.75, 0, 0, 0.79167], + "47": [1.25003, 1.75, 0, 0, 1.27778], + "91": [1.25003, 1.75, 0, 0, 0.58334], + "92": [1.25003, 1.75, 0, 0, 1.27778], + "93": [1.25003, 1.75, 0, 0, 0.58334], + "123": [1.25003, 1.75, 0, 0, 0.80556], + "125": [1.25003, 1.75, 0, 0, 0.80556], + "160": [0, 0, 0, 0, 0.25], + "710": [0, 0.825, 0, 0, 1.8889], + "732": [0, 0.825, 0, 0, 1.8889], + "770": [0, 0.825, 0, 0, 1.8889], + "771": [0, 0.825, 0, 0, 1.8889], + "8730": [1.25003, 1.75, 0, 0, 1.0], + "8968": [1.25003, 1.75, 0, 0, 0.63889], + "8969": [1.25003, 1.75, 0, 0, 0.63889], + "8970": [1.25003, 1.75, 0, 0, 0.63889], + "8971": [1.25003, 1.75, 0, 0, 0.63889], + "9115": [0.64502, 1.155, 0, 0, 0.875], + "9116": [1e-05, 0.6, 0, 0, 0.875], + "9117": [0.64502, 1.155, 0, 0, 0.875], + "9118": [0.64502, 1.155, 0, 0, 0.875], + "9119": [1e-05, 0.6, 0, 0, 0.875], + "9120": [0.64502, 1.155, 0, 0, 0.875], + "9121": [0.64502, 1.155, 0, 0, 0.66667], + "9122": [-0.00099, 0.601, 0, 0, 0.66667], + "9123": [0.64502, 1.155, 0, 0, 0.66667], + "9124": [0.64502, 1.155, 0, 0, 0.66667], + "9125": [-0.00099, 0.601, 0, 0, 0.66667], + "9126": [0.64502, 1.155, 0, 0, 0.66667], + "9127": [1e-05, 0.9, 0, 0, 0.88889], + "9128": [0.65002, 1.15, 0, 0, 0.88889], + "9129": [0.90001, 0, 0, 0, 0.88889], + "9130": [0, 0.3, 0, 0, 0.88889], + "9131": [1e-05, 0.9, 0, 0, 0.88889], + "9132": [0.65002, 1.15, 0, 0, 0.88889], + "9133": [0.90001, 0, 0, 0, 0.88889], + "9143": [0.88502, 0.915, 0, 0, 1.05556], + "10216": [1.25003, 1.75, 0, 0, 0.80556], + "10217": [1.25003, 1.75, 0, 0, 0.80556], + "57344": [-0.00499, 0.605, 0, 0, 1.05556], + "57345": [-0.00499, 0.605, 0, 0, 1.05556], + "57680": [0, 0.12, 0, 0, 0.45], + "57681": [0, 0.12, 0, 0, 0.45], + "57682": [0, 0.12, 0, 0, 0.45], + "57683": [0, 0.12, 0, 0, 0.45], + }, + "Typewriter-Regular": { + "32": [0, 0, 0, 0, 0.525], + "33": [0, 0.61111, 0, 0, 0.525], + "34": [0, 0.61111, 0, 0, 0.525], + "35": [0, 0.61111, 0, 0, 0.525], + "36": [0.08333, 0.69444, 0, 0, 0.525], + "37": [0.08333, 0.69444, 0, 0, 0.525], + "38": [0, 0.61111, 0, 0, 0.525], + "39": [0, 0.61111, 0, 0, 0.525], + "40": [0.08333, 0.69444, 0, 0, 0.525], + "41": [0.08333, 0.69444, 0, 0, 0.525], + "42": [0, 0.52083, 0, 0, 0.525], + "43": [-0.08056, 0.53055, 0, 0, 0.525], + "44": [0.13889, 0.125, 0, 0, 0.525], + "45": [-0.08056, 0.53055, 0, 0, 0.525], + "46": [0, 0.125, 0, 0, 0.525], + "47": [0.08333, 0.69444, 0, 0, 0.525], + "48": [0, 0.61111, 0, 0, 0.525], + "49": [0, 0.61111, 0, 0, 0.525], + "50": [0, 0.61111, 0, 0, 0.525], + "51": [0, 0.61111, 0, 0, 0.525], + "52": [0, 0.61111, 0, 0, 0.525], + "53": [0, 0.61111, 0, 0, 0.525], + "54": [0, 0.61111, 0, 0, 0.525], + "55": [0, 0.61111, 0, 0, 0.525], + "56": [0, 0.61111, 0, 0, 0.525], + "57": [0, 0.61111, 0, 0, 0.525], + "58": [0, 0.43056, 0, 0, 0.525], + "59": [0.13889, 0.43056, 0, 0, 0.525], + "60": [-0.05556, 0.55556, 0, 0, 0.525], + "61": [-0.19549, 0.41562, 0, 0, 0.525], + "62": [-0.05556, 0.55556, 0, 0, 0.525], + "63": [0, 0.61111, 0, 0, 0.525], + "64": [0, 0.61111, 0, 0, 0.525], + "65": [0, 0.61111, 0, 0, 0.525], + "66": [0, 0.61111, 0, 0, 0.525], + "67": [0, 0.61111, 0, 0, 0.525], + "68": [0, 0.61111, 0, 0, 0.525], + "69": [0, 0.61111, 0, 0, 0.525], + "70": [0, 0.61111, 0, 0, 0.525], + "71": [0, 0.61111, 0, 0, 0.525], + "72": [0, 0.61111, 0, 0, 0.525], + "73": [0, 0.61111, 0, 0, 0.525], + "74": [0, 0.61111, 0, 0, 0.525], + "75": [0, 0.61111, 0, 0, 0.525], + "76": [0, 0.61111, 0, 0, 0.525], + "77": [0, 0.61111, 0, 0, 0.525], + "78": [0, 0.61111, 0, 0, 0.525], + "79": [0, 0.61111, 0, 0, 0.525], + "80": [0, 0.61111, 0, 0, 0.525], + "81": [0.13889, 0.61111, 0, 0, 0.525], + "82": [0, 0.61111, 0, 0, 0.525], + "83": [0, 0.61111, 0, 0, 0.525], + "84": [0, 0.61111, 0, 0, 0.525], + "85": [0, 0.61111, 0, 0, 0.525], + "86": [0, 0.61111, 0, 0, 0.525], + "87": [0, 0.61111, 0, 0, 0.525], + "88": [0, 0.61111, 0, 0, 0.525], + "89": [0, 0.61111, 0, 0, 0.525], + "90": [0, 0.61111, 0, 0, 0.525], + "91": [0.08333, 0.69444, 0, 0, 0.525], + "92": [0.08333, 0.69444, 0, 0, 0.525], + "93": [0.08333, 0.69444, 0, 0, 0.525], + "94": [0, 0.61111, 0, 0, 0.525], + "95": [0.09514, 0, 0, 0, 0.525], + "96": [0, 0.61111, 0, 0, 0.525], + "97": [0, 0.43056, 0, 0, 0.525], + "98": [0, 0.61111, 0, 0, 0.525], + "99": [0, 0.43056, 0, 0, 0.525], + "100": [0, 0.61111, 0, 0, 0.525], + "101": [0, 0.43056, 0, 0, 0.525], + "102": [0, 0.61111, 0, 0, 0.525], + "103": [0.22222, 0.43056, 0, 0, 0.525], + "104": [0, 0.61111, 0, 0, 0.525], + "105": [0, 0.61111, 0, 0, 0.525], + "106": [0.22222, 0.61111, 0, 0, 0.525], + "107": [0, 0.61111, 0, 0, 0.525], + "108": [0, 0.61111, 0, 0, 0.525], + "109": [0, 0.43056, 0, 0, 0.525], + "110": [0, 0.43056, 0, 0, 0.525], + "111": [0, 0.43056, 0, 0, 0.525], + "112": [0.22222, 0.43056, 0, 0, 0.525], + "113": [0.22222, 0.43056, 0, 0, 0.525], + "114": [0, 0.43056, 0, 0, 0.525], + "115": [0, 0.43056, 0, 0, 0.525], + "116": [0, 0.55358, 0, 0, 0.525], + "117": [0, 0.43056, 0, 0, 0.525], + "118": [0, 0.43056, 0, 0, 0.525], + "119": [0, 0.43056, 0, 0, 0.525], + "120": [0, 0.43056, 0, 0, 0.525], + "121": [0.22222, 0.43056, 0, 0, 0.525], + "122": [0, 0.43056, 0, 0, 0.525], + "123": [0.08333, 0.69444, 0, 0, 0.525], + "124": [0.08333, 0.69444, 0, 0, 0.525], + "125": [0.08333, 0.69444, 0, 0, 0.525], + "126": [0, 0.61111, 0, 0, 0.525], + "127": [0, 0.61111, 0, 0, 0.525], + "160": [0, 0, 0, 0, 0.525], + "176": [0, 0.61111, 0, 0, 0.525], + "184": [0.19445, 0, 0, 0, 0.525], + "305": [0, 0.43056, 0, 0, 0.525], + "567": [0.22222, 0.43056, 0, 0, 0.525], + "711": [0, 0.56597, 0, 0, 0.525], + "713": [0, 0.56555, 0, 0, 0.525], + "714": [0, 0.61111, 0, 0, 0.525], + "715": [0, 0.61111, 0, 0, 0.525], + "728": [0, 0.61111, 0, 0, 0.525], + "730": [0, 0.61111, 0, 0, 0.525], + "770": [0, 0.61111, 0, 0, 0.525], + "771": [0, 0.61111, 0, 0, 0.525], + "776": [0, 0.61111, 0, 0, 0.525], + "915": [0, 0.61111, 0, 0, 0.525], + "916": [0, 0.61111, 0, 0, 0.525], + "920": [0, 0.61111, 0, 0, 0.525], + "923": [0, 0.61111, 0, 0, 0.525], + "926": [0, 0.61111, 0, 0, 0.525], + "928": [0, 0.61111, 0, 0, 0.525], + "931": [0, 0.61111, 0, 0, 0.525], + "933": [0, 0.61111, 0, 0, 0.525], + "934": [0, 0.61111, 0, 0, 0.525], + "936": [0, 0.61111, 0, 0, 0.525], + "937": [0, 0.61111, 0, 0, 0.525], + "8216": [0, 0.61111, 0, 0, 0.525], + "8217": [0, 0.61111, 0, 0, 0.525], + "8242": [0, 0.61111, 0, 0, 0.525], + "9251": [0.11111, 0.21944, 0, 0, 0.525], + }, +}; diff --git a/src/fonts.less b/src/fonts.less new file mode 100644 index 00000000..cdcecf1e --- /dev/null +++ b/src/fonts.less @@ -0,0 +1,64 @@ +@font-folder: "../fonts"; +@use-ttf: true; +@use-woff: true; +@use-woff2: true; + +.use-woff2(@family, @family-suffix) when (@use-woff2 = true) { + src+: url('@{font-folder}/KaTeX_@{family}-@{family-suffix}.woff2') format('woff2') +} + +.use-woff(@family, @family-suffix) when (@use-woff = true) { + src+: url('@{font-folder}/KaTeX_@{family}-@{family-suffix}.woff') format('woff') +} + +.use-ttf(@family, @family-suffix) when (@use-ttf = true) { + src+: url('@{font-folder}/KaTeX_@{family}-@{family-suffix}.ttf') format('truetype') +} + +.generate-suffix(@weight, @style) when (@weight = normal) and (@style = normal) { + @suffix: 'Regular'; +} +.generate-suffix(@weight, @style) when (@weight = normal) and (@style = italic) { + @suffix: 'Italic'; +} +.generate-suffix(@weight, @style) when (@weight = bold) and (@style = normal) { + @suffix: 'Bold'; +} +.generate-suffix(@weight, @style) when (@weight = bold) and (@style = italic) { + @suffix: 'BoldItalic'; +} + +.font-face(@family, @weight, @style) { + .generate-suffix(@weight, @style); + @font-face { + font-family: 'KaTeX_@{family}'; + .use-woff2(@family, @suffix); + .use-woff(@family, @suffix); + .use-ttf(@family, @suffix); + font-weight: @weight; + font-style: @style; + } +} + +.font-face('AMS', normal, normal); +.font-face('Caligraphic', bold, normal); +.font-face('Caligraphic', normal, normal); +.font-face('Fraktur', bold, normal); +.font-face('Fraktur', normal, normal); +.font-face('Main', bold, normal); +.font-face('Main', bold, italic); +.font-face('Main', normal, italic); +.font-face('Main', normal, normal); +//.font-face('Math', bold, normal); +.font-face('Math', bold, italic); +.font-face('Math', normal, italic); +//.font-face('Math', normal, normal); +.font-face('SansSerif', bold, normal); +.font-face('SansSerif', normal, italic); +.font-face('SansSerif', normal, normal); +.font-face('Script', normal, normal); +.font-face('Size1', normal, normal); +.font-face('Size2', normal, normal); +.font-face('Size3', normal, normal); +.font-face('Size4', normal, normal); +.font-face('Typewriter', normal, normal); diff --git a/src/fonts/.gitignore b/src/fonts/.gitignore new file mode 100644 index 00000000..7f735dd1 --- /dev/null +++ b/src/fonts/.gitignore @@ -0,0 +1,9 @@ +lib/blacker.mf +lib/mftrace-modified +lib/Space.otf +ff +otf +pfa +ttf +woff +woff2 diff --git a/src/fonts/Makefile b/src/fonts/Makefile new file mode 100644 index 00000000..7da91ad9 --- /dev/null +++ b/src/fonts/Makefile @@ -0,0 +1,139 @@ +#!gmake +# +# Version: Apache License 2.0 +# +# Copyright (c) 2013 MathJax Project +# Copyright (c) 2013 The MathJax Consortium +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# + +CUSTOM=custom.cfg + +-include $(CUSTOM) + +MFTRACE_MODIFIED=lib/mftrace-modified + +all: config fonts + +$(CUSTOM): + @cp default.cfg $(CUSTOM); + +$(CUSTOM).pl: $(CUSTOM) + @echo "Creating Perl config file..." + @cp $(CUSTOM) $(CUSTOM).pl + @echo >> $(CUSTOM).pl # ensure that the config file ends by a new line + @echo "MFTRACE_PATH=`$(WHICH) $(MFTRACE)`" >> $(CUSTOM).pl + @$(SED) -i "s|^\([A-Z_0-9]*\)=\(.*\)|$$\1='\2';|" $(CUSTOM).pl + @echo "1;" >> $(CUSTOM).pl + +.PHONY: config +config: $(CUSTOM).pl + +blacker: $(MFTRACE_MODIFIED) +$(MFTRACE_MODIFIED): + $(PERL) makeBlacker 15 # values between 10 and 30 seem best + +pfa: $(MFTRACE_MODIFIED) + @echo "cmr10" + $(PYTHON) $(MFTRACE_MODIFIED) --magnification 1000 --simplify cmr10 + + @echo "cmmi10" + $(PYTHON) $(MFTRACE_MODIFIED) --magnification 1000 --encoding $(TETEXENCODING)/aae443f0.enc --simplify cmmi10 + + @echo "cmsy10" + $(PYTHON) $(MFTRACE_MODIFIED) --magnification 1000 --encoding $(TETEXENCODING)/10037936.enc --simplify cmsy10 + + @echo "cmex10" + $(PYTHON) $(MFTRACE_MODIFIED) --magnification 1000 --simplify cmex10 + + @echo "cmbx10" + $(PYTHON) $(MFTRACE_MODIFIED) --magnification 1000 --simplify cmbx10 + + @echo "cmbxti10" + $(PYTHON) $(MFTRACE_MODIFIED) --magnification 1000 --simplify cmbxti10 + + @echo "cmti10" + $(PYTHON) $(MFTRACE_MODIFIED) --magnification 1000 --simplify cmti10 + + @echo "msam10" + $(PYTHON) $(MFTRACE_MODIFIED) --magnification 1000 --simplify --encoding $(TETEXENCODING)/10037936.enc msam10 + + @echo "msbm10" + $(PYTHON) $(MFTRACE_MODIFIED) --magnification 1000 --simplify --encoding $(TETEXENCODING)/10037936.enc msbm10 + + @echo "cmmib10" + $(PYTHON) $(MFTRACE_MODIFIED) --magnification 1000 --encoding $(TETEXENCODING)/aae443f0.enc --simplify cmmib10 + + @echo "cmbsy10" + $(PYTHON) $(MFTRACE_MODIFIED) --magnification 1000 --encoding $(TETEXENCODING)/10037936.enc --simplify cmbsy10 + + @echo "cmtt10" + $(PYTHON) $(MFTRACE_MODIFIED) --magnification 1000 --simplify cmtt10 + + @echo "cmss10" + $(PYTHON) $(MFTRACE_MODIFIED) --magnification 1000 --simplify cmss10 + @echo "cmssi10" + $(PYTHON) $(MFTRACE_MODIFIED) --magnification 1000 --simplify cmssi10 + @echo "cmssbx10" + $(PYTHON) $(MFTRACE_MODIFIED) --magnification 1000 --simplify cmssbx10 + + @echo "eufm10" + cp "`$(KPSEWHICH) eufm10.pfb`" eufm10.pfb + @echo "eufb10" + cp "`$(KPSEWHICH) eufb10.pfb`" eufb10.pfb + + # echo "eusm10" + # $(PYTHON) $(MFTRACE_MODIFIED) --magnification 1000 --simplify eusm10 + # echo "eusb10" + # $(PYTHON) $(MFTRACE_MODIFIED) --magnification 1000 --simplify eusb10 + + @echo "rsfs10" + $(PYTHON) $(MFTRACE_MODIFIED) --magnification 1000 --simplify --encoding $(BASEENCODING)/tex256.enc rsfs10 + + mkdir -p pfa + rm -f pfa/* + mv *.pfa pfa + mv *.pfb pfa + +ff: pfa + mkdir -p ff otf + rm -f ff/* otf/* + $(PERL) makeFF + +.PHONY: fonts +fonts: ff + mkdir -p ttf woff woff2 + rm -f ttf/* woff/* woff2/* + + @for file in `ls ff/*.ff | $(SED) 's|ff/\(.*\)\.ff|\1|'`; do \ + echo ""; \ + echo $$file; \ + $(FONTFORGE) -lang=ff -script ff/$$file.ff; \ + \ + echo "Hinting $$file"; \ + if echo "$$file" | $(GREP) -q -e "Size[1-4]" -e "Typewriter"; then \ + $(TTFAUTOHINT) --windows-compatibility --symbol ttf/$$file.ttf ttf/$$file.ttf.hinted; \ + else \ + $(TTFAUTOHINT) --windows-compatibility ttf/$$file.ttf ttf/$$file.ttf.hinted; \ + fi; \ + mv ttf/$$file.ttf.hinted ttf/$$file.ttf; \ + \ + echo "Generating $$file..."; \ + $(PYTHON) generate_fonts.py ttf/$$file.ttf; \ + done + +clean: + rm -f $(CUSTOM).pl + rm -f $(MFTRACE_MODIFIED) lib/blacker.mf + rm -rf pfa ff otf ttf woff woff2 diff --git a/src/fonts/default.cfg b/src/fonts/default.cfg new file mode 100644 index 00000000..0325fbc8 --- /dev/null +++ b/src/fonts/default.cfg @@ -0,0 +1,20 @@ +# Note: paths should be absolute, unless they point to programs in your $PATH. + +##### Standard programs ##### +GREP=grep +PERL=perl +PYTHON=python +SED=sed +WHICH=which +KPSEWHICH=kpsewhich + +##### Font tools ##### +# Most of the tools below are standard and should be available from your package manager. +FONTFORGE=fontforge +MFTRACE=mftrace +TTX=ttx +TTFAUTOHINT=ttfautohint + +##### TeXLive Encoding +TETEXENCODING=/usr/share/texlive/texmf-texlive/fonts/enc/dvips/tetex/ +BASEENCODING=/usr/share/texlive/texmf-texlive/fonts/enc/dvips/base/ diff --git a/src/fonts/generate_fonts.py b/src/fonts/generate_fonts.py new file mode 100755 index 00000000..c58310de --- /dev/null +++ b/src/fonts/generate_fonts.py @@ -0,0 +1,61 @@ +#!/usr/bin/env python2 + +import sys +import os +import json + +from fontTools.ttLib import TTFont, sfnt +from fontTools.misc.timeTools import timestampNow +sfnt.USE_ZOPFLI = True + +if len(sys.argv) < 2: + print "Usage: %s " % sys.argv[0] + sys.exit(1) + +font_file = sys.argv[1] +font_name = os.path.splitext(os.path.basename(font_file))[0] + +# now or SOURCE_DATE_EPOCH, if present +timestamp = timestampNow() + +font = TTFont(font_file, recalcBBoxes=False, recalcTimestamp=False) + +font['head'].created = timestamp +font['head'].modified = timestamp + +# remove fontforge timestamps +if 'FFTM' in font: + del font['FFTM'] + +# remove redundant GDEF table +if 'GDEF' in font: + del font['GDEF'] + +# remove Macintosh table +# https://developer.apple.com/fonts/TrueType-Reference-Manual/RM06/Chap6cmap.html +font['name'].names = [record for record in font['name'].names if record.platformID != 1] +font['cmap'].tables = [table for table in font['cmap'].tables if table.platformID != 1] + +font['name'].setName(unicode('Version ' + str(timestamp)), 5, 3, 1, 1033) + +# fix OS/2 and hhea metrics +glyf = font['glyf'] +ascent = int(max(glyf[c].yMax for c in font.getGlyphOrder() if hasattr(glyf[c], "yMax"))) +descent = -int(min(glyf[c].yMin for c in font.getGlyphOrder() if hasattr(glyf[c], "yMin"))) + +font['OS/2'].usWinAscent = ascent +font['OS/2'].usWinDescent = descent + +font['hhea'].ascent = ascent +font['hhea'].descent = -descent + +# save TTF +font.save(font_file, reorderTables=None) + +# save WOFF +font.flavor = 'woff' +font.save(os.path.join('woff', font_name + '.woff'), reorderTables=None) + +# save WOFF2 +font.flavor = 'woff2' +font.save(os.path.join('woff2', font_name + '.woff2'), reorderTables=None) diff --git a/src/fonts/lib/Extra.otf b/src/fonts/lib/Extra.otf new file mode 100644 index 00000000..e1c84f8d Binary files /dev/null and b/src/fonts/lib/Extra.otf differ diff --git a/src/fonts/lib/Space.ttx b/src/fonts/lib/Space.ttx new file mode 100644 index 00000000..cfed4af9 --- /dev/null +++ b/src/fonts/lib/Space.ttx @@ -0,0 +1,234 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Copyright (c) 2009-2010 Design Science, Inc. +Copyright (c) 2014-2018 Khan Academy + + + *NAME* + + + *WEIGHT_S* + + + FontForge 2.0 : *NAME*-*WEIGHT* + + + *NAME*-*WEIGHT* + + + Version 1.1 + + + *NAME*-*WEIGHT* + + + Copyright (c) 2009-2010, Design Science, Inc. (<www.mathjax.org>) +Copyright (c) 2014-2018 Khan Academy (<www.khanacademy.org>), +with Reserved Font Name *NAME*. + +This Font Software is licensed under the SIL Open Font License, Version 1.1. +This license available with a FAQ at: +http://scripts.sil.org/OFL + + + http://scripts.sil.org/OFL + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 0 50 433 50 hstem + 50 50 50 50 vstem + 50 hmoveto + 150 533 -150 hlineto + 50 -483 rmoveto + 433 50 -433 vlineto + endchar + + + endchar + + + endchar + + + + + + + + + + + + + + + + diff --git a/src/fonts/makeBlacker b/src/fonts/makeBlacker new file mode 100755 index 00000000..69b07371 --- /dev/null +++ b/src/fonts/makeBlacker @@ -0,0 +1,49 @@ +#! /usr/bin/perl + +# Creates the metafont file needed for darker copies of the TeX fonts, +# and modifies mftrace to use it. +# +# Usage: ./makeBlacker blackness + +require "custom.cfg.pl"; + +$blacker = shift; +unless ($blacker) { + print stderr "Usage: ./makeBlacker blackness\n"; + exit; +} + +sub editMftrace { + my $oldMFTRACE = $MFTRACE_PATH; + $MFTRACE = "./lib/mftrace-modified"; + print "Editing mftrace\n"; + open(MFT,$oldMFTRACE) || die "Can't read '$oldMFTRACE': $!\n"; + my $MFT = join("",); + close(MFT); + $MFT =~ s!r"mf '\\mode:=(?:[^;]*)(; [^"]*)"!r"""mf '\\smode:="lib/blacker.mf"$1"""!; + open(MFT,">$MFTRACE") || die "Can't write '$MFTRACE': $!\n"; + print MFT $MFT; + close(MFT); + chmod 0755, $MFTRACE; +} + +sub makeBlackerMF { + my $blacker = shift; + print "Using blacker = $blacker\n"; + open(BLACKER,">lib/blacker.mf") || die "Can't write 'lib/blacker.mf': $!\n"; + print BLACKER << " END"; + proofing:=0; + fontmaking:=1; + tracingtitles:=0; + pixels_per_inch:=1200; + blacker:=$blacker; + fillin:=0; + o_correction:=1; + END + close(BLACKER); +} + +editMftrace(); +makeBlackerMF($blacker); + +1; diff --git a/src/fonts/makeFF b/src/fonts/makeFF new file mode 100755 index 00000000..df55f1b6 --- /dev/null +++ b/src/fonts/makeFF @@ -0,0 +1,2003 @@ +#! /usr/bin/perl + +# Creates the FontForge files needed to create the +# KaTeX fonts from the TeX source files, constructing some +# glyphs from two or more parts, when needed. +# +# Usage: ./makeFF + +require "custom.cfg.pl"; + +######################################################################### + +$map{cmr10} = { + "Main-Regular" => [ + [0,1] => 0x393, # \Gamma, \Delta + 2 => 0x398, # \Theta + 3 => 0x39B, # \Lambda + 4 => 0x39E, # \Xi + 5 => 0x3A0, # \Pi + 6 => 0x3A3, # \Sigma + [7,8] => 0x3A5, # \Upsilon, \Phi + [9,0xA] => 0x3A8, # \Psi, \Omega + + 0x10 => 0x131, # \i + 0x11 => 0x237, # \j + 0x12 => 0x2CB, # \grave + 0x13 => 0x2CA, # \acute + 0x14 => 0x2C7, # \check + 0x15 => 0x2D8, # \breve + 0x16 => 0x2C9, # \bar + 0x17 => [0xB0,-125,0], # \degree + 0x17 => 0x02DA, # \r, ring above + 0x18 => 0xB8, # \c, cedilla + + [0x21,0x2F] => 0x21, # !, ", #, $, %, &, ', (, ), *, +, comma, -, ., / + 0x22 => 0x201D, # " + 0x27 => 0x2019, # ' + [0x30,0x39] => 0x30, # 0-9 + [0x3A,0x3B] => 0x3A, # :, ; + 0x3D => 0x3D, # = + [0x3F,0x40] => 0x3F, # ?, @ + [0x41,0x5A] => 0x41, # A-Z + 0x5B => 0x5B, # [ + 0x5C => 0x201C, # `` + [0x5D,0x5E] => 0x5D, # ], ^ + 0x5E => 0x2C6, # \hat + 0x5F => 0x2D9, # \dot + 0x60 => 0x2018, # ` + [0x61,0x7A] => 0x61, # a-z + [0x7B,0x7C] => 0x2013, # \endash, \emdash + 0x7B => [0x5F,0,-310], # underline + 0x7D => 0x2DD, # double acute + 0x7E => [0x7E,0,-350], # ~ + 0x7E => 0x2DC, # \tilde + 0x7F => 0xA8, # \ddot + 0x19 => 0xDF, # sharp S + 0x1A => 0xE6, # ae ligature + 0x1B => 0x153, # oe ligature + 0x1C => 0xF8, # o with slash + 0x1D => 0xC6, # AE ligature + 0x1E => 0x152, # OE ligature + 0x1F => 0xD8, # O with slash + ], +}; + +$map{cmmi10} = { + "Math-Italic" => [ + [0,1] => 0x393, # \Gamma, \Delta + 2 => 0x398, # \Theta + 3 => 0x39B, # \Lambda + 4 => 0x39E, # \Xi + 5 => 0x3A0, # \Pi + 6 => 0x3A3, # \Sigma + [7,8] => 0x3A5, # \Upsilon, \Phi + [9,0xA] => 0x3A8, # \Psi, \Omega + + [0xB,0xE] => 0x3B1, # \alpha, \beta, \gamma, \delta + 0xF => 0x3F5, # \elpsilon + [0x10,0x18] => 0x3B6, # \zeta, \eta, \theta, \iota, \kappa, \lambda, \mu, \nu, \xi + [0x19,0x1A] => 0x3C0, # \pi, \rho + [0x1B,0x1D] => 0x3C3, # \sigma, \tau, \upsilon + 0x1E => 0x3D5, # \phi + [0x1F,0x21] => 0x3C7, # \chi, \psi, \omega + 0x22 => 0x3B5, # \varepsilon + 0x23 => 0x3D1, # \vartheta + 0x24 => 0x3D6, # \varpi + 0x25 => 0x3F1, # \varrho + 0x26 => 0x3C2, # \varsigma + 0x27 => 0x3C6, # \varphi + + [0x41,0x5A] => 0x41, # A-Z + [0x61,0x7A] => 0x61, # a - z + [0x30,0x39] => 0x30, # Oldstyle 0-9 + + 0x6F => 0x3BF, # omicron + 0x7B => 0xE131, # \imath (These differ from \i and \j, so use PUA character) + 0x7C => 0xE237, # \jmath + ], + + "Main-Regular" => [ + 0x28 => 0x21BC, # \leftharpoonup + 0x29 => 0x21BD, # \leftharpoondown + 0x2A => 0x21C0, # \rightharpoonup + 0x2B => 0x21C1, # \rightharpoondown + + 0x2E => 0x25B9, # \triangleright + 0x2F => 0x25C3, # \triangleleft + + 0x3A => 0x2E, # . + 0x3B => 0x2C, # , + 0x3C => 0x3C, # < + 0x3D => 0x2215, # / + 0x3E => 0x3E, # > + 0x3F => 0x22C6, # \star + 0x40 => 0x2202, # \partial + + [0x5B,0x5D] => 0x266D, # \flat, \natural, \sharp + 0x5E => 0x2323, # \smile + 0x5F => 0x2322, # \frown + 0x60 => 0x2113, # \ell + + 0x7D => 0x2118, # \wp + 0x7E => [0x20D7,-653,0],# \vec + ], +}; + +$map{cmsy10} = { + "Main-Regular" => [ + [0,1] => 0x2212, # - + 1 => 0x22C5, # \cdot + 2 => 0xD7, # \times + 3 => 0x2217, # \ast + 4 => 0xF7, # \div + 5 => 0x22C4, # \diamond + 6 => 0xB1, # \pm + 7 => 0x2213, # \mp + [8,0xC] => 0x2295, # \oplus, \ominus, \otimes, \oslash, \odot + 0xD => 0x25EF, # \bigcirc + [0xE,0xF] => 0x2218, # \circ, \bullet + + 0x10 => 0x224D, # \asymp + 0x11 => 0x2261, # \equiv + [0x12,0x13] => 0x2286, # \subseteq, \supseteq + [0x14,0x15] => 0x2264, # \leq, \geq + [0x16,0x17] => 0x2AAF, # \preceq, \succeq + 0x18 => 0x223C, # \sim + 0x19 => 0x2248, # \approx + [0x1A,0x1B] => 0x2282, # \subset, \supset + [0x1C,0x1D] => 0x226A, # \ll, \gg + [0x1E,0x1F] => 0x227A, # \prec, \succ + + 0x20 => 0x2190, # \leftarrow + 0x21 => 0x2192, # \rightarrow + 0x22 => 0x2191, # \uparrow + 0x23 => 0x2193, # \downarrow + 0x24 => 0x2194, # \leftrightarrow + 0x25 => 0x2197, # \nearrow + 0x26 => 0x2198, # \searrow + 0x27 => 0x2243, # \simeq + + 0x28 => 0x21D0, # \Leftarrow + 0x29 => 0x21D2, # \Rightarrow + 0x2A => 0x21D1, # \Uparrow + 0x2B => 0x21D3, # \Downarrow + 0x2C => 0x21D4, # \Leftrightarrow + 0x2D => 0x2196, # \nwarrow + 0x2E => 0x2199, # \swarrow + 0x2F => 0x221D, # \propto + + 0x30 => 0x2032, # \prime + 0x31 => 0x221E, # \infty + 0x32 => 0x2208, # \in + 0x33 => 0x220B, # \ni + 0x34 => 0x25B3, # \bigtriangleup and \triangle + 0x35 => 0x25BD, # \bigtriangledown + 0x36 => 0xE020, # \not (U+0338 COMBINING LONG SOLIDUS OVERLAY would + # be most natural, but we don't use a negative + # leading space, so use PUA character) + + 0x38 => 0x2200, # \forall + 0x39 => 0x2203, # \exists + 0x3A => 0xAC, # \neg + 0x3B => 0x2205, # \emptyset + 0x3C => 0x211C, # \Re + 0x3D => 0x2111, # \Im + 0x3E => 0x22A4, # \top + 0x3F => 0x22A5, # \bot + + 0x40 => 0x2135, # \aleph + + 0x5B => 0x222A, # \cup + 0x5C => 0x2229, # \cap + 0x5D => 0x228E, # \uplus + [0x5E,0x5F] => 0x2227, # \wedge, \vee + + [0x60,0x61] => 0x22A2, # \vdash, \dashv + [0x62,0x63] => 0x230A, # \lfloor, \rfloor + [0x64,0x65] => 0x2308, # \lceil, \rceil + 0x66 => 0x7B, # { + 0x67 => 0x7D, # } + [0x68,0x69] => 0x27E8, # \langle, \rangle + 0x6A => 0x7C, # | + 0x6A => 0x2223, # \vert + 0x6B => 0x2225, # \Vert + 0x6C => 0x2195, # \updownarrow + 0x6D => 0x21D5, # \Updownarrow + 0x6E => 0x5C, # \backslash + 0x6E => 0x2216, # \setminus + 0x6F => 0x2240, # \wr + + 0x70 => [0x221A,0,760], # \surd ### adjust position so font doesn't have a large depth + 0x71 => 0x2A3F, # \amalg + 0x72 => 0x2207, # \nabla + 0x73 => 0x222B, # \int + 0x74 => 0x2294, # \sqcup + 0x75 => 0x2293, # \sqcap + [0x76,0x77] => 0x2291, # \sqsubseteq, \sqsupseteq + 0x78 => 0xA7, # \S + [0x79,0x7A] => 0x2020, # \dagger, \ddagger + 0x7B => 0xB6, # \P + 0x7C => 0x2663, # \clubsuit + 0x7D => 0x2662, # \diamondsuit + 0x7E => 0x2661, # \heartsuit + 0x7F => 0x2660, # \spadesuit + ], + + "Caligraphic" => [ + [0x41,0x5A] => 0x41, # A-Z + ], +}; + +$map{cmex10} = { + "Size1" => [ + 0 => [0x28,0,810], # ( + 1 => [0x29,0,810], # ) + 2 => [0x5B,0,810], # [ + 3 => [0x5D,0,810], # ] + 4 => [0x230A,0,810], # \lfloor + 5 => [0x230B,0,810], # \rfloor + 6 => [0x2308,0,810], # \lceil + 7 => [0x2309,0,810], # \rceil + 8 => [0x7B,0,810], # { + 9 => [0x7D,0,810], # } + 0xA => [0x27E8,0,810], # \langle + 0xB => [0x27E9,0,810], # \rangle + 0xC => [0x2223,0,606], # \vert + 0xD => [0x2225,0,606], # \Vert + 0xE => [0x2F,0,810], # / + 0xF => [0x5C,0,810], # \ + + 0x46 => [0x2A06,0,750], # \bigsqcup + 0x48 => [0x222E,0,805], # \oint + 0x4A => [0x2A00,0,750], # \bigodot + 0x4C => [0x2A01,0,750], # \bigoplus + 0x4E => [0x2A02,0,750], # \bigotimes + + 0x50 => [0x2211,0,750], # \sum + 0x51 => [0x220F,0,750], # \prod + 0x52 => [0x222B,0,805], # \int + 0x53 => [0x22C3,0,750], # \bigcup + 0x54 => [0x22C2,0,750], # \bigcap + 0x55 => [0x2A04,0,750], # \biguplus + 0x56 => [0x22C0,0,750], # \bigwedge + 0x57 => [0x22C1,0,750], # \bigvee + + 0x60 => [0x2210,0,750], # \coprod + 0x62 => 0x2C6, # \widehat + 0x62 => [0x302,-556,0], # \widehat (combining) + 0x65 => 0x2DC, # \widetilde + 0x65 => [0x303,-556,0], # \widetilde (combining) + + 0x70 => [0x221A,0,810], # surd + 0x3F => [0x23D0,0,601], # arrow extension + 0x77 => [0x2016,0,601], # Arrow extension (non-standard) + 0x78 => [0x2191,0,600], # uparrow top + 0x79 => [0x2193,0,600], # downarrow bottom + 0x7E => [0x21D1,0,600], # Uparrow top + 0x7F => [0x21D3,0,600], # Downarrow bottom + ], + + "Size2" => [ + 0x10 => [0x28,0,1110], # ( + 0x11 => [0x29,0,1110], # ) + 0x2E => [0x2F,0,1110], # / + 0x2F => [0x5C,0,1110], # \ + 0x44 => [0x27E8,0,1110],# \langle + 0x45 => [0x27E9,0,1110],# \rangle + + 0x47 => [0x2A06,0,950], # \bigsqcup + 0x49 => [0x222E,0,1360],# \oint + 0x4B => [0x2A00,0,950], # \bigodot + 0x4D => [0x2A01,0,950], # \bigoplus + 0x4F => [0x2A02,0,950], # \bigotimes + + 0x58 => [0x2211,0,950], # \sum + 0x59 => [0x220F,0,950], # \prod + 0x5A => [0x222B,0,1360],# \int + 0x5B => [0x22C3,0,950], # \bigcup + 0x5C => [0x22C2,0,950], # \bigcap + 0x5D => [0x2A04,0,950], # \biguplus + 0x5E => [0x22C0,0,950], # \bigwedge + 0x5F => [0x22C1,0,950], # \bigvee + 0x61 => [0x2210,0,950], # \coprod + + 0x63 => 0x2C6, # \widehat + 0x63 => [0x302,-1000,0],# \widehat (combining) + 0x66 => 0x2DC, # \widetilde + 0x66 => [0x303,-1000,0],# \widetilde (combining) + + 0x68 => [0x5B,0,1110], # [ + 0x69 => [0x5D,0,1110], # ] + 0x6A => [0x230A,0,1110],# \lfloor + 0x6B => [0x230B,0,1110],# \rfloor + 0x6C => [0x2308,0,1110],# \lceil + 0x6D => [0x2309,0,1110],# \rceil + 0x6E => [0x7B,0,1110], # { + 0x6F => [0x7D,0,1110], # } + 0x71 => [0x221A,0,1110],# surd + ], + + "Size3" => [ + 0x12 => [0x28,0,1410], # ( + 0x13 => [0x29,0,1410], # ) + 0x14 => [0x5B,0,1410], # [ + 0x15 => [0x5D,0,1410], # ] + 0x16 => [0x230A,0,1410],# \lfloor + 0x17 => [0x230B,0,1410],# \rfloor + 0x18 => [0x2308,0,1410],# \lceil + 0x19 => [0x2309,0,1410],# \rceil + 0x1A => [0x7B,0,1410], # { + 0x1B => [0x7D,0,1410], # } + 0x1C => [0x27E8,0,1410],# \langle + 0x1D => [0x27E9,0,1410],# \rangle + 0x1E => [0x2F,0,1410], # / + 0x1F => [0x5C,0,1410], # \ + 0x64 => 0x2C6, # \widehat + 0x64 => [0x302,-1444,0],# \widehat (combining) + 0x67 => 0x2DC, # \widetilde + 0x67 => [0x303,-1444,0],# \widetilde (combining) + 0x72 => [0x221A,0,1410],# surd + ], + + "Size4" => [ + 0x20 => [0x28,0,1710], # ( + 0x21 => [0x29,0,1710], # ) + 0x22 => [0x5B,0,1710], # [ + 0x23 => [0x5D,0,1710], # ] + 0x24 => [0x230A,0,1710],# \lfloor + 0x25 => [0x230B,0,1710],# \rfloor + 0x26 => [0x2308,0,1710],# \lceil + 0x27 => [0x2309,0,1710],# \rceil + 0x28 => [0x7B,0,1710], # { + 0x29 => [0x7D,0,1710], # } + 0x2A => [0x27E8,0,1710],# \langle + 0x2B => [0x27E9,0,1710],# \rangle + 0x2C => [0x2F,0,1710], # / + 0x2D => [0x5C,0,1710], # \ + 0x73 => [0x221A,0,1710],# surd + + 0x30 => [0x239B,0,1115],# left paren upper hook + 0x31 => [0x239E,0,1115],# right paren upper hook + 0x32 => [0x23A1,0,1115],# left square bracket upper corner + 0x33 => [0x23A4,0,1115],# right square bracket upper corner + 0x34 => [0x23A3,0,1115],# left square bracket lower corner + 0x35 => [0x23A6,0,1115],# right square bracket lower hook + 0x36 => [0x23A2,0,601], # left square bracket extension + 0x37 => [0x23A5,0,601], # right square bracket extension + 0x38 => [0x23A7,0,900], # left curly brace upper hook + 0x39 => [0x23AB,0,900], # right curly brace upper hook + 0x3A => 0x23A9, # left curly brace lower hook + 0x3B => 0x23AD, # right curly brace lower hook + 0x3C => [0x23A8,0,1150],# left curly brace middle + 0x3D => [0x23AC,0,1150],# right curly brace middle + 0x3E => [0x23AA,0,300], # curly brace extension + + 0x40 => [0x239D,0,1115],# left paren lower hook + 0x41 => [0x23A0,0,1115],# right paren lower hook + 0x42 => [0x239C,0,600], # left paren extension + 0x43 => [0x239F,0,600], # right paren extension + + 0x74 => [0x23B7,0,915], # radical bottom + 0x75 => [0xE000,0,605], # radical extension (PUA) + 0x76 => [0xE001,0,565], # radical top (PUA) + [0x7A,0x7D] => 0xE150, # \braceld, \bracerd, \bracelu, \braceru (PUA) + ], + + "Main-Regular" => [ + 0x38 => [0x23B0,0,900], # left curly brace upper hook, for lgroup, lmoustache + 0x39 => [0x23B1,0,900], # right curly brace upper hook, for rgroup, rmoustache + 0x3A => 0x23A9, # left curly brace lower hook, for lgroup, rmoustache + 0x3B => 0x23AD, # right curly brace lower hook, for rgroup, lmoustache + ], +}; + +$map{cmti10} = { + "Main-Italic" => [ + [0,1] => 0x393, # \Gamma, \Delta + 2 => 0x398, # \Theta + 3 => 0x39B, # \Lambda + 4 => 0x39E, # \Xi + 5 => 0x3A0, # \Pi + 6 => 0x3A3, # \Sigma + [7,8] => 0x3A5, # \Upsilon, \Phi + [9,0xA] => 0x3A8, # \Psi, \Omega + + 0x10 => 0x131, # \i + 0x11 => 0x237, # \j + 0x12 => 0x2CB, # \grave + 0x13 => 0x2CA, # \acute + 0x14 => 0x2C7, # \check + 0x15 => 0x2D8, # \breve + 0x16 => 0x2C9, # \bar + 0x17 => [0xB0,-160,0], # \degree + 0x17 => 0x02DA, # \r, ring above + 0x18 => 0xB8, # \c, cedilla + + [0x21,0x23] => 0x21, # !, ", #, + 0x22 => 0x201D, # " + [0x25,0x2F] => 0x25, # %, &, ', (, ), *, +, comma, -, ., / + 0x27 => 0x2019, # ' + [0x30,0x39] => 0x30, # 0-9 + [0x3A,0x3B] => 0x3A, # :, ; + 0x3D => 0x3D, # = + [0x3F,0x40] => 0x3F, # ?, @ + [0x41,0x5A] => 0x41, # A-Z + 0x5B => 0x5B, # [ + 0x5C => 0x201C, # `` + [0x5D,0x5E] => 0x5D, # ], ^ + 0x5E => 0x2C6, # \hat + 0x5F => 0x2D9, # \dot + 0x60 => 0x2018, # ` + [0x61,0x7A] => 0x61, # a-z + [0x7B,0x7C] => 0x2013, # \endash, \emdash + 0x7B => [0x5F,0,-310], # underline + 0x7D => 0x2DD, # double acute + 0x7E => [0x7E,0,-350], # ~ + 0x7E => 0x2DC, # \tilde + 0x7F => 0xA8, # \ddot + 0x19 => 0xDF, # sharp S + 0x1A => 0xE6, # ae ligature + 0x1B => 0x153, # oe ligature + 0x1C => 0xF8, # o with slash + 0x1D => 0xC6, # AE ligature + 0x1E => 0x152, # OE ligature + 0x1F => 0xD8, # O with slash + ], + + "Main-Regular" => [ + 0x24 => 0xA3, # pound sign + ], +}; + +$map{cmbx10} = { + "Main-Bold" => [ + [0,1] => 0x393, # \Gamma, \Delta + 2 => 0x398, # \Theta + 3 => 0x39B, # \Lambda + 4 => 0x39E, # \Xi + 5 => 0x3A0, # \Pi + 6 => 0x3A3, # \Sigma + [7,8] => 0x3A5, # \Upsilon, \Phi + [9,0xA] => 0x3A8, # \Psi, \Omega + + 0x10 => 0x131, # \i + 0x11 => 0x237, # \j + 0x12 => 0x2CB, # \grave + 0x13 => 0x2CA, # \acute + 0x14 => 0x2C7, # \check + 0x15 => 0x2D8, # \breve + 0x16 => 0x2C9, # \bar + 0x17 => [0xB0,-147,0], # \degree + 0x17 => 0x02DA, # \r, ring above + 0x18 => 0xB8, # \c, cedilla + + [0x21,0x2F] => 0x21, # !, ", #, $, %, &, ', (, ), *, +, comma, -, ., / + 0x22 => 0x201D, # " + 0x27 => 0x2019, # ' + [0x30,0x39] => 0x30, # 0-9 + [0x3A,0x3B] => 0x3A, # :, ; + 0x3D => 0x3D, # = + [0x3F,0x40] => 0x3F, # ?, @ + [0x41,0x5A] => 0x41, # A-Z + 0x5B => 0x5B, # [ + 0x5C => 0x201C, # `` + [0x5D,0x5E] => 0x5D, # ], ^ + 0x5E => 0x2C6, # \hat + 0x5F => 0x2D9, # \dot + 0x60 => 0x2018, # ` + [0x61,0x7A] => 0x61, # a-z + [0x7B,0x7C] => 0x2013, # \endash, \emdash + 0x7B => [0x5F,0,-310], # underline + 0x7D => 0x2DD, # double acute + 0x7E => [0x7E,0,-350], # ~ + 0x7E => 0x2DC, # \tilde + 0x7F => 0xA8, # \ddot + 0x19 => 0xDF, # sharp S + 0x1A => 0xE6, # ae ligature + 0x1B => 0x153, # oe ligature + 0x1C => 0xF8, # o with slash + 0x1D => 0xC6, # AE ligature + 0x1E => 0x152, # OE ligature + 0x1F => 0xD8, # O with slash + ], +}; + +$map{cmbxti10} = { + "Main-BoldItalic" => [ + [0,1] => 0x393, # \Gamma, \Delta + 2 => 0x398, # \Theta + 3 => 0x39B, # \Lambda + 4 => 0x39E, # \Xi + 5 => 0x3A0, # \Pi + 6 => 0x3A3, # \Sigma + [7,8] => 0x3A5, # \Upsilon, \Phi + [9,0xA] => 0x3A8, # \Psi, \Omega + + 0x10 => 0x131, # \i + 0x11 => 0x237, # \j + 0x12 => 0x2CB, # \grave + 0x13 => 0x2CA, # \acute + 0x14 => 0x2C7, # \check + 0x15 => 0x2D8, # \breve + 0x16 => 0x2C9, # \bar + 0x17 => [0xB0,-160,0], # \degree + 0x17 => 0x02DA, # \r, ring above + 0x18 => 0xB8, # \c, cedilla + + [0x21,0x23] => 0x21, # !, ", #, + 0x22 => 0x201D, # " + [0x25,0x2F] => 0x25, # %, &, ', (, ), *, +, comma, -, ., / + 0x27 => 0x2019, # ' + [0x30,0x39] => 0x30, # 0-9 + [0x3A,0x3B] => 0x3A, # :, ; + 0x3D => 0x3D, # = + [0x3F,0x40] => 0x3F, # ?, @ + [0x41,0x5A] => 0x41, # A-Z + 0x5B => 0x5B, # [ + 0x5C => 0x201C, # `` + [0x5D,0x5E] => 0x5D, # ], ^ + 0x5E => 0x2C6, # \hat + 0x5F => 0x2D9, # \dot + 0x60 => 0x2018, # ` + [0x61,0x7A] => 0x61, # a-z + [0x7B,0x7C] => 0x2013, # \endash, \emdash + 0x7B => [0x5F,0,-310], # underline + 0x7D => 0x2DD, # double acute + 0x7E => [0x7E,0,-350], # ~ + 0x7E => 0x2DC, # \tilde + 0x7F => 0xA8, # \ddot + 0x19 => 0xDF, # sharp S + 0x1A => 0xE6, # ae ligature + 0x1B => 0x153, # oe ligature + 0x1C => 0xF8, # o with slash + 0x1D => 0xC6, # AE ligature + 0x1E => 0x152, # OE ligature + 0x1F => 0xD8, # O with slash + ], + + "Main-Bold" => [ + 0x24 => 0xA3, # pound sign + ], +}; + +$map{cmmib10} = { + "Math-BoldItalic" => [ + [0,1] => 0x393, # \Gamma, \Delta + 2 => 0x398, # \Theta + 3 => 0x39B, # \Lambda + 4 => 0x39E, # \Xi + 5 => 0x3A0, # \Pi + 6 => 0x3A3, # \Sigma + [7,8] => 0x3A5, # \Upsilon, \Phi + [9,0xA] => 0x3A8, # \Psi, \Omega + + [0xB,0xE] => 0x3B1, # \alpha, \beta, \gamma, \delta + 0xF => 0x3F5, # \elpsilon + [0x10,0x18] => 0x3B6, # \zeta, \eta, \theta, \iota, \kappa, \lambda, \mu, \nu, \xi + [0x19,0x1A] => 0x3C0, # \pi, \rho + [0x1B,0x1D] => 0x3C3, # \sigma, \tau, \upsilon + 0x1E => 0x3D5, # \phi + [0x1F,0x21] => 0x3C7, # \chi, \psi, \omega + 0x22 => 0x3B5, # \varepsilon + 0x23 => 0x3D1, # \vartheta + 0x24 => 0x3D6, # \varpi + 0x25 => 0x3F1, # \varrho + 0x26 => 0x3C2, # \varsigma + 0x27 => 0x3C6, # \varphi + + [0x30,0x39] => 0x30, # Oldstyle 0-9 + [0x41,0x5A] => 0x41, # A-Z + [0x61,0x7A] => 0x61, # a - z + + 0x6F => 0x3BF, # omicron + 0x7B => 0xE131, # \imath (PUA) + 0x7C => 0xE237, # \jmath (PUA) + ], + + "Main-Bold" => [ + 0x28 => 0x21BC, # \leftharpoonup + 0x29 => 0x21BD, # \leftharpoondown + 0x2A => 0x21C0, # \rightharpoonup + 0x2B => 0x21C1, # \rightharpoondown + + 0x2E => 0x25B9, # \triangleright + 0x2F => 0x25C3, # \triangleleft + + 0x3A => 0x2E, # . + 0x3B => 0x2C, # , + 0x3C => 0x3C, # < + 0x3D => 0x2215, # / + 0x3E => 0x3E, # > + 0x3F => 0x22C6, # \star + 0x40 => 0x2202, # \partial + + [0x5B,0x5D] => 0x266D, # \flat, \natural, \sharp + 0x5E => 0x2323, # \smile + 0x5F => 0x2322, # \frown + 0x60 => 0x2113, # \ell + 0x68 => 0x210F, # \hbar (bar added below) + + 0x7D => 0x2118, # \wp + 0x7E => [0x20D7,-729,0],# \vec + ], +}; + +$map{cmbsy10} = { + "Main-Bold" => [ + [0,1] => 0x2212, # - + 1 => 0x22C5, # \cdot + 2 => 0xD7, # \times + 3 => 0x2217, # \ast + 4 => 0xF7, # \div + 5 => 0x22C4, # \diamond + 6 => 0xB1, # \pm + 7 => 0x2213, # \mp + [8,0xC] => 0x2295, # \oplus, \ominus, \otimes, \oslash, \odot + 0xD => 0x25EF, # \bigcirc + [0xE,0xF] => 0x2218, # \circ, \bullet + + 0x10 => 0x224D, # \asymp + 0x11 => 0x2261, # \equiv + [0x12,0x13] => 0x2286, # \subseteq, \supseteq + [0x14,0x15] => 0x2264, # \leq, \geq + [0x16,0x17] => 0x2AAF, # \preceq, \succeq + 0x18 => 0x223C, # \sim + 0x19 => 0x2248, # \approx + [0x1A,0x1B] => 0x2282, # \subset, \supset + [0x1C,0x1D] => 0x226A, # \ll, \gg + [0x1E,0x1F] => 0x227A, # \prec, \succ + + 0x20 => 0x2190, # \leftarrow + 0x21 => 0x2192, # \rightarrow + 0x22 => 0x2191, # \uparrow + 0x23 => 0x2193, # \downarrow + 0x24 => 0x2194, # \leftrightarrow + 0x25 => 0x2197, # \nearrow + 0x26 => 0x2198, # \searrow + 0x27 => 0x2243, # \simeq + + 0x28 => 0x21D0, # \Leftarrow + 0x29 => 0x21D2, # \Rightarrow + 0x2A => 0x21D1, # \Uparrow + 0x2B => 0x21D3, # \Downarrow + 0x2C => 0x21D4, # \Leftrightarrow + 0x2D => 0x2196, # \nwarrow + 0x2E => 0x2199, # \swarrow + 0x2F => 0x221D, # \propto + + 0x30 => 0x2032, # \prime + 0x31 => 0x221E, # \infty + 0x32 => 0x2208, # \in + 0x33 => 0x220B, # \ni + 0x34 => 0x25B3, # \bigtriangleup and \triangle + 0x35 => 0x25BD, # \bigtriangledown + 0x36 => 0xE020, # \not + + 0x38 => 0x2200, # \forall + 0x39 => 0x2203, # \exists + 0x3A => 0xAC, # \neg + 0x3B => 0x2205, # \emptyset + 0x3C => 0x211C, # \Re + 0x3D => 0x2111, # \Im + 0x3E => 0x22A4, # \top + 0x3F => 0x22A5, # \bot + + 0x40 => 0x2135, # \aleph + + 0x5B => 0x222A, # \cup + 0x5C => 0x2229, # \cap + 0x5D => 0x228E, # \uplus + [0x5E,0x5F] => 0x2227, # \wedge, \vee + + [0x60,0x61] => 0x22A2, # \vdash, \dashv + [0x62,0x63] => 0x230A, # \lfloor, \rfloor + [0x64,0x65] => 0x2308, # \lceil, \rceil + 0x66 => 0x7B, # { + 0x67 => 0x7D, # } + [0x68,0x69] => 0x27E8, # \langle, \rangle + 0x6A => 0x7C, # | + 0x6A => 0x2223, # \vert + 0x6B => 0x2225, # \Vert + 0x6C => 0x2195, # \updownarrow + 0x6D => 0x21D5, # \Updownarrow + 0x6E => 0x5C, # \backslash + 0x6E => 0x2216, # \setminus + 0x6F => 0x2240, # \wr + + 0x70 => [0x221A,0,760], # \surd ### adjust position so font doesn't have a large depth + 0x71 => 0x2A3F, # \amalg + 0x72 => 0x2207, # \nabla + 0x73 => 0x222B, # \int + 0x74 => 0x2294, # \sqcup + 0x75 => 0x2293, # \sqcap + [0x76,0x77] => 0x2291, # \sqsubseteq, \sqsupseteq + + [0x79,0x7A] => 0x2020, # \dagger, \ddagger + + 0x7C => 0x2663, # \clubsuit + 0x7D => 0x2662, # \diamondsuit + 0x7E => 0x2661, # \heartsuit + 0x7F => 0x2660, # \spadesuit + ], + + "Caligraphic-Bold" => [ + [0x41,0x5A] => 0x41, # A-Z + ], +}; + +$map{msam10} = { + "Main-Regular" => [ + 0x5C => 0x2220, # \angle + ], + + "Main-Bold" => [ + 0x5C => 0x2220, # \angle (emboldened below) + ], + + "AMS" => [ + 0x00 => 0x22A1, # \boxdot + 0x01 => 0x229E, # \boxplus + 0x02 => 0x22A0, # \boxtimes + 0x03 => 0x25A1, # \square + 0x04 => 0x25A0, # \blacksquare + 0x05 => 0x22C5, # \centerdot + 0x06 => 0x25CA, # \lozenge + 0x07 => 0x29EB, # \blacklozenge + 0x08 => 0x21BB, # \circlearrowright + 0x09 => 0x21BA, # \circlearrowleft + 0x0A => 0x21CC, # \rightleftharpoons + 0x0B => 0x21CB, # \leftrightharpoons + 0x0C => 0x229F, # \boxminus + 0x0D => 0x22A9, # \Vdash + 0x0E => 0x22AA, # \Vvdash + 0x0F => 0x22A8, # \vDash + 0x10 => 0x21A0, # \twoheadrightarrow + 0x11 => 0x219E, # \twoheadleftarrow + 0x12 => 0x21C7, # \leftleftarrows + 0x13 => 0x21C9, # \rightrightarrows + 0x14 => 0x21C8, # \upuparrows + 0x15 => 0x21CA, # \downdownarrows + 0x16 => 0x21BE, # \upharpoonright + 0x17 => 0x21C2, # \downharpoonright + 0x18 => 0x21BF, # \upharpoonleft + 0x19 => 0x21C3, # \downharpoonleft + 0x1A => 0x21A3, # \rightarrowtail + 0x1B => 0x21A2, # \leftarrowtail + 0x1C => 0x21C6, # \leftrightarrows + 0x1D => 0x21C4, # \rightleftarrows + 0x1E => 0x21B0, # \Lsh + 0x1F => 0x21B1, # \Rsh + 0x20 => 0x21DD, # \rightsquigarrow + 0x21 => 0x21AD, # \leftrightsquigarrow + 0x22 => 0x21AB, # \looparrowleft + 0x23 => 0x21AC, # \looparrowright + 0x24 => 0x2257, # \circeq + 0x25 => 0x227F, # \succsim + 0x26 => 0x2273, # \gtrsim + 0x27 => 0x2A86, # \gtrapprox + 0x28 => 0x22B8, # \multimap + 0x29 => 0x2234, # \therefore + 0x2A => 0x2235, # \because + 0x2B => 0x2251, # \doteqdot + 0x2C => 0x225C, # \triangleq + 0x2D => 0x227E, # \precsim + 0x2E => 0x2272, # \lesssim + 0x2F => 0x2A85, # \lessapprox + 0x30 => 0x2A95, # \eqslantless + 0x31 => 0x2A96, # \eqslantgtr + 0x32 => 0x22DE, # \curlyeqprec + 0x33 => 0x22DF, # \curlyeqsucc + 0x34 => 0x227C, # \preccurlyeq + 0x35 => 0x2266, # \leqq + 0x36 => 0x2A7D, # \leqslant + 0x37 => 0x2276, # \lessgtr + 0x38 => 0x2035, # \backprime + 0x39 => 0x2212, # dahsed arrow extension + 0x3A => 0x2253, # \risingdotseq + 0x3B => 0x2252, # \fallingdotseq + 0x3C => 0x227D, # \succcurlyeq + 0x3D => 0x2267, # \geqq + 0x3E => 0x2A7E, # \geqslant + 0x3F => 0x2277, # \gtrless + 0x40 => 0x228F, # \sqsubset + 0x41 => 0x2290, # \sqsupset + 0x42 => 0x22B3, # \vartriangleright + 0x43 => 0x22B2, # \vartriangleleft + 0x44 => 0x22B5, # \trianglerighteq + 0x45 => 0x22B4, # \trianglelefteq + 0x46 => 0x2605, # \bigstar + 0x47 => 0x226C, # \between + 0x48 => 0x25BC, # \blacktriangledown + 0x49 => 0x25B6, # \blacktriangleright + 0x4A => 0x25C0, # \blacktriangleleft + 0x4B => 0x2192, # rightarrow + 0x4C => 0x2190, # leftarrow + 0x4D => 0x25B3, # \vartriangle + 0x4E => 0x25B2, # \blacktriangle + 0x4F => 0x25BD, # \triangledown + 0x50 => 0x2256, # \eqcirc + 0x51 => 0x22DA, # \lesseqgtr + 0x52 => 0x22DB, # \gtreqless + 0x53 => 0x2A8B, # \lesseqqgtr + 0x54 => 0x2A8C, # \gtreqqless + 0x55 => 0x00A5, # yen + 0x56 => 0x21DB, # \Rrightarrow + 0x57 => 0x21DA, # \Lleftarrow + 0x58 => 0x2713, # checkmark + 0x59 => 0x22BB, # \veebar + 0x5A => 0x22BC, # \barwedge + 0x5B => 0x2A5E, # \doublebarwedge + 0x5C => 0x2220, # \angle + 0x5D => 0x2221, # \measuredangle + 0x5E => 0x2222, # \sphericalangle + 0x5F => 0x221D, # \varpropto + 0x60 => 0x2323, # \smallsmile + 0x61 => 0x2322, # \smallfrown + 0x62 => 0x22D0, # \Subset + 0x63 => 0x22D1, # \Supset + 0x64 => 0x22D3, # \Cup + 0x65 => 0x22D2, # \Cap + 0x66 => 0x22CF, # \curlywedge + 0x67 => 0x22CE, # \curlyvee + 0x68 => 0x22CB, # \leftthreetimes + 0x69 => 0x22CC, # \rightthreetimes + 0x6A => 0x2AC5, # \subseteqq + 0x6B => 0x2AC6, # \supseteqq + 0x6C => 0x224F, # \bumpeq + 0x6D => 0x224E, # \Bumpeq + 0x6E => 0x22D8, # \lll + 0x6F => 0x22D9, # \ggg + 0x70 => 0x250C, # \ulcorner + 0x71 => 0x2510, # \urcorner + 0x72 => 0x00AE, # registered sign + 0x73 => 0x24C8, # \circledS + 0x74 => 0x22D4, # \pitchfork + 0x75 => 0x2214, # \dotplus + 0x76 => 0x223D, # \backsim + 0x77 => 0x22CD, # \backsimeq + 0x78 => 0x2514, # \llcorner + 0x79 => 0x2518, # \lrcorner + 0x7A => 0x2720, # maltese cross + 0x7B => 0x2201, # \complement + 0x7C => 0x22BA, # \intercal + 0x7D => 0x229A, # \circledcirc + 0x7E => 0x229B, # \circledast + 0x7F => 0x229D, # \circleddash + ], +}; + +$map{msbm10} = { + "Size4" => [ + 0x5B => 0x2C6, # \widehat + 0x5B => [0x302,-1889,0],# \widehat (combining) + 0x5D => 0x2DC, # \widetilde + 0x5D => [0x303,-1889,0],# \widetilde (combining) + ], + + "Main-Regular" => [ + 0x7E => 0x210F, # \hbar + ], + + "Main-Italic" => [ + 0x7D => 0x210F, # \hbar (with slant) + ], + + "AMS" => [ + 0x00 => 0xE00C, # \lvertneqq + 0x01 => 0xE00D, # \gvertneqq + 0x02 => 0x2270, # \nleq + 0x03 => 0x2271, # \ngeq + 0x04 => 0x226E, # \nless + 0x05 => 0x226F, # \ngtr + 0x06 => 0x2280, # \nprec + 0x07 => 0x2281, # \nsucc + 0x08 => 0x2268, # \lneqq + 0x09 => 0x2269, # \gneqq + 0x0A => 0xE010, # \nleqslant + 0x0B => 0xE00F, # \ngeqslant + 0x0C => 0x2A87, # \lneq + 0x0D => 0x2A88, # \gneq + 0x0E => 0x22E0, # \npreceq + 0x0F => 0x22E1, # \nsucceq + 0x10 => 0x22E8, # \precnsim + 0x11 => 0x22E9, # \succnsim + 0x12 => 0x22E6, # \lnsim + 0x13 => 0x22E7, # \gnsim + 0x14 => 0xE011, # \nleqq + 0x15 => 0xE00E, # \ngeqq + 0x16 => 0x2AB5, # \precneqq + 0x17 => 0x2AB6, # \succneqq + 0x18 => 0x2AB9, # \precnapprox + 0x19 => 0x2ABA, # \succnapprox + 0x1A => 0x2A89, # \lnapprox + 0x1B => 0x2A8A, # \gnapprox + 0x1C => 0x2241, # \nsim + 0x1D => 0x2246, # \ncong + 0x1E => 0x2571, # \diagup + 0x1F => 0x2572, # \diagdown + 0x20 => 0xE01A, # \varsubsetneq + 0x21 => 0xE01B, # \varsupsetneq + 0x22 => 0xE016, # \nsubseteqq + 0x23 => 0xE018, # \nsupseteqq + 0x24 => 0x2ACB, # \subsetneqq + 0x25 => 0x2ACC, # \supsetneqq + 0x26 => 0xE017, # \varsubsetneqq + 0x27 => 0xE019, # \varsupsetneqq + 0x28 => 0x228A, # \subsetneq + 0x29 => 0x228B, # \supsetneq + 0x2A => 0x2288, # \nsubseteq + 0x2B => 0x2289, # \nsupseteq + 0x2C => 0x2226, # \nparallel + 0x2D => 0x2224, # \nmid + 0x2E => 0xE006, # \nshortmid + 0x2F => 0xE007, # \nshortparallel + 0x30 => 0x22AC, # \nvdash + 0x31 => 0x22AE, # \nVdash + 0x32 => 0x22AD, # \nvDash + 0x33 => 0x22AF, # \nVDash + 0x34 => 0x22ED, # \ntrianglerighteq + 0x35 => 0x22EC, # \ntrianglelefteq + 0x36 => 0x22EA, # \ntriangleleft + 0x37 => 0x22EB, # \ntriangleright + 0x38 => 0x219A, # \nleftarrow + 0x39 => 0x219B, # \nrightarrow + 0x3A => 0x21CD, # \nLeftarrow + 0x3B => 0x21CF, # \nRightarrow + 0x3C => 0x21CE, # \nLeftrightarrow + 0x3D => 0x21AE, # \nleftrightarrow + 0x3E => 0x22C7, # \divideontimes + 0x3F => 0x2205, # \varnothing + 0x40 => 0x2204, # \nexists + + [0x41,0x5A] => 0x41, # A-Z + 0x5C => 0x2C6, # \widehat + 0x5C => [0x302,-2333,0],# \widehat (combining) + 0x5E => 0x2DC, # \widetilde + 0x5E => [0x303,-2333,0],# \widetilde (combining) + + 0x60 => 0x2132, # \Finv + 0x61 => 0x2141, # \Game + 0x66 => 0x2127, # \mho + 0x67 => 0x00F0, # \eth + 0x68 => 0x2242, # minus-tilde + 0x69 => 0x2136, # \beth + 0x6A => 0x2137, # \gimel + 0x6B => 0x2138, # \daleth + 0x6C => 0x22D6, # \lessdot + 0x6D => 0x22D7, # \gtrdot + 0x6E => 0x22C9, # \ltimes + 0x6F => 0x22CA, # \rtimes + 0x70 => 0x2223, # \shortmid + 0x71 => 0x2225, # \shortparallel + 0x72 => 0x2216, # \smallsetminus + 0x73 => 0x223C, # \thicksim + 0x74 => 0x2248, # \thickapprox + 0x75 => 0x224A, # \approxeq + 0x76 => 0x2AB8, # \succapprox + 0x77 => 0x2AB7, # \precapprox + 0x78 => 0x21B6, # \curvearrowleft + 0x79 => 0x21B7, # \curvearrowright + 0x7A => 0x03DD, # \digamma + 0x7B => 0x03F0, # \varkappa + 0x7A => 0xE008, # \digamma (non-standard, for IE) + 0x7B => 0xE009, # \varkappa (non-standard, for IE) + 0x7C => 0x006B, # \Bbbk + 0x7D => 0x210F, # \hslash + 0x7E => 0x0127, # \hbar + 0x7F => 0x220D, # \backepsilon + ], +}; + +$map{cmss10} = { + "SansSerif-Regular" => [ + [0,1] => 0x393, # \Gamma, \Delta + 2 => 0x398, # \Theta + 3 => 0x39B, # \Lambda + 4 => 0x39E, # \Xi + 5 => 0x3A0, # \Pi + 6 => 0x3A3, # \Sigma + [7,8] => 0x3A5, # \Upsilon, \Phi + [9,0xA] => 0x3A8, # \Psi, \Omega + + 0x10 => 0x131, # \i + 0x11 => 0x237, # \j + 0x12 => 0x2CB, # \grave + 0x13 => 0x2CA, # \acute + 0x14 => 0x2C7, # \check + 0x15 => 0x2D8, # \breve + 0x16 => 0x2C9, # \bar + 0x17 => [0xB0,-142,0], # \degree + 0x17 => 0x02DA, # \r, ring above + 0x18 => 0xB8, # \c, cedilla + + [0x21,0x2F] => 0x21, # !, ", #, $, %, &, ', (, ), *, +, comma, -, ., / + 0x22 => 0x201D, # " + 0x27 => 0x2019, # ' + [0x30,0x39] => 0x30, # 0-9 + [0x3A,0x3B] => 0x3A, # :, ; + 0x3D => 0x3D, # = + [0x3F,0x40] => 0x3F, # ?, @ + [0x41,0x5A] => 0x41, # A-Z + 0x5B => 0x5B, # [ + 0x5C => 0x201C, # `` + [0x5D,0x5E] => 0x5D, # ], ^ + 0x5E => 0x2C6, # \hat + 0x5F => 0x2D9, # \dot + 0x60 => 0x2018, # ` + [0x61,0x7A] => 0x61, # a-z + [0x7B,0x7C] => 0x2013, # \endash, \emdash + 0x7B => [0x5F,0,-350], # underline + 0x7D => 0x2DD, # double acute + 0x7E => [0x7E,0,-350], # ~ + 0x7E => 0x2DC, # \tilde + 0x7F => 0xA8, # \ddot + ], +}; + +$map{cmssi10} = { + "SansSerif-Italic" => [ + [0,1] => 0x393, # \Gamma, \Delta + 2 => 0x398, # \Theta + 3 => 0x39B, # \Lambda + 4 => 0x39E, # \Xi + 5 => 0x3A0, # \Pi + 6 => 0x3A3, # \Sigma + [7,8] => 0x3A5, # \Upsilon, \Phi + [9,0xA] => 0x3A8, # \Psi, \Omega + + 0x10 => 0x131, # \i + 0x11 => 0x237, # \j + 0x12 => 0x2CB, # \grave + 0x13 => 0x2CA, # \acute + 0x14 => 0x2C7, # \check + 0x15 => 0x2D8, # \breve + 0x16 => 0x2C9, # \bar + 0x17 => [0xB0,-113,0], # \degree + 0x17 => 0x02DA, # \r, ring above + 0x18 => 0xB8, # \c, cedilla + + [0x21,0x2F] => 0x21, # !, ", #, $, %, &, ', (, ), *, +, comma, -, ., / + 0x22 => 0x201D, # " + 0x27 => 0x2019, # ' + [0x30,0x39] => 0x30, # 0-9 + [0x3A,0x3B] => 0x3A, # :, ; + 0x3D => 0x3D, # = + [0x3F,0x40] => 0x3F, # ?, @ + [0x41,0x5A] => 0x41, # A-Z + 0x5B => 0x5B, # [ + 0x5C => 0x201C, # `` + [0x5D,0x5E] => 0x5D, # ], ^ + 0x5E => 0x2C6, # \hat + 0x5F => 0x2D9, # \dot + 0x60 => 0x2018, # ` + [0x61,0x7A] => 0x61, # a-z + [0x7B,0x7C] => 0x2013, # \endash, \emdash + 0x7B => [0x5F,0,-350], # underline + 0x7D => 0x2DD, # double acute + 0x7E => [0x7E,0,-350], # ~ + 0x7E => 0x2DC, # \tilde + 0x7F => 0xA8, # \ddot + ], +}; + +$map{cmssbx10} = { + "SansSerif-Bold" => [ + [0,1] => 0x393, # \Gamma, \Delta + 2 => 0x398, # \Theta + 3 => 0x39B, # \Lambda + 4 => 0x39E, # \Xi + 5 => 0x3A0, # \Pi + 6 => 0x3A3, # \Sigma + [7,8] => 0x3A5, # \Upsilon, \Phi + [9,0xA] => 0x3A8, # \Psi, \Omega + + 0x10 => 0x131, # \i + 0x11 => 0x237, # \j + 0x13 => 0xB4, # \acute + 0x14 => 0x2C7, # \check + 0x15 => 0x2D8, # \breve + 0x16 => 0x2C9, # \bar + 0x17 => [0xB0,-58,0], # \degree + 0x17 => 0x02DA, # \r, ring above + 0x18 => 0xB8, # \c, cedilla + + [0x21,0x2F] => 0x21, # !, ", #, $, %, &, ', (, ), *, +, comma, -, ., / + 0x22 => 0x201D, # " + 0x27 => 0x2019, # ' + [0x30,0x39] => 0x30, # 0-9 + [0x3A,0x3B] => 0x3A, # :, ; + 0x3D => 0x3D, # = + [0x3F,0x40] => 0x3F, # ?, @ + [0x41,0x5A] => 0x41, # A-Z + 0x5B => 0x5B, # [ + 0x5C => 0x201C, # `` + [0x5D,0x5E] => 0x5D, # ], ^ + 0x5E => 0x2C6, # \hat + 0x5F => 0x2D9, # \dot + 0x60 => 0x2018, # ` + [0x61,0x7A] => 0x61, # a-z + [0x7B,0x7C] => 0x2013, # \endash, \emdash + 0x7B => [0x5F,0,-350], # underline + 0x7D => 0x2DD, # double acute + 0x7E => [0x7E,0,-350], # ~ + 0x7E => 0x2DC, # \tilde + 0x7F => 0xA8, # \ddot + ], +}; + +$map{eufm10} = { + "Fraktur-Regular" => [ + [0,7] => 0xE300, # variants + 0x12 => 0x2018, # left quote + 0x13 => 0x2019, # right quote + 0x21 => 0x21, # ! + [0x26,0x2F] => 0x26, # &, ', (, ), *, +, comma, -, ., / + [0x30,0x39] => 0x30, # 0-9 + [0x3A,0x3B] => 0x3A, # :, ; + 0x3D => 0x3D, # = + 0x3F => 0x3F, # ? + [0x41,0x5A] => 0x41, # A-Z + 0x5B => 0x5B, # [ + [0x5D,0x5E] => 0x5D, # ], ^ + [0x61,0x7A] => 0x61, # a-z + 0x7D => 0x22, # " + ], +}; + +$map{eufb10} = { + "Fraktur-Bold" => [ + [1,5] => 0xE301, # variants + [8,9] => 0xE308, # variants + 0x12 => 0x2018, # left quote + 0x13 => 0x2019, # right quote + 0x21 => 0x21, # ! + [0x26,0x2F] => 0x26, # &, ', (, ), *, +, comma, -, ., / + [0x30,0x39] => 0x30, # 0-9 + [0x3A,0x3B] => 0x3A, # :, ; + 0x3D => 0x3D, # = + 0x3F => 0x3F, # ? + [0x41,0x5A] => 0x41, # A-Z + 0x5B => 0x5B, # [ + [0x5D,0x5E] => 0x5D, # ], ^ + [0x61,0x7A] => 0x61, # a-z + 0x7D => 0x22, # " + ], +}; + +$map{rsfs10} = { + "Script-Regular" => [ + [0x41,0x5A] => 0x41, # A-Z + ] +}; + +#$map{eusm10} = { +# "Script-Regular" => [ +# 0x3C => 0x211C, # \Re +# 0x3D => 0x2111, # \Im +# 0x40 => 0x2135, # \aleph +# [0x41,0x5A] => 0x41, # A-Z +# 0x66 => 0x7B, # { +# 0x67 => 0x7D, # } +# 0x78 => 0xA7, # \S +# ], +#}; + +#$map{eusb10} = { +# "Script-Bold" => [ +# 0x3C => 0x211C, # \Re +# 0x3D => 0x2111, # \Im +# 0x40 => 0x2135, # \aleph +# [0x41,0x5A] => 0x41, # A-Z +# 0x66 => 0x7B, # { +# 0x67 => 0x7D, # } +# 0x78 => 0xA7, # \S +# ], +#}; + +$map{cmtt10} = { + "Typewriter" => [ + [0,1] => 0x393, # \Gamma, \Delta + 2 => 0x398, # \Theta + 3 => 0x39B, # \Lambda + 4 => 0x39E, # \Xi + 5 => 0x3A0, # \Pi + 6 => 0x3A3, # \Sigma + [7,8] => 0x3A5, # \Upsilon, \Phi + [9,0xA] => 0x3A8, # \Psi, \Omega + 0xD => 0x2032, # ' + + 0x10 => 0x131, # \i + 0x11 => 0x237, # \j + 0x12 => 0x2CB, # \grave + 0x13 => 0x2CA, # \acute + 0x14 => 0x2C7, # \check + 0x15 => 0x2D8, # \breve + 0x16 => 0x2C9, # \bar + 0x17 => 0xB0, # \degree + 0x17 => 0x02DA, # \r, ring above + 0x18 => 0xB8, # \c, cedilla + 0x20 => 0x2423, # graphic representation of space + + [0x21,0x7F] => 0x21, + + 0x60 => 0x2018, # left quote + 0x27 => 0x2019, # right quote + 0x5E => 0x2C6, # \hat + 0x5F => 0x2D9, # \dot + 0x7D => 0x2DD, # double acute + 0x7E => [0x7E,0,-350], # ~ + 0x7E => 0x2DC, # \tilde + 0x7F => 0xA8, # \ddot + ] +}; + +######################################################################### + +$extra{'Main-Regular'} = { + cdots => [ + 'Select(0u22C5)','Copy()', + 'Select(0u22EF)','Paste()', + 'PasteWithOffset(447,0)', + 'PasteWithOffset(894,0)', + 'SetRBearing(894,1)', + ], + + ldots => [ + 'Select(0u2E)','Copy()', + 'Select(0u2026)','Paste()', + 'PasteWithOffset(447,0)', + 'PasteWithOffset(894,0)', + 'SetRBearing(894,1)', + ], + + vdots => [ + 'Select(0u2E)','Copy()', + 'Select(0u22EE)','Clear()', + 'PasteWithOffset(0,-30)', + 'PasteWithOffset(0,380)', + 'PasteWithOffset(0,780)', + 'SetRBearing(-722,1)', + ], + + ddots => [ + 'Select(0u2E)','Copy()', + 'Select(0u22F1)','Clear()', + 'PasteWithOffset(55,700)', + 'PasteWithOffset(502,400)', + 'PasteWithOffset(949,100)', + 'SetRBearing(282,1)', + ], + + spaceEn => [ + 'Select(0u2002)', + 'SetRBearing(500)', + ], + + spaceEm => [ + 'Select(0u2003)', + 'SetRBearing(999)', + ], + + space3 => [ + 'Select(0u2004)', + 'SetRBearing(333)', + ], + + space4 => [ + 'Select(0u2005)', + 'SetRBearing(250)', + ], + + space6 => [ + 'Select(0u2006)', + 'SetRBearing(167)', + ], + + thinspace => [ + 'Select(0u2009)', + 'SetRBearing(167)', + ], + + hairspace => [ + 'Select(0u200A)', + 'SetRBearing(83)', + ], + + cong => [ + 'Select(0u223C)','Copy()', + 'Select(0u2245)','Clear()', + 'PasteWithOffset(0,222)', + 'Select(0u3D)','Copy()', + 'Select(0u2245)', + 'PasteWithOffset(0,-111)', + ], + + bowtie => [ + 'Select(0u25B9)','Copy()', + 'Select(0u22C8)','Paste()', + 'Select(0u25C3)','Copy()', + 'Select(0u22C8)', + 'PasteWithOffset(400,0)', + 'SetRBearing(400,1)', + 'RemoveOverlap()', + ], + + models => [ + 'Select(0u2223)','Copy()', + 'Select(0u22A8)','Paste()', + 'Select(0u3D)','Copy()', + 'Select(0u22A8)', + 'PasteWithOffset(89,0)', + 'SetRBearing(589,1)', + 'RemoveOverlap()', + ], + + doteq => [ + 'Select(0u3D)','Copy()', + 'Select(0u2250)','Paste()', + 'Select(0u2E)','Copy()', + 'Select(0u2250)', + 'PasteWithOffset(251,550)', + ], + + not => [ + 'Select(0uE020)', + 'SetRBearing(778,1)', + ], + + #notin => [ + # 'Select(0u2208)','Copy()', + # 'Select(0u2209)','Paste()', + # 'Select(0u338)','Copy()', + # 'Select(0u2209)', + # 'PasteWithOffset(-55,0)', + # 'RemoveOverlap()', + #], + + #noteq => [ + # 'Select(0u3D)','Copy()', + # 'Select(0u2260)','Paste()', + # 'Select(0u338)','Copy()', + # 'Select(0u2260)', + # 'PasteWithOffset(0,0)', + # 'RemoveOverlap()', + #], + + longleftarrow => [ + 'Select(0u2190)','Copy()', + 'Select(0u27F5)','Paste()', + 'Select(0u2212)','Copy()', + 'Select(0u27F5)', + 'PasteWithOffset(831,0)', + 'SetRBearing(609,1)', + 'RemoveOverlap()','Simplify()', + ], + + Longleftarrow => [ + 'Select(0u21D0)','Copy()', + 'Select(0u27F8)','Paste()', + 'Select(0u3D)','Copy()', + 'Select(0u27F8)', + 'PasteWithOffset(831,0)', + 'SetRBearing(609,1)', + 'RemoveOverlap()','Simplify()', + ], + + longrightarrow => [ + 'Select(0u2212)','Copy()', + 'Select(0u27F6)','Paste()', + 'Select(0u2192)','Copy()', + 'Select(0u27F6)', + 'PasteWithOffset(609,0)', + 'SetRBearing(860,1)', + 'RemoveOverlap()','Simplify()', + ], + + Longrightarrow => [ + 'Select(0u3D)','Copy()', + 'Select(0u27F9)','Paste()', + 'Select(0u21D2)','Copy()', + 'Select(0u27F9)', + 'PasteWithOffset(638,0)', + 'SetRBearing(860,1)', + 'RemoveOverlap()','Simplify()', + ], + + leftrightarrow => [ + 'Select(0u2190)','Copy()', + 'Select(0u27F7)','Paste()', + 'Select(0u2192)','Copy()', + 'Select(0u27F7)', + 'PasteWithOffset(859,0)', + 'SetRBearing(859,1)', + 'RemoveOverlap()','Simplify()', + ], + + Leftrightarrow => [ + 'Select(0u21D0)','Copy()', + 'Select(0u27FA)','Paste()', + 'Select(0u21D2)','Copy()', + 'Select(0u27FA)', + 'PasteWithOffset(858,0)', + 'SetRBearing(858,1)', + 'RemoveOverlap()','Simplify()', + ], + + mapsto => [ + 'Select(0u2192)','Copy()', + 'Select(0u21A6)','Paste()', + 'Generate("otf/KaTeX_Main-Regular.otf")', + 'Open("pfa/cmsy10.pfa")', + 'Select(0x37)','Copy()', + 'Open("otf/KaTeX_Main-Regular.otf")', + 'Select(0u21A6)', + 'PasteWithOffset(0,0)', + 'RemoveOverlap()','Simplify()', + ], + + xlongmapsto => [ + 'Select(0u27F6)','Copy()', + 'Select(0u27FC)','Paste()', + 'Generate("otf/KaTeX_Main-Regular.otf")', + 'Open("pfa/cmsy10.pfa")', + 'Select(0x37)','Copy()', + 'Open("otf/KaTeX_Main-Regular.otf")', + 'Select(0u27FC)', + 'PasteWithOffset(0,0)', + 'RemoveOverlap()','Simplify()', + ], + + hookleftarrow => [ + 'Select(0u2190)','Copy()', + 'Select(0u21A9)','Paste()', + 'Generate("otf/KaTeX_Main-Regular.otf")', + 'Open("pfa/cmmi10.pfa")', + 'Select(0x2D)','Copy()', + 'Open("otf/KaTeX_Main-Regular.otf")', + 'Select(0u21A9)', + 'PasteWithOffset(848,0)', + 'SetRBearing(126,1)', + 'RemoveOverlap()','Simplify()', + ], + + hookrightarrow => [ + 'Generate("otf/KaTeX_Main-Regular.otf")', + 'Open("pfa/cmmi10.pfa")', + 'Select(0x2C)','Copy()', + 'Open("otf/KaTeX_Main-Regular.otf")', + 'Select(0u21AA)','Paste()', + 'Select(0u2192)','Copy()', + 'Select(0u21AA)', + 'PasteWithOffset(126,0)', + 'SetRBearing(848,1)', + 'RemoveOverlap()','Simplify()', + ], + + rightleftharpoons => [ + 'Select(0u21BD)','Copy()', + 'Select(0u21CC)','Paste()', + 'Select(0u21C0)','Copy()', + 'Select(0u21CC)', + 'PasteWithOffset(0,160)', + 'RemoveOverlap()','Simplify()', + ], + + lgroup => [ + 'Select(0u23B0)','Copy()', + 'Select(0u27EE)','Paste()', + 'Select(0u23A9)','Copy()', + 'Select(0u27EE)', + 'PasteWithOffset(0,0)', + 'Scale(55,0,0)','RoundToInt()','Move(-38,250)', + 'RemoveOverlap()','Simplify()', + 'SetRBearing(-38,1)', + ], + + rgroup => [ + 'Select(0u23B1)','Copy()', + 'Select(0u27EF)','Paste()', + 'Select(0u23AD)','Copy()', + 'Select(0u27EF)', + 'PasteWithOffset(1,0)', + 'Scale(55,0,0)','RoundToInt()','Move(-38,250)', + 'RemoveOverlap()','Simplify()', + 'SetRBearing(-38,1)', + ], + + lmoustache => [ + 'Select(0u23AD)','Copy()', + 'Select(0u23B0)', + 'PasteWithOffset(0,0)', + 'Scale(55,0,0)','RoundToInt()','Move(-38,250)', + 'RemoveOverlap()','Simplify()', + 'SetRBearing(-38,1)', + ], + + rmoustache => [ + 'Select(0u23A9)','Copy()', + 'Select(0u23B1)', + 'PasteWithOffset(0,0)', + 'Scale(55,0,0)','RoundToInt()','Move(-38,250)', + 'RemoveOverlap()','Simplify()', + 'SetRBearing(-38,1)', + ], + + diacriticals => [ + 'Select(0uB0)', 'SetRBearing(-125,1)', # \degree + 'Select(0u20D7)','SetRBearing(153,1)', # \vec + ], + +}; + +$extra{'Main-Bold'} = { + cdots => [ + 'Select(0u22C5)','Copy()', + 'Select(0u22EF)','Paste()', + 'PasteWithOffset(488,0)', + 'PasteWithOffset(976,0)', + 'SetRBearing(976,1)', + ], + + ldots => [ + 'Select(0u2E)','Copy()', + 'Select(0u2026)','Paste()', + 'PasteWithOffset(488,0)', + 'PasteWithOffset(976,0)', + 'SetRBearing(976,1)', + ], + + vdots => [ + 'Select(0u2E)','Copy()', + 'Select(0u22EE)','Clear()', + 'PasteWithOffset(0,-30)', + 'PasteWithOffset(0,380)', + 'PasteWithOffset(0,780)', + 'SetRBearing(-681,1)', + ], + + ddots => [ + 'Select(0u2E)','Copy()', + 'Select(0u22F1)','Clear()', + 'PasteWithOffset(55,700)', + 'PasteWithOffset(502,400)', + 'PasteWithOffset(949,100)', + 'SetRBearing(323,1)', + ], + + spaceEn => [ + 'Select(0u2002)', + 'SetRBearing(500)', + ], + + spaceEm => [ + 'Select(0u2003)', + 'SetRBearing(999)', + ], + + space3 => [ + 'Select(0u2004)', + 'SetRBearing(333)', + ], + + space4 => [ + 'Select(0u2005)', + 'SetRBearing(250)', + ], + + space6 => [ + 'Select(0u2006)', + 'SetRBearing(167)', + ], + + thinspace => [ + 'Select(0u2009)', + 'SetRBearing(167)', + ], + + hairspace => [ + 'Select(0u200A)', + 'SetRBearing(83)', + ], + + cong => [ + 'Select(0u223C)','Copy()', + 'Select(0u2245)','Clear()', + 'PasteWithOffset(0,247)', + 'Select(0u3D)','Copy()', + 'Select(0u2245)', + 'PasteWithOffset(0,-136)', + ], + + bowtie => [ + 'Select(0u25B9)','Copy()', + 'Select(0u22C8)','Paste()', + 'Select(0u25C3)','Copy()', + 'Select(0u22C8)', + 'PasteWithOffset(425,0)', + 'SetRBearing(425,1)', + 'RemoveOverlap()', + ], + + models => [ + 'Select(0u2223)','Copy()', + 'Select(0u22A8)','Paste()', + 'Select(0u3D)','Copy()', + 'Select(0u22A8)', + 'PasteWithOffset(89,0)', + 'SetRBearing(655,1)', + 'RemoveOverlap()', + ], + + doteq => [ + 'Select(0u3D)','Copy()', + 'Select(0u2250)','Paste()', + 'Select(0u2E)','Copy()', + 'Select(0u2250)', + 'PasteWithOffset(288,550)', + ], + + not => [ + 'Select(0uE020)', + 'SetRBearing(894,1)', + ], + +# notin => [ +# 'Select(0u2208)','Copy()', +# 'Select(0u2209)','Paste()', +# 'Select(0u338)','Copy()', +# 'Select(0u2209)', +# 'PasteWithOffset(-63,0)', +# 'PasteWithOffset(831,0)', +# 'RemoveOverlap()', +# ], + +# noteq => [ +# 'Select(0u3D)','Copy()', +# 'Select(0u2260)','Paste()', +# 'Select(0u338)','Copy()', +# 'Select(0u2260)', +# 'PasteWithOffset(0,0)', +# 'PasteWithOffset(894,0)', +# 'RemoveOverlap()', +# ], + + longleftarrow => [ + 'Select(0u2190)','Copy()', + 'Select(0u27F5)','Paste()', + 'Select(0u2212)','Copy()', + 'Select(0u27F5)', + 'PasteWithOffset(944,0)', + 'SetRBearing(655,1)', + 'RemoveOverlap()','Simplify()', + ], + + Longleftarrow => [ + 'Select(0u21D0)','Copy()', + 'Select(0u27F8)','Paste()', + 'Select(0u3D)','Copy()', + 'Select(0u27F8)', + 'PasteWithOffset(975,0)', + 'SetRBearing(718,1)', + 'RemoveOverlap()','Simplify()', + ], + + longrightarrow => [ + 'Select(0u2212)','Copy()', + 'Select(0u27F6)','Paste()', + 'Select(0u2192)','Copy()', + 'Select(0u27F6)', + 'PasteWithOffset(688,0)', + 'SetRBearing(939,1)', + 'RemoveOverlap()','Simplify()', + ], + + Longrightarrow => [ + 'Select(0u3D)','Copy()', + 'Select(0u27F9)','Paste()', + 'Select(0u21D2)','Copy()', + 'Select(0u27F9)', + 'PasteWithOffset(720,0)', + 'SetRBearing(976,1)', + 'RemoveOverlap()','Simplify()', + ], + + leftrightarrow => [ + 'Select(0u2190)','Copy()', + 'Select(0u27F7)','Paste()', + 'Select(0u2192)','Copy()', + 'Select(0u27F7)', + 'PasteWithOffset(976,0)', + 'SetRBearing(976,1)', + 'RemoveOverlap()','Simplify()', + ], + + Leftrightarrow => [ + 'Select(0u21D0)','Copy()', + 'Select(0u27FA)','Paste()', + 'Select(0u21D2)','Copy()', + 'Select(0u27FA)', + 'PasteWithOffset(976,0)', + 'SetRBearing(976,1)', + 'RemoveOverlap()','Simplify()', + ], + + mapsto => [ + 'Select(0u2192)','Copy()', + 'Select(0u21A6)','Paste()', + 'Generate("otf/KaTeX_Main-Bold.otf")', + 'Open("pfa/cmbsy10.pfa")', + 'Select(0x37)','Copy()', + 'Open("otf/KaTeX_Main-Bold.otf")', + 'Select(0u21A6)', + 'PasteWithOffset(0,0)', + 'RemoveOverlap()','Simplify()', + ], + + xlongmapsto => [ + 'Select(0u27F6)','Copy()', + 'Select(0u27FC)','Paste()', + 'Generate("otf/KaTeX_Main-Bold.otf")', + 'Open("pfa/cmbsy10.pfa")', + 'Select(0x37)','Copy()', + 'Open("otf/KaTeX_Main-Bold.otf")', + 'Select(0u27FC)', + 'PasteWithOffset(0,0)', + 'RemoveOverlap()','Simplify()', + ], + + hookleftarrow => [ + 'Select(0u2190)','Copy()', + 'Select(0u21A9)','Paste()', + 'Generate("otf/KaTeX_Main-Bold.otf")', + 'Open("pfa/cmmib10.pfa")', + 'Select(0x2D)','Copy()', + 'Open("otf/KaTeX_Main-Bold.otf")', + 'Select(0u21A9)', + 'PasteWithOffset(965,0)', + 'SetRBearing(132,1)', + 'RemoveOverlap()','Simplify()', + ], + + hookrightarrow => [ + 'Generate("otf/KaTeX_Main-Bold.otf")', + 'Open("pfa/cmmib10.pfa")', + 'Select(0x2C)','Copy()', + 'Open("otf/KaTeX_Main-Bold.otf")', + 'Select(0u21AA)','Paste()', + 'Select(0u2192)','Copy()', + 'Select(0u21AA)', + 'PasteWithOffset(132,0)', + 'SetRBearing(963,1)', + 'RemoveOverlap()','Simplify()', + ], + + rightleftharpoons => [ + 'Select(0u21BD)','Copy()', + 'Select(0u21CC)','Paste()', + 'Select(0u21C0)','Copy()', + 'Select(0u21CC)', + 'PasteWithOffset(0,200)', + 'RemoveOverlap()','Simplify()', + ], + + hbar => [ + 'Select(0u2C9)','Copy()', + 'Select(0u210F)','PasteWithOffset(0,0)', + 'RemoveOverlap()','Simplify()', + ], + + angle => [ + 'Select(0u2220)','Copy()', + 'PasteWithOffset(0,10)', + 'PasteWithOffset(0,20)', + 'RemoveOverlap()','Simplify()', + 'PasteWithOffset(10,0)', + 'RemoveOverlap()','Simplify()', + ], + + diacriticals => [ + 'Select(0uB0)', 'SetRBearing(-147,1)', # \degree + 'Select(0u20D7)','SetRBearing(154,1)', # \vec + ], +}; + +$extra{'Main-Italic'} = { + diacriticals => [ + 'Select(0uB0)', 'SetRBearing(-160,1)', # \degree + ], +}; + +$extra{'Size1'} = { + iint => [ + 'Select(0u222B)', 'Copy()', + 'Select(0u222C)', 'Paste()', + 'PasteWithOffset(347,0)', + 'SetRBearing(347,1)', + ], + + iiint => [ + 'Select(0u222B)', 'Copy()', + 'Select(0u222D)', 'Paste()', + 'PasteWithOffset(347,0)', + 'PasteWithOffset(694,0)', + 'SetRBearing(694,1)', + ], +}; + +$extra{'Size2'} = { + iint => [ + 'Select(0u222B)', 'Copy()', + 'Select(0u222C)', 'Paste()', + 'PasteWithOffset(528,0)', + 'SetRBearing(528,1)', + ], + + iiint => [ + 'Select(0u222B)', 'Copy()', + 'Select(0u222D)', 'Paste()', + 'PasteWithOffset(528,0)', + 'PasteWithOffset(1036,0)', + 'SetRBearing(1036,1)', + ], +}; + +$extra{'Size4'} = { + braceext => [ + 'Open("lib/Extra.otf")', + 'Select(0u5F)','Copy()', + 'Open("otf/KaTeX_Size4-Regular.otf")', + 'Select(0uE154)','Paste()', + ], +}; + +$extra{"AMS"} = { + dashleftarrow => [ + 'Select(0u2190)', 'Copy()', + 'Select(0u21E0)', 'Paste()', + 'Select(0u2212)','Copy()', + 'Select(0u21E0)', + 'PasteWithOffset(417,0)', + 'PasteWithOffset(834,0)', + 'SetRBearing(834,1)', + ], + + dashrightarrow => [ + 'Select(0u2212)', 'Copy()', + 'Select(0u21E2)', 'Paste()', + 'PasteWithOffset(417,0)', + 'Select(0u2192)','Copy()', + 'Select(0u21E2)','PasteWithOffset(834,0)', + 'SetRBearing(834,1)', + ], +}; + +$extra{'Typewriter'} = { + space => [ + 'Select(0u20)','Clear()', + 'SetRBearing(525)', + ], + + spaceNB => [ + 'Select(0uA0)','Clear()', + 'SetRBearing(525)', + ], +}; + +$extra{"SansSerif-Regular"} = { + diacriticals => [ + 'Select(0uB0)', 'SetRBearing(-142,1)', # \degree + ], +}; + +$extra{"SansSerif-Italic"} = { + diacriticals => [ + 'Select(0uB0)', 'SetRBearing(-113,1)', # \degree + ], +}; + +$extra{"SansSerif-Bold"} = { + diacriticals => [ + 'Select(0uB0)', 'SetRBearing(-58,1)', # \degree + ], +}; + +######################################################################### + +foreach $cmfont (sort (keys %map)) { + print "Reading $cmfont...\n"; + foreach $mjfont (keys %{$map{$cmfont}}) { + $fontname = "KaTeX_$mjfont"; + $style = $fontname; $style =~ s/.*?(-|$)//; $style = "Regular" unless $style; + $normal = "Normal"; $normal = "Bold" if style =~ m/Bold/; + $family = $fontname; $family =~ s/-.*//; + $fontname = "$family-$style"; + $STYLE = $style; $STYLE = "Bold Italic" if $STYLE eq "BoldItalic"; + $otf = "otf/$fontname.otf"; + unless (defined($script{$mjfont})) { + open(SPACE,"lib/Space.ttx"); $lines = join("",); close(SPACE); + $lines =~ s/\*NAME\*/$family/g; $lines =~ s/\*WEIGHT\*/$style/g; + $lines =~ s/\*WEIGHT_S\*/$STYLE/g; $lines =~ s/\*NORMAL\*/$normal/g; + if ($style eq "Regular") {$lines =~ s/\* WEIGHT\*//g} else {$lines =~ s/\* WEIGHT\*/ $STYLE/g} + open(SPACE,">Space.ttx"); print SPACE $lines; close(SPACE); + `$TTX -f Space.ttx; mv Space.otf '$otf'`; unlink("Space.ttx"); + $script{$mjfont} = [ + 'Open("'.$otf.'")', + 'SetPanose([0,0,'.($style eq 'Bold' ? '8' : '0').',0,0,0,0,0,0,0])', + 'SetOS2Value("Weight",'.($style =~ m/Bold/ ? 700 : 400).')', + 'SetGasp(8,2,16,1,65535,3)', + 'Reencode("unicode")', + 'Generate("'.$otf.'")', + ]; + } + $script = $script{$mjfont}; + @remap = @{$map{$cmfont}{$mjfont}}; + while (defined($item = shift(@remap))) { + $remap = shift(@remap); + if ($cmfont =~ /^eu/) { + push(@$script,'Open("pfa/'.$cmfont.'.pfb")'); + } else { + push(@$script,'Open("pfa/'.$cmfont.'.pfa")'); + } + if (ref($item) eq "ARRAY") { + push(@$script,'Select('.sprintf("%d,%d",@$item).')'); + } else { + push(@$script,'Select('.$item.')'); + } + push(@$script,"Copy()",'Open("'.$otf.'")'); + if (ref($item) eq "ARRAY") { + push(@$script, + 'Select('.sprintf("0u%04x,0u%04x",$remap,$remap+($item->[1]-$item->[0])).')', + 'Paste()', + ); + } elsif (ref($remap) eq "ARRAY") { + push(@$script, + 'Select('.sprintf("0u%04x",$remap->[0]).')', + 'Paste()', + 'Move('.$remap->[1].','.$remap->[2].')', + ); + } else { + push(@$script,'Select('.sprintf("0u%04x",$remap).')','Paste()'); + } + push(@$script,'Generate("'.$otf.'")'); + } + } +} +print "\n"; + + +# +# Add extra characters by hand +# +foreach $font (keys %extra) { + foreach $char (sort(keys %{$extra{$font}})) { + push(@{$script{$font}},join(";\n",@{$extra{$font}{$char}}),""); + } +} + +# Cleanup temporary glyphs +push(@{$script{'Main-Regular'}}, + 'Select(0u23A9)', + 'Clear()', + 'Select(0u23AD)', + 'Clear()', +); + +# +# Write all scripts +# +foreach $font (sort keys %script) { + $family = $font; $family .= "-Regular" unless $family =~ m/-/; + print "KaTeX_$font\n"; + open(SCRIPT,">","ff/KaTeX_$family.ff"); + print SCRIPT join(";\n",@{$script{$font}},"", + 'SelectAll()','RoundToInt()', + 'Simplify()','AddExtrema()','Simplify()', + 'ClearHints()','AutoHint()','RoundToInt()', + 'Generate("otf/KaTeX_'.$family.'.otf")', + 'SelectAll()','AutoInstr()', + 'Generate("ttf/KaTeX_'.$family.'.ttf")'),"\n"; + close(SCRIPT); +} + +1; diff --git a/src/fonts/xbbold.mf b/src/fonts/xbbold.mf new file mode 100644 index 00000000..64a6683c --- /dev/null +++ b/src/fonts/xbbold.mf @@ -0,0 +1,182 @@ +%% filename: xbbold.mf +%% version: 2.2 +%% date: 1995/01/04 +%% +%% (katex-fonts) The line 69 is modified to prevent overflow +%% +%% American Mathematical Society +%% Technical Support +%% Publications Technical Group +%% 201 Charles Street +%% Providence, RI 02904 +%% USA +%% tel: (401) 455-4080 +%% (800) 321-4267 (USA and Canada only) +%% fax: (401) 331-3842 +%% email: tech-support@ams.org +%% +%% Copyright 1995, 2009 American Mathematical Society. +%% +%% This Font Software is licensed under the SIL Open Font License, +%% Version 1.1. This license is in the accompanying file OFL.txt, and +%% is also available with a FAQ at: http://scripts.sil.org/OFL. +%% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +% Changes of minimal parameters in outlined characters for version 2.1 +% done by Stefan Lindner, 18-April-1991 + +input xbbase; +%%mode_setup; %called by amsyb.mf; two calls confuse Metafont. NGB 15-OCT-1991 + +%%%%designsize:= font_size; % was 10pt#; +width#:= designsize; % was 10pt#; +unit#:= width#/18; +u#:= width#/54; +smallu#:= width#/162; +ascender#:= 37/3*unit#; +cap#:= 37/3*unit#; +number#:= 36/3*unit#; +xheight#:= 25/3*unit#; +descender#:= 12/4*unit#; +define_whole_vertical_pixels + (width,unit,u,smallu,ascender,cap,number,xheight,descender); +wpix(1.90u) (linethickness); +wpix(0.65u) (Sover_bot); +wpix(1.00u) (Aapex,Napex,Vapex,Wapex,Cover,Gover,Oover,Sover_top,Uover); +wpix(9.00u) (Uthin_bracket); +wpix(8.00u) (Kthin_diag_bracket,Xthin_diag_bracket,Ythin_diag_bracket); +wpix(7.00u) (k_thin_diag); +wpix(6.00u) (c_thin_stem_bracket); +wpix(5.00u) (c_thick_stem_bracket,c_inner_bracket,lc_thick_stem_bracket); +wpix(4.00u) (c_round_bracket); +adjpix(1.35u) (serif_thickness); +adjpix(1.30u) (Emid_tip,inbeak); +adjpix(1.50u) (Atip,Btopthin,Bmidthin,Ebot_tip,Ltip,Mapex, + Ntip,Ttip,Vtip,Wtip,Ztip,outbeak); +adjpix(1.65u) (Bbotthin,Gbotthin,Stopthin); +adjpix(1.75u) (Dtopthin,Ebotarm,Lthin,Tthin); +adjpix(1.80u) (Abar,Ctopthin,Dbotthin,Gtopthin,Jbotthin,Pmidarm,Sbotthin); +adjpix(1.90u) (Emidarm,Etoparm,Othin,Pthin,Rthin,Ydiag,Zthin); +adjpix(2.00u) (kthin,Mthin_diag,Wleftthin); +adjpix(2.10u) (Ctip); +adjpix(2.25u) (Athin,Kthin,Mthin_vert,Nthin,Uthin,Vthin,Wrightthin,Xthin); +adjpix(2.50u) (Hbar); +adjpix(2.60u) (Cbotthin); + + +%%%% Begin of changes for version 2.1 +%(katex-fonts) Originally was pixels_per_inch*designsize < 1500: +if pixels_per_inch < 1500/designsize: + if pixels_per_inch*designsize < 1000: + if pixels_per_inch*designsize < 800: + if pixels_per_inch*designsize < 700: + minadjpix(0)(8.80u) (stem); + minadjpix(0)(6.80u) (kdiag); + minadjpix(0)(7.40u) (kstem); + minadjpix(0)(7.80u) (Jbulb,Mdiag); + minadjpix(0)(8.20u) (Kdiag); + minadjpix(0)(8.30u) (Gstem,Mstem); + minadjpix(0)(8.60u) (Lstem,Ustem,Ythick_diag); + minadjpix(0)(8.50u) (Bstem,Estem,Fstem,Ndiag,Rdiag,Xdiag,Zdiag); + minadjpix(0)(8.90u) (Btopcurve); + minadjpix(1)(9.30u) (Bbotcurve,Pcurve,Rcurve); + minadjpix(1)(9.50u) (Ccurve,Dcurve,Gcurve,Ocurve); + else: + minadjpix(1)(8.80u) (stem); + minadjpix(1)(6.80u) (kdiag); + minadjpix(1)(7.40u) (kstem); + minadjpix(1)(7.80u) (Jbulb,Mdiag); + minadjpix(1)(8.20u) (Kdiag); + minadjpix(1)(8.30u) (Gstem,Mstem); + minadjpix(1)(8.60u) (Lstem,Ustem,Ythick_diag); + minadjpix(1)(8.50u) (Bstem,Estem,Fstem,Ndiag,Rdiag,Xdiag,Zdiag); + minadjpix(1)(8.90u) (Btopcurve); + minadjpix(2)(9.30u) (Bbotcurve,Pcurve,Rcurve); + minadjpix(2)(9.50u) (Ccurve,Dcurve,Gcurve,Ocurve); + fi + else: + adjpix(3.0u) (Mapex); + minadjpix(1)(8.80u) (stem); + minadjpix(2)(6.80u) (kdiag); + minadjpix(2)(7.40u) (kstem); + minadjpix(2)(7.80u) (Jbulb); + minadjpix(1)(6.00u) (Mdiag); + minadjpix(2)(8.20u) (Kdiag); + minadjpix(2)(8.30u) (Gstem) + minadjpix(2)(8.30u) (Mstem); + minadjpix(2)(8.60u) (Lstem,Ustem,Ythick_diag); + minadjpix(2)(8.50u) (Bstem,Ndiag,Rdiag,Xdiag,Zdiag); + minadjpix(1)(8.50u) (Estem, Fstem); + minadjpix(2)(8.90u) (Btopcurve); + minadjpix(3)(9.30u) (Bbotcurve,Pcurve,Rcurve); + minadjpix(3)(9.50u) (Ccurve,Dcurve,Gcurve,Ocurve); + fi + else: + adjpix(3.0u) (Mapex); + minadjpix(2)(8.80u) (stem); + minadjpix(3)(6.80u) (kdiag); + minadjpix(3)(7.40u) (kstem); + minadjpix(3)(7.80u) (Jbulb); + minadjpix(1)(5.00u) (Mdiag); + minadjpix(3)(8.20u) (Kdiag); + minadjpix(3)(8.30u) (Gstem); + minadjpix(2)(8.30u) (Mstem); + minadjpix(3)(8.60u) (Lstem,Ustem,Ythick_diag); + minadjpix(3)(8.50u) (Estem,Fstem,Ndiag,Rdiag,Xdiag,Zdiag); + minadjpix(2)(8.50u) (Bstem); + minadjpix(3)(8.90u) (Btopcurve); + minadjpix(3)(9.30u) (Bbotcurve,Pcurve,Rcurve); + minadjpix(3)(9.50u) (Ccurve,Dcurve,Gcurve,Ocurve) + fi +else: + minadjpix(4)(8.80u) (stem); + minadjpix(4)(6.80u) (kdiag); + minadjpix(4)(7.40u) (kstem); + minadjpix(4)(7.80u) (Jbulb,Mdiag); + minadjpix(4)(8.20u) (Kdiag); + minadjpix(4)(8.30u) (Gstem,Mstem); + minadjpix(4)(8.60u) (Lstem,Ustem,Ythick_diag); + minadjpix(4)(8.50u) (Bstem,Estem,Fstem,Ndiag,Rdiag,Xdiag,Zdiag); + minadjpix(4)(8.90u) (Btopcurve); + minadjpix(5)(9.30u) (Bbotcurve,Pcurve,Rcurve); + minadjpix(5)(9.50u) (Ccurve,Dcurve,Gcurve,Ocurve) +fi; +%%%% end of changes for version 2.1 + +boolean lowres; lowres:=width<50; +highres_lowres(pullin) (.85)(1); % Emidarm +highres_lowres(pulleven) (1)(1.3); % Etoparm,Tarms,Zarms +highres_lowres(pullout) (1.1)(1); % Ebotarm,Lbotarm +highres_lowres(bracket0) (.0)(0); % Ntopleft +highres_lowres(bracket3) (.3)(0); % Nthinstems +highres_lowres(bracket01) (.0)(.1); % Uthin +highres_lowres(bracket32) (.3)(.2); % Vstems +highres_lowres(bracket4) (.4)(0); % P-all,R-all,I-all,F-all +highres_lowres(bracket42) (.4)(.2); % Xdiag + +bool(ctrls):=false; +entasis:=inlimit(0)(0,1); +serif_constant_amt:=0pt; +join_radius:=1; +bool(softpath):=true; + +c_thick_stem_bracket:=min(.5cap-eps,c_thick_stem_bracket); +rulepen:=pensquare scaled 1; +extra_beginchar:=extra_beginchar&"save t,p,ref; path p[],p[]',p[]'',ref[];"; +extra_beginchar:=extra_beginchar&"pickup pencircle scaled linethickness;"; + +for x:="R": + wanted[byte x]:=true; endfor % test these characters + let iff=always_iff; % tests all chars in the file + +font_normal_space .3width#; % TeX fontdimen 2 normal word space +font_normal_stretch .15width#; % TeX fontdimen 3 interword stretch +font_normal_shrink .1width#; % TeX fontdimen 4 interword shrink +font_x_height xheight#; % Tex fontdinem 5 for accents +font_quad width#; % TeX fontdimen 6 quad width +font_extra_space .1width#; % TeX fontdimen 7 extra space(period) + + +input xbcaps +bye % changed from "end" 26 Aug 93; bnb diff --git a/src/katex.less b/src/katex.less index 8a3065c5..851693e7 100644 --- a/src/katex.less +++ b/src/katex.less @@ -1,5 +1,5 @@ /* stylelint-disable font-family-no-missing-generic-family-keyword */ -@import "../submodules/katex-fonts/fonts.less"; +@import "fonts.less"; // The mu unit is defined as 1/18 em @mu: (1em / 18); diff --git a/src/macros.js b/src/macros.js index 48ebe370..986e31c5 100644 --- a/src/macros.js +++ b/src/macros.js @@ -4,7 +4,7 @@ * This can be used to define some commands in terms of others. */ -import fontMetricsData from "../submodules/katex-fonts/fontMetricsData"; +import fontMetricsData from "./fontMetricsData"; import functions from "./functions"; import symbols from "./symbols"; import utils from "./utils"; diff --git a/src/metrics/.gitignore b/src/metrics/.gitignore new file mode 100644 index 00000000..0d20b648 --- /dev/null +++ b/src/metrics/.gitignore @@ -0,0 +1 @@ +*.pyc diff --git a/src/metrics/README.md b/src/metrics/README.md new file mode 100644 index 00000000..1a8a686e --- /dev/null +++ b/src/metrics/README.md @@ -0,0 +1,23 @@ +### How to generate new metrics +------------------------------- + +There are several requirements for generating the metrics used by KaTeX. + +- You need to have an installation of TeX which supports kpathsea. You can check + this by running `tex --version`, and seeing if it has a line that looks like + > kpathsea version 6.2.0 + +- You need the Perl module `JSON`. You can install this either from CPAN + (e.g. using the `cpan` command line tool: `cpan install JSON`) + or with your package manager. + +- You need the Python module `fonttools`. You can install this either from PyPI + (using `easy_install` or `pip`: `pip install fonttools`) + or with your package manager. + +Once you have these things, run the following command from the root directory: + + sh ./docker/fonts/buildMetrics.sh + +which should generate new metrics and place them into `fontMetricsData.json`. +You're done! diff --git a/src/metrics/extract_tfms.py b/src/metrics/extract_tfms.py new file mode 100755 index 00000000..594d1b1c --- /dev/null +++ b/src/metrics/extract_tfms.py @@ -0,0 +1,114 @@ +#!/usr/bin/env python + +import collections +import json +import parse_tfm +import subprocess +import sys + + +def find_font_path(font_name): + try: + font_path = subprocess.check_output(['kpsewhich', font_name]) + except OSError: + raise RuntimeError("Couldn't find kpsewhich program, make sure you" + + " have TeX installed") + except subprocess.CalledProcessError: + raise RuntimeError("Couldn't find font metrics: '%s'" % font_name) + return font_path.strip() + + +def main(): + mapping = json.load(sys.stdin) + + fonts = [ + 'cmbsy10.tfm', + 'cmbx10.tfm', + 'cmbxti10.tfm', + 'cmex10.tfm', + 'cmmi10.tfm', + 'cmmib10.tfm', + 'cmr10.tfm', + 'cmsy10.tfm', + 'cmti10.tfm', + 'msam10.tfm', + 'msbm10.tfm', + 'eufm10.tfm', + 'cmtt10.tfm', + 'rsfs10.tfm', + 'cmss10.tfm', + 'cmssbx10.tfm', + 'cmssi10.tfm', + ] + + # Extracted by running `\font\a=` and then `\showthe\skewchar\a` in + # TeX, where `` is the name of the font listed here. The skewchar + # will be printed out in the output. If it outputs `-1`, that means there + # is no skewchar, so we use `None` here. + font_skewchar = { + 'cmbsy10': None, + 'cmbx10': None, + 'cmbxti10': None, + 'cmex10': None, + 'cmmi10': 127, + 'cmmib10': None, + 'cmr10': None, + 'cmsy10': 48, + 'cmti10': None, + 'msam10': None, + 'msbm10': None, + 'eufm10': None, + 'cmtt10': None, + 'rsfs10': None, + 'cmss10': None, + 'cmssbx10': None, + 'cmssi10': None, + } + + font_name_to_tfm = {} + + for font_name in fonts: + font_basename = font_name.split('.')[0] + font_path = find_font_path(font_name) + font_name_to_tfm[font_basename] = parse_tfm.read_tfm_file(font_path) + + families = collections.defaultdict(dict) + + for family, chars in mapping.iteritems(): + for char, char_data in chars.iteritems(): + char_num = int(char) + + font = char_data['font'] + tex_char_num = int(char_data['char']) + yshift = float(char_data['yshift']) + + if family == "Script-Regular": + tfm_char = font_name_to_tfm[font].get_char_metrics(tex_char_num, + fix_rsfs=True) + else: + tfm_char = font_name_to_tfm[font].get_char_metrics(tex_char_num) + + height = round(tfm_char.height + yshift / 1000.0, 5) + depth = round(tfm_char.depth - yshift / 1000.0, 5) + italic = round(tfm_char.italic_correction, 5) + width = round(tfm_char.width, 5) + + skewkern = 0.0 + if (font_skewchar[font] and + font_skewchar[font] in tfm_char.kern_table): + skewkern = round( + tfm_char.kern_table[font_skewchar[font]], 5) + + families[family][char_num] = { + 'height': height, + 'depth': depth, + 'italic': italic, + 'skew': skewkern, + 'width': width + } + + sys.stdout.write( + json.dumps(families, separators=(',', ':'), sort_keys=True)) + +if __name__ == '__main__': + main() diff --git a/src/metrics/extract_ttfs.py b/src/metrics/extract_ttfs.py new file mode 100755 index 00000000..d287ebd5 --- /dev/null +++ b/src/metrics/extract_ttfs.py @@ -0,0 +1,119 @@ +#!/usr/bin/env python + +from fontTools.ttLib import TTFont +import sys +import json + +# map of characters to extract +metrics_to_extract = { + # Font name + "AMS-Regular": { + u"\u21e2": None, # \dashrightarrow + u"\u21e0": None, # \dashleftarrow + }, + "Main-Regular": { + # Skew and italic metrics can't be easily parsed from the TTF. Instead, + # we map each character to a "base character", which is a character + # from the same font with correct italic and skew metrics. A character + # maps to None if it doesn't have a base. + + #u"\u2209": None, # \notin + #u"\u2260": None, # \neq + u"\u2245": None, # \cong + u"\u2026": None, # \ldots + u"\u22ef": None, # \cdots + u"\u22f1": None, # \ddots + u"\u22ee": None, # \vdots + u"\u22ee": None, # \vdots + u"\u22a8": None, # \models + u"\u22c8": None, # \bowtie + u"\u2250": None, # \doteq + u"\u23b0": None, # \lmoustache + u"\u23b1": None, # \rmoustache + u"\u27ee": None, # \lgroup + u"\u27ef": None, # \rgroup + u"\u27f5": None, # \longleftarrow + u"\u27f8": None, # \Longleftarrow + u"\u27f6": None, # \longrightarrow + u"\u27f9": None, # \Longrightarrow + u"\u27f7": None, # \longleftrightarrow + u"\u27fa": None, # \Longleftrightarrow + u"\u21a6": None, # \mapsto + u"\u27fc": None, # \longmapsto + u"\u21a9": None, # \hookleftarrow + u"\u21aa": None, # \hookrightarrow + u"\u21cc": None, # \rightleftharpoons + }, + "Size1-Regular": { + u"\u222c": u"\u222b", # \iint, based on \int + u"\u222d": u"\u222b", # \iiint, based on \int + }, + "Size2-Regular": { + u"\u222c": u"\u222b", # \iint, based on \int + u"\u222d": u"\u222b", # \iiint, based on \int + }, +} + + +def main(): + start_json = json.load(sys.stdin) + + for font in start_json: + fontInfo = TTFont("../../fonts/KaTeX_" + font + ".ttf") + glyf = fontInfo["glyf"] + widths = fontInfo.getGlyphSet() + unitsPerEm = float(fontInfo["head"].unitsPerEm) + + # We keep ALL Unicode cmaps, not just fontInfo["cmap"].getcmap(3, 1). + # This is playing it extra safe, since it reports inconsistencies. + # Platform 0 is Unicode, platform 3 is Windows. For platform 3, + # encoding 1 is UCS-2 and encoding 10 is UCS-4. + cmap = [t.cmap for t in fontInfo["cmap"].tables + if (t.platformID == 0) + or (t.platformID == 3 and t.platEncID in (1, 10))] + + chars = metrics_to_extract.get(font, {}) + chars[u"\u0020"] = None # space + chars[u"\u00a0"] = None # nbsp + + for char, base_char in chars.iteritems(): + code = ord(char) + names = set(t.get(code) for t in cmap) + if not names: + sys.stderr.write( + "Codepoint {} of font {} maps to no name\n" + .format(code, font)) + continue + if len(names) != 1: + sys.stderr.write( + "Codepoint {} of font {} maps to multiple names: {}\n" + .format(code, font, ", ".join(sorted(names)))) + continue + name = names.pop() + + height = depth = italic = skew = width = 0 + glyph = glyf[name] + if glyph.numberOfContours: + height = glyph.yMax / unitsPerEm + depth = -glyph.yMin / unitsPerEm + width = widths[name].width / unitsPerEm + if base_char: + base_char_str = str(ord(base_char)) + base_metrics = start_json[font][base_char_str] + italic = base_metrics["italic"] + skew = base_metrics["skew"] + width = base_metrics["width"] + + start_json[font][str(code)] = { + "height": height, + "depth": depth, + "italic": italic, + "skew": skew, + "width": width + } + + sys.stdout.write( + json.dumps(start_json, separators=(',', ':'), sort_keys=True)) + +if __name__ == "__main__": + main() diff --git a/src/metrics/format_json.py b/src/metrics/format_json.py new file mode 100644 index 00000000..c0a724d2 --- /dev/null +++ b/src/metrics/format_json.py @@ -0,0 +1,28 @@ +#!/usr/bin/env python + +import sys +import json + +props = ['depth', 'height', 'italic', 'skew'] + +if len(sys.argv) > 1: + if sys.argv[1] == '--width': + props.append('width') + +data = json.load(sys.stdin) +sys.stdout.write( + "// This file is GENERATED by buildMetrics.sh. DO NOT MODIFY.\n") +sep = "export default {\n " +for font in sorted(data): + sys.stdout.write(sep + json.dumps(font)) + sep = ": {\n " + for glyph in sorted(data[font], key=int): + sys.stdout.write(sep + json.dumps(glyph) + ": ") + + values = [value if value != 0.0 else 0 for value in + [data[font][glyph][key] for key in props]] + + sys.stdout.write(json.dumps(values)) + sep = ",\n " + sep = ",\n },\n " +sys.stdout.write(",\n },\n};\n") diff --git a/src/metrics/mapping.pl b/src/metrics/mapping.pl new file mode 100755 index 00000000..dabc7ce8 --- /dev/null +++ b/src/metrics/mapping.pl @@ -0,0 +1,1224 @@ +#! /usr/bin/perl + +# Adapted from the MathJax-dev repository file /fonts/OTF/TeX/makeFF under the +# Apache 2 license + +# We use this file to recover the mapping from TeX fonts to KaTeX fonts, to +# accurately extract the metrics from the corresponding .tfm (TeX font metric) +# files + +use JSON; + +$map{cmr10} = { + "Main-Regular" => [ + [0,1] => 0x393, # \Gamma, \Delta + 2 => 0x398, # \Theta + 3 => 0x39B, # \Lambda + 4 => 0x39E, # \Xi + 5 => 0x3A0, # \Pi + 6 => 0x3A3, # \Sigma + [7,8] => 0x3A5, # \Upsilon, \Phi + [9,0xA] => 0x3A8, # \Psi, \Omega + + 0x10 => 0x131, # \i + 0x11 => 0x237, # \j + 0x12 => 0x2CB, # \grave + 0x13 => 0x2CA, # \acute + 0x14 => 0x2C7, # \check + 0x15 => 0x2D8, # \breve + 0x16 => 0x2C9, # \bar + 0x17 => [0xB0,-125,0], # \degree + 0x17 => 0x02DA, # \r, ring above + 0x18 => 0xB8, # \c, cedilla + + [0x21,0x2F] => 0x21, # !, ", #, $, %, &, ', (, ), *, +, comma, -, ., / + 0x22 => 0x201D, # " + 0x27 => 0x2019, # ' + [0x30,0x39] => 0x30, # 0-9 + [0x3A,0x3B] => 0x3A, # :, ; + 0x3D => 0x3D, # = + [0x3F,0x40] => 0x3F, # ?, @ + [0x41,0x5A] => 0x41, # A-Z + 0x5B => 0x5B, # [ + 0x5C => 0x201C, # `` + [0x5D,0x5E] => 0x5D, # ], ^ + 0x5E => 0x2C6, # \hat + 0x5F => 0x2D9, # \dot + 0x60 => 0x2018, # ` + [0x61,0x7A] => 0x61, # a-z + [0x7B,0x7C] => 0x2013, # \endash, \emdash + 0x7B => [0x5F,0,-310], # underline + 0x7D => 0x2DD, # double acute + 0x7E => [0x7E,0,-350], # ~ + 0x7E => 0x2DC, # \tilde + 0x7F => 0xA8, # \ddot + 0x19 => 0xDF, # sharp S + 0x1A => 0xE6, # ae ligature + 0x1B => 0x153, # oe ligature + 0x1C => 0xF8, # o with slash + 0x1D => 0xC6, # AE ligature + 0x1E => 0x152, # OE ligature + 0x1F => 0xD8, # O with slash + ], +}; + +$map{cmmi10} = { + "Math-Italic" => [ + [0,1] => 0x393, # \Gamma, \Delta + 2 => 0x398, # \Theta + 3 => 0x39B, # \Lambda + 4 => 0x39E, # \Xi + 5 => 0x3A0, # \Pi + 6 => 0x3A3, # \Sigma + [7,8] => 0x3A5, # \Upsilon, \Phi + [9,0xA] => 0x3A8, # \Psi, \Omega + + [0xB,0xE] => 0x3B1, # \alpha, \beta, \gamma, \delta + 0xF => 0x3F5, # \elpsilon + [0x10,0x18] => 0x3B6, # \zeta, \eta, \theta, \iota, \kappa, \lambda, \mu, \nu, \xi + [0x19,0x1A] => 0x3C0, # \pi, \rho + [0x1B,0x1D] => 0x3C3, # \sigma, \tau, \upsilon + 0x1E => 0x3D5, # \phi + [0x1F,0x21] => 0x3C7, # \chi, \psi, \omega + 0x22 => 0x3B5, # \varepsilon + 0x23 => 0x3D1, # \vartheta + 0x24 => 0x3D6, # \varpi + 0x25 => 0x3F1, # \varrho + 0x26 => 0x3C2, # \varsigma + 0x27 => 0x3C6, # \varphi + + [0x30,0x39] => 0x30, # Oldstyle 0-9 + [0x41,0x5A] => 0x41, # A-Z + [0x61,0x7A] => 0x61, # a - z + + 0x6F => 0x3BF, # omicron + 0x7B => 0xE131, # \imath (PUA) + 0x7C => 0xE237, # \jmath (PUA) + ], + + "Main-Regular" => [ + 0x28 => 0x21BC, # \leftharpoonup + 0x29 => 0x21BD, # \leftharpoondown + 0x2A => 0x21C0, # \rightharpoonup + 0x2B => 0x21C1, # \rightharpoondown + + 0x2E => 0x25B9, # \triangleright + 0x2F => 0x25C3, # \triangleleft + + 0x3C => 0x3C, # < + 0x3D => 0x2215, # / + 0x3E => 0x3E, # > + 0x3F => 0x22C6, # \star + 0x40 => 0x2202, # \partial + + [0x5B,0x5D] => 0x266D, # \flat, \natural, \sharp + 0x5E => 0x2323, # \smile + 0x5F => 0x2322, # \frown + 0x60 => 0x2113, # \ell + + 0x7D => 0x2118, # \wp + 0x7E => [0x20D7,-653,0],# \vec + ], +}; + +$map{cmsy10} = { + "Main-Regular" => [ + 0 => 0x2212, # - + 1 => 0x22C5, # \cdot + 2 => 0xD7, # \times + 3 => 0x2217, # \ast + 4 => 0xF7, # \div + 5 => 0x22C4, # \diamond + 6 => 0xB1, # \pm + 7 => 0x2213, # \mp + [8,0xC] => 0x2295, # \oplus, \ominus, \otimes, \oslash, \odot + 0xD => 0x25EF, # \bigcirc + [0xE,0xF] => 0x2218, # \circ, \bullet + + 0x10 => 0x224D, # \asymp + 0x11 => 0x2261, # \equiv + [0x12,0x13] => 0x2286, # \subseteq, \supseteq + [0x14,0x15] => 0x2264, # \leq, \geq + [0x16,0x17] => 0x2AAF, # \preceq, \succeq + 0x18 => 0x223C, # \sim + 0x19 => 0x2248, # \approx + [0x1A,0x1B] => 0x2282, # \subset, \supset + [0x1C,0x1D] => 0x226A, # \ll, \gg + [0x1E,0x1F] => 0x227A, # \prec, \succ + + 0x20 => 0x2190, # \leftarrow + 0x21 => 0x2192, # \rightarrow + 0x22 => 0x2191, # \uparrow + 0x23 => 0x2193, # \downarrow + 0x24 => 0x2194, # \leftrightarrow + 0x25 => 0x2197, # \nearrow + 0x26 => 0x2198, # \searrow + 0x27 => 0x2243, # \simeq + + 0x28 => 0x21D0, # \Leftarrow + 0x29 => 0x21D2, # \Rightarrow + 0x2A => 0x21D1, # \Uparrow + 0x2B => 0x21D3, # \Downarrow + 0x2C => 0x21D4, # \Leftrightarrow + 0x2D => 0x2196, # \nwarrow + 0x2E => 0x2199, # \swarrow + 0x2F => 0x221D, # \propto + + 0x30 => 0x2032, # \prime + 0x31 => 0x221E, # \infty + 0x32 => 0x2208, # \in + 0x33 => 0x220B, # \ni + 0x34 => 0x25B3, # \bigtriangleup and \triangle + 0x35 => 0x25BD, # \bigtriangledown + 0x36 => 0xE020, # \not + + 0x38 => 0x2200, # \forall + 0x39 => 0x2203, # \exists + 0x3A => 0xAC, # \neg + 0x3B => 0x2205, # \emptyset + 0x3C => 0x211C, # \Re + 0x3D => 0x2111, # \Im + 0x3E => 0x22A4, # \top + 0x3F => 0x22A5, # \bot + + 0x40 => 0x2135, # \aleph + + 0x5B => 0x222A, # \cup + 0x5C => 0x2229, # \cap + 0x5D => 0x228E, # \uplus + [0x5E,0x5F] => 0x2227, # \wedge, \vee + + [0x60,0x61] => 0x22A2, # \vdash, \dashv + [0x62,0x63] => 0x230A, # \lfloor, \rfloor + [0x64,0x65] => 0x2308, # \lceil, \rceil + 0x66 => 0x7B, # { + 0x67 => 0x7D, # } + [0x68,0x69] => 0x27E8, # \langle, \rangle + 0x6A => 0x7C, # | + 0x6A => 0x2223, # \vert + 0x6B => 0x2225, # \Vert + 0x6C => 0x2195, # \updownarrow + 0x6D => 0x21D5, # \Updownarrow + 0x6E => 0x5C, # \backslash + 0x6E => 0x2216, # \setminus + 0x6F => 0x2240, # \wr + + 0x70 => [0x221A,0,760], # \surd ### adjust position so font doesn't have a large depth + 0x71 => 0x2A3F, # \amalg + 0x72 => 0x2207, # \nabla + 0x73 => 0x222B, # \int + 0x74 => 0x2294, # \sqcup + 0x75 => 0x2293, # \sqcap + [0x76,0x77] => 0x2291, # \sqsubseteq, \sqsupseteq + 0x78 => 0xA7, # \S + [0x79,0x7A] => 0x2020, # \dagger, \ddagger + 0x7B => 0xB6, # \P + 0x7C => 0x2663, # \clubsuit + 0x7D => 0x2662, # \diamondsuit + 0x7E => 0x2661, # \heartsuit + 0x7F => 0x2660, # \spadesuit + ], + + "Caligraphic-Regular" => [ + [0x41,0x5A] => 0x41, # A-Z + ], +}; + +$map{cmex10} = { + "Size1" => [ + 0 => [0x28,0,810], # ( + 1 => [0x29,0,810], # ) + 2 => [0x5B,0,810], # [ + 3 => [0x5D,0,810], # ] + 4 => [0x230A,0,810], # \lfloor + 5 => [0x230B,0,810], # \rfloor + 6 => [0x2308,0,810], # \lceil + 7 => [0x2309,0,810], # \rceil + 8 => [0x7B,0,810], # { + 9 => [0x7D,0,810], # } + 0xA => [0x27E8,0,810], # \langle + 0xB => [0x27E9,0,810], # \rangle + 0xC => [0x2223,0,606], # \vert + 0xD => [0x2225,0,606], # \Vert + 0xE => [0x2F,0,810], # / + 0xF => [0x5C,0,810], # \ + + 0x46 => [0x2A06,0,750], # \bigsqcup + 0x48 => [0x222E,0,805], # \oint + 0x4A => [0x2A00,0,750], # \bigodot + 0x4C => [0x2A01,0,750], # \bigoplus + 0x4E => [0x2A02,0,750], # \bigotimes + + 0x50 => [0x2211,0,750], # \sum + 0x51 => [0x220F,0,750], # \prod + 0x52 => [0x222B,0,805], # \int + 0x53 => [0x22C3,0,750], # \bigcup + 0x54 => [0x22C2,0,750], # \bigcap + 0x55 => [0x2A04,0,750], # \biguplus + 0x56 => [0x22C0,0,750], # \bigwedge + 0x57 => [0x22C1,0,750], # \bigvee + + 0x60 => [0x2210,0,750], # \coprod + 0x62 => 0x2C6, # \widehat + 0x62 => [0x302,-556,0], # \widehat (combining) + 0x65 => 0x2DC, # \widetilde + 0x65 => [0x303,-556,0], # \widetilde (combining) + + 0x70 => [0x221A,0,810], # surd + 0x3F => [0x23D0,0,601], # arrow extension + 0x77 => [0x2016,0,601], # Arrow extension (non-standard) + 0x78 => [0x2191,0,600], # uparrow top + 0x79 => [0x2193,0,600], # downarrow bottom + 0x7E => [0x21D1,0,600], # Uparrow top + 0x7F => [0x21D3,0,600], # Downarrow bottom + ], + + "Size2" => [ + 0x10 => [0x28,0,1110], # ( + 0x11 => [0x29,0,1110], # ) + 0x2E => [0x2F,0,1110], # / + 0x2F => [0x5C,0,1110], # \ + 0x44 => [0x27E8,0,1110],# \langle + 0x45 => [0x27E9,0,1110],# \rangle + + 0x47 => [0x2A06,0,950], # \bigsqcup + 0x49 => [0x222E,0,1360],# \oint + 0x4B => [0x2A00,0,950], # \bigodot + 0x4D => [0x2A01,0,950], # \bigoplus + 0x4F => [0x2A02,0,950], # \bigotimes + + 0x58 => [0x2211,0,950], # \sum + 0x59 => [0x220F,0,950], # \prod + 0x5A => [0x222B,0,1360],# \int + 0x5B => [0x22C3,0,950], # \bigcup + 0x5C => [0x22C2,0,950], # \bigcap + 0x5D => [0x2A04,0,950], # \biguplus + 0x5E => [0x22C0,0,950], # \bigwedge + 0x5F => [0x22C1,0,950], # \bigvee + 0x61 => [0x2210,0,950], # \coprod + + 0x63 => 0x2C6, # \widehat + 0x63 => [0x302,-1000,0],# \widehat (combining) + 0x66 => 0x2DC, # \widetilde + 0x66 => [0x303,-1000,0],# \widetilde (combining) + + 0x68 => [0x5B,0,1110], # [ + 0x69 => [0x5D,0,1110], # ] + 0x6A => [0x230A,0,1110],# \lfloor + 0x6B => [0x230B,0,1110],# \rfloor + 0x6C => [0x2308,0,1110],# \lceil + 0x6D => [0x2309,0,1110],# \rceil + 0x6E => [0x7B,0,1110], # { + 0x6F => [0x7D,0,1110], # } + 0x71 => [0x221A,0,1110],# surd + ], + + "Size3" => [ + 0x12 => [0x28,0,1410], # ( + 0x13 => [0x29,0,1410], # ) + 0x14 => [0x5B,0,1410], # [ + 0x15 => [0x5D,0,1410], # ] + 0x16 => [0x230A,0,1410],# \lfloor + 0x17 => [0x230B,0,1410],# \rfloor + 0x18 => [0x2308,0,1410],# \lceil + 0x19 => [0x2309,0,1410],# \rceil + 0x1A => [0x7B,0,1410], # { + 0x1B => [0x7D,0,1410], # } + 0x1C => [0x27E8,0,1410],# \langle + 0x1D => [0x27E9,0,1410],# \rangle + 0x1E => [0x2F,0,1410], # / + 0x1F => [0x5C,0,1410], # \ + 0x64 => 0x2C6, # \widehat + 0x64 => [0x302,-1444,0],# \widehat (combining) + 0x67 => 0x2DC, # \widetilde + 0x67 => [0x303,-1444,0],# \widetilde (combining) + 0x72 => [0x221A,0,1410],# surd + ], + + "Size4" => [ + 0x20 => [0x28,0,1710], # ( + 0x21 => [0x29,0,1710], # ) + 0x22 => [0x5B,0,1710], # [ + 0x23 => [0x5D,0,1710], # ] + 0x24 => [0x230A,0,1710],# \lfloor + 0x25 => [0x230B,0,1710],# \rfloor + 0x26 => [0x2308,0,1710],# \lceil + 0x27 => [0x2309,0,1710],# \rceil + 0x28 => [0x7B,0,1710], # { + 0x29 => [0x7D,0,1710], # } + 0x2A => [0x27E8,0,1710],# \langle + 0x2B => [0x27E9,0,1710],# \rangle + 0x2C => [0x2F,0,1710], # / + 0x2D => [0x5C,0,1710], # \ + 0x73 => [0x221A,0,1710],# surd + + 0x30 => [0x239B,0,1115],# left paren upper hook + 0x31 => [0x239E,0,1115],# right paren upper hook + 0x32 => [0x23A1,0,1115],# left square bracket upper corner + 0x33 => [0x23A4,0,1115],# right square bracket upper corner + 0x34 => [0x23A3,0,1115],# left square bracket lower corner + 0x35 => [0x23A6,0,1115],# right square bracket lower hook + 0x36 => [0x23A2,0,601], # left square bracket extension + 0x37 => [0x23A5,0,601], # right square bracket extension + 0x38 => [0x23A7,0,900], # left curly brace upper hook + 0x39 => [0x23AB,0,900], # right curly brace upper hook + 0x3A => 0x23A9, # left curly brace lower hook + 0x3B => 0x23AD, # right curly brace lower hook + 0x3C => [0x23A8,0,1150],# left curly brace middle + 0x3D => [0x23AC,0,1150],# right curly brace middle + 0x3E => [0x23AA,0,300], # curly brace extension + + 0x40 => [0x239D,0,1115],# left paren lower hook + 0x41 => [0x23A0,0,1115],# right paren lower hook + 0x42 => [0x239C,0,600], # left paren extension + 0x43 => [0x239F,0,600], # right paren extension + + 0x74 => [0x23B7,0,915], # radical bottom + 0x75 => [0xE000,0,605], # radical extension (PUA) + 0x76 => [0xE001,0,565], # radical top (PUA) + [0x7A,0x7D] => 0xE150, # \braceld, \bracerd, \bracelu, \braceru (PUA) + ], +}; + +$map{cmti10} = { + "Main-Italic" => [ + [0,1] => 0x393, # \Gamma, \Delta + 2 => 0x398, # \Theta + 3 => 0x39B, # \Lambda + 4 => 0x39E, # \Xi + 5 => 0x3A0, # \Pi + 6 => 0x3A3, # \Sigma + [7,8] => 0x3A5, # \Upsilon, \Phi + [9,0xA] => 0x3A8, # \Psi, \Omega + + 0x12 => 0x2CB, # \grave + 0x13 => 0x2CA, # \acute + 0x14 => 0x2C7, # \check + 0x15 => 0x2D8, # \breve + 0x16 => 0x2C9, # \bar + 0x17 => [0xB0,-160,0], # \degree + 0x17 => 0x02DA, # \r, ring above + 0x18 => 0xB8, # \c, cedilla + + [0x21,0x23] => 0x21, # !, ", #, + 0x22 => 0x201D, # " + [0x25,0x2F] => 0x25, # %, &, ', (, ), *, +, comma, -, ., / + 0x27 => 0x2019, # ' + [0x30,0x39] => 0x30, # 0-9 + [0x3A,0x3B] => 0x3A, # :, ; + 0x3D => 0x3D, # = + [0x3F,0x40] => 0x3F, # ?, @ + [0x41,0x5A] => 0x41, # A-Z + 0x5B => 0x5B, # [ + 0x5C => 0x201C, # `` + [0x5D,0x5E] => 0x5D, # ], ^ + 0x5E => 0x2C6, # \hat + 0x5F => 0x2D9, # \dot + 0x60 => 0x2018, # ` + [0x61,0x7A] => 0x61, # a-z + [0x7B,0x7C] => 0x2013, # \endash, \emdash + 0x7B => [0x5F,0,-310], # underline + 0x7D => 0x2DD, # double acute + 0x7E => [0x7E,0,-350], # ~ + 0x7E => 0x2DC, # \tilde + 0x7F => 0xA8, # \ddot + 0x19 => 0xDF, # sharp S + 0x1A => 0xE6, # ae ligature + 0x1B => 0x153, # oe ligature + 0x1C => 0xF8, # o with slash + 0x1D => 0xC6, # AE ligature + 0x1E => 0x152, # OE ligature + 0x1F => 0xD8, # O with slash + ], + + "Main-Regular" => [ + 0x24 => 0xA3, # pound sign + ], +}; + +$map{cmbx10} = { + "Main-Bold" => [ + [0,1] => 0x393, # \Gamma, \Delta + 2 => 0x398, # \Theta + 3 => 0x39B, # \Lambda + 4 => 0x39E, # \Xi + 5 => 0x3A0, # \Pi + 6 => 0x3A3, # \Sigma + [7,8] => 0x3A5, # \Upsilon, \Phi + [9,0xA] => 0x3A8, # \Psi, \Omega + + 0x10 => 0x131, # \i + 0x11 => 0x237, # \j + 0x12 => 0x2CB, # \grave + 0x13 => 0x2CA, # \acute + 0x14 => 0x2C7, # \check + 0x15 => 0x2D8, # \breve + 0x16 => 0x2C9, # \bar + 0x17 => [0xB0,-147,0], # \degree + 0x17 => 0x02DA, # \r, ring above + 0x18 => 0xB8, # \c, cedilla + + [0x21,0x2F] => 0x21, # !, ", #, $, %, &, ', (, ), *, +, comma, -, ., / + 0x22 => 0x201D, # " + 0x27 => 0x2019, # ' + [0x30,0x39] => 0x30, # 0-9 + [0x3A,0x3B] => 0x3A, # :, ; + 0x3D => 0x3D, # = + [0x3F,0x40] => 0x3F, # ?, @ + [0x41,0x5A] => 0x41, # A-Z + 0x5B => 0x5B, # [ + 0x5C => 0x201C, # `` + [0x5D,0x5E] => 0x5D, # ], ^ + 0x5E => 0x2C6, # \hat + 0x5F => 0x2D9, # \dot + 0x60 => 0x2018, # ` + [0x61,0x7A] => 0x61, # a-z + [0x7B,0x7C] => 0x2013, # \endash, \emdash + 0x7B => [0x5F,0,-310], # underline + 0x7D => 0x2DD, # double acute + 0x7E => [0x7E,0,-350], # ~ + 0x7E => 0x2DC, # \tilde + 0x7F => 0xA8, # \ddot + 0x19 => 0xDF, # sharp S + 0x1A => 0xE6, # ae ligature + 0x1B => 0x153, # oe ligature + 0x1C => 0xF8, # o with slash + 0x1D => 0xC6, # AE ligature + 0x1E => 0x152, # OE ligature + 0x1F => 0xD8, # O with slash + ], +}; + +$map{cmbxti10} = { + "Main-BoldItalic" => [ + [0,1] => 0x393, # \Gamma, \Delta + 2 => 0x398, # \Theta + 3 => 0x39B, # \Lambda + 4 => 0x39E, # \Xi + 5 => 0x3A0, # \Pi + 6 => 0x3A3, # \Sigma + [7,8] => 0x3A5, # \Upsilon, \Phi + [9,0xA] => 0x3A8, # \Psi, \Omega + + 0x10 => 0x131, # \i + 0x11 => 0x237, # \j + 0x12 => 0x2CB, # \grave + 0x13 => 0x2CA, # \acute + 0x14 => 0x2C7, # \check + 0x15 => 0x2D8, # \breve + 0x16 => 0x2C9, # \bar + 0x17 => [0xB0,-160,0], # \degree + 0x17 => 0x02DA, # \r, ring above + 0x18 => 0xB8, # \c, cedilla + + [0x21,0x23] => 0x21, # !, ", #, + 0x22 => 0x201D, # " + [0x25,0x2F] => 0x25, # %, &, ', (, ), *, +, comma, -, ., / + 0x27 => 0x2019, # ' + [0x30,0x39] => 0x30, # 0-9 + [0x3A,0x3B] => 0x3A, # :, ; + 0x3D => 0x3D, # = + [0x3F,0x40] => 0x3F, # ?, @ + [0x41,0x5A] => 0x41, # A-Z + 0x5B => 0x5B, # [ + 0x5C => 0x201C, # `` + [0x5D,0x5E] => 0x5D, # ], ^ + 0x5E => 0x2C6, # \hat + 0x5F => 0x2D9, # \dot + 0x60 => 0x2018, # ` + [0x61,0x7A] => 0x61, # a-z + [0x7B,0x7C] => 0x2013, # \endash, \emdash + 0x7B => [0x5F,0,-310], # underline + 0x7D => 0x2DD, # double acute + 0x7E => [0x7E,0,-350], # ~ + 0x7E => 0x2DC, # \tilde + 0x7F => 0xA8, # \ddot + 0x19 => 0xDF, # sharp S + 0x1A => 0xE6, # ae ligature + 0x1B => 0x153, # oe ligature + 0x1C => 0xF8, # o with slash + 0x1D => 0xC6, # AE ligature + 0x1E => 0x152, # OE ligature + 0x1F => 0xD8, # O with slash + ], + + "Main-Bold" => [ + 0x24 => 0xA3, # pound sign + ], +}; + +$map{cmmib10} = { + "Math-BoldItalic" => [ + [0,1] => 0x393, # \Gamma, \Delta + 2 => 0x398, # \Theta + 3 => 0x39B, # \Lambda + 4 => 0x39E, # \Xi + 5 => 0x3A0, # \Pi + 6 => 0x3A3, # \Sigma + [7,8] => 0x3A5, # \Upsilon, \Phi + [9,0xA] => 0x3A8, # \Psi, \Omega + + [0xB,0xE] => 0x3B1, # \alpha, \beta, \gamma, \delta + 0xF => 0x3F5, # \elpsilon + [0x10,0x18] => 0x3B6, # \zeta, \eta, \theta, \iota, \kappa, \lambda, \mu, \nu, \xi + [0x19,0x1A] => 0x3C0, # \pi, \rho + [0x1B,0x1D] => 0x3C3, # \sigma, \tau, \upsilon + 0x1E => 0x3D5, # \phi + [0x1F,0x21] => 0x3C7, # \chi, \psi, \omega + 0x22 => 0x3B5, # \varepsilon + 0x23 => 0x3D1, # \vartheta + 0x24 => 0x3D6, # \varpi + 0x25 => 0x3F1, # \varrho + 0x26 => 0x3C2, # \varsigma + 0x27 => 0x3C6, # \varphi + + [0x41,0x5A] => 0x41, # A-Z + [0x61,0x7A] => 0x61, # a - z + [0x30,0x39] => 0x30, # Oldstyle 0-9 + + 0x6F => 0x3BF, # omicron + 0x7B => 0xE131, # \imath (PUA) + 0x7C => 0xE237, # \jmath (PUA) + ], + + "Main-Bold" => [ + 0x28 => 0x21BC, # \leftharpoonup + 0x29 => 0x21BD, # \leftharpoondown + 0x2A => 0x21C0, # \rightharpoonup + 0x2B => 0x21C1, # \rightharpoondown + + 0x2E => 0x25B9, # \triangleright + 0x2F => 0x25C3, # \triangleleft + + 0x3C => 0x3C, # < + 0x3D => 0x2215, # / + 0x3E => 0x3E, # > + 0x3F => 0x22C6, # \star + 0x40 => 0x2202, # \partial + + [0x5B,0x5D] => 0x266D, # \flat, \natural, \sharp + 0x5E => 0x2323, # \smile + 0x5F => 0x2322, # \frown + 0x60 => 0x2113, # \ell + 0x68 => 0x210F, # \hbar (bar added below) + + 0x7D => 0x2118, # \wp + 0x7E => [0x20D7,-729,0],# \vec + ], +}; + +$map{cmbsy10} = { + "Main-Bold" => [ + 0 => 0x2212, # - + 1 => 0x22C5, # \cdot + 2 => 0xD7, # \times + 3 => 0x2217, # \ast + 4 => 0xF7, # \div + 5 => 0x22C4, # \diamond + 6 => 0xB1, # \pm + 7 => 0x2213, # \mp + [8,0xC] => 0x2295, # \oplus, \ominus, \otimes, \oslash, \odot + 0xD => 0x25EF, # \bigcirc + [0xE,0xF] => 0x2218, # \circ, \bullet + + 0x10 => 0x224D, # \asymp + 0x11 => 0x2261, # \equiv + [0x12,0x13] => 0x2286, # \subseteq, \supseteq + [0x14,0x15] => 0x2264, # \leq, \geq + [0x16,0x17] => 0x2AAF, # \preceq, \succeq + 0x18 => 0x223C, # \sim + 0x19 => 0x2248, # \approx + [0x1A,0x1B] => 0x2282, # \subset, \supset + [0x1C,0x1D] => 0x226A, # \ll, \gg + [0x1E,0x1F] => 0x227A, # \prec, \succ + + 0x20 => 0x2190, # \leftarrow + 0x21 => 0x2192, # \rightarrow + 0x22 => 0x2191, # \uparrow + 0x23 => 0x2193, # \downarrow + 0x24 => 0x2194, # \leftrightarrow + 0x25 => 0x2197, # \nearrow + 0x26 => 0x2198, # \searrow + 0x27 => 0x2243, # \simeq + + 0x28 => 0x21D0, # \Leftarrow + 0x29 => 0x21D2, # \Rightarrow + 0x2A => 0x21D1, # \Uparrow + 0x2B => 0x21D3, # \Downarrow + 0x2C => 0x21D4, # \Leftrightarrow + 0x2D => 0x2196, # \nwarrow + 0x2E => 0x2199, # \swarrow + 0x2F => 0x221D, # \propto + + 0x30 => 0x2032, # \prime + 0x31 => 0x221E, # \infty + 0x32 => 0x2208, # \in + 0x33 => 0x220B, # \ni + 0x34 => 0x25B3, # \bigtriangleup and \triangle + 0x35 => 0x25BD, # \bigtriangledown + 0x36 => 0xE020, # \not + + 0x38 => 0x2200, # \forall + 0x39 => 0x2203, # \exists + 0x3A => 0xAC, # \neg + 0x3B => 0x2205, # \emptyset + 0x3C => 0x211C, # \Re + 0x3D => 0x2111, # \Im + 0x3E => 0x22A4, # \top + 0x3F => 0x22A5, # \bot + + 0x40 => 0x2135, # \aleph + + 0x5B => 0x222A, # \cup + 0x5C => 0x2229, # \cap + 0x5D => 0x228E, # \uplus + [0x5E,0x5F] => 0x2227, # \wedge, \vee + + [0x60,0x61] => 0x22A2, # \vdash, \dashv + [0x62,0x63] => 0x230A, # \lfloor, \rfloor + [0x64,0x65] => 0x2308, # \lceil, \rceil + 0x66 => 0x7B, # { + 0x67 => 0x7D, # } + [0x68,0x69] => 0x27E8, # \langle, \rangle + 0x6A => 0x7C, # | + 0x6A => 0x2223, # \vert + 0x6B => 0x2225, # \Vert + 0x6C => 0x2195, # \updownarrow + 0x6D => 0x21D5, # \Updownarrow + 0x6E => 0x5C, # \backslash + 0x6E => 0x2216, # \setminus + 0x6F => 0x2240, # \wr + + 0x70 => [0x221A,0,760], # \surd ### adjust position so font doesn't have a large depth + 0x71 => 0x2A3F, # \amalg + 0x72 => 0x2207, # \nabla + 0x73 => 0x222B, # \int + 0x74 => 0x2294, # \sqcup + 0x75 => 0x2293, # \sqcap + [0x76,0x77] => 0x2291, # \sqsubseteq, \sqsupseteq + + [0x79,0x7A] => 0x2020, # \dagger, \ddagger + + 0x7C => 0x2663, # \clubsuit + 0x7D => 0x2662, # \diamondsuit + 0x7E => 0x2661, # \heartsuit + 0x7F => 0x2660, # \spadesuit + ], +}; + +$map{msam10} = { + "Main-Regular" => [ + 0x5C => 0x2220, # \angle + ], + + "Main-Bold" => [ + 0x5C => 0x2220, # \angle (emboldened below) + ], + + "AMS" => [ + 0x00 => 0x22A1, # \boxdot + 0x01 => 0x229E, # \boxplus + 0x02 => 0x22A0, # \boxtimes + 0x03 => 0x25A1, # \square + 0x04 => 0x25A0, # \blacksquare + 0x05 => 0x22C5, # \centerdot + 0x06 => 0x25CA, # \lozenge + 0x07 => 0x29EB, # \blacklozenge + 0x08 => 0x21BB, # \circlearrowright + 0x09 => 0x21BA, # \circlearrowleft + 0x0A => 0x21CC, # \rightleftharpoons + 0x0B => 0x21CB, # \leftrightharpoons + 0x0C => 0x229F, # \boxminus + 0x0D => 0x22A9, # \Vdash + 0x0E => 0x22AA, # \Vvdash + 0x0F => 0x22A8, # \vDash + 0x10 => 0x21A0, # \twoheadrightarrow + 0x11 => 0x219E, # \twoheadleftarrow + 0x12 => 0x21C7, # \leftleftarrows + 0x13 => 0x21C9, # \rightrightarrows + 0x14 => 0x21C8, # \upuparrows + 0x15 => 0x21CA, # \downdownarrows + 0x16 => 0x21BE, # \upharpoonright + 0x17 => 0x21C2, # \downharpoonright + 0x18 => 0x21BF, # \upharpoonleft + 0x19 => 0x21C3, # \downharpoonleft + 0x1A => 0x21A3, # \rightarrowtail + 0x1B => 0x21A2, # \leftarrowtail + 0x1C => 0x21C6, # \leftrightarrows + 0x1D => 0x21C4, # \rightleftarrows + 0x1E => 0x21B0, # \Lsh + 0x1F => 0x21B1, # \Rsh + 0x20 => 0x21DD, # \rightsquigarrow + 0x21 => 0x21AD, # \leftrightsquigarrow + 0x22 => 0x21AB, # \looparrowleft + 0x23 => 0x21AC, # \looparrowright + 0x24 => 0x2257, # \circeq + 0x25 => 0x227F, # \succsim + 0x26 => 0x2273, # \gtrsim + 0x27 => 0x2A86, # \gtrapprox + 0x28 => 0x22B8, # \multimap + 0x29 => 0x2234, # \therefore + 0x2A => 0x2235, # \because + 0x2B => 0x2251, # \doteqdot + 0x2C => 0x225C, # \triangleq + 0x2D => 0x227E, # \precsim + 0x2E => 0x2272, # \lesssim + 0x2F => 0x2A85, # \lessapprox + 0x30 => 0x2A95, # \eqslantless + 0x31 => 0x2A96, # \eqslantgtr + 0x32 => 0x22DE, # \curlyeqprec + 0x33 => 0x22DF, # \curlyeqsucc + 0x34 => 0x227C, # \preccurlyeq + 0x35 => 0x2266, # \leqq + 0x36 => 0x2A7D, # \leqslant + 0x37 => 0x2276, # \lessgtr + 0x38 => 0x2035, # \backprime + 0x39 => 0x2212, # dahsed arrow extension + 0x3A => 0x2253, # \risingdotseq + 0x3B => 0x2252, # \fallingdotseq + 0x3C => 0x227D, # \succcurlyeq + 0x3D => 0x2267, # \geqq + 0x3E => 0x2A7E, # \geqslant + 0x3F => 0x2277, # \gtrless + 0x40 => 0x228F, # \sqsubset + 0x41 => 0x2290, # \sqsupset + 0x42 => 0x22B3, # \vartriangleright + 0x43 => 0x22B2, # \vartriangleleft + 0x44 => 0x22B5, # \trianglerighteq + 0x45 => 0x22B4, # \trianglelefteq + 0x46 => 0x2605, # \bigstar + 0x47 => 0x226C, # \between + 0x48 => 0x25BC, # \blacktriangledown + 0x49 => 0x25B6, # \blacktriangleright + 0x4A => 0x25C0, # \blacktriangleleft + 0x4B => 0x2192, # rightarrow + 0x4C => 0x2190, # leftarrow + 0x4D => 0x25B3, # \vartriangle + 0x4E => 0x25B2, # \blacktriangle + 0x4F => 0x25BD, # \triangledown + 0x50 => 0x2256, # \eqcirc + 0x51 => 0x22DA, # \lesseqgtr + 0x52 => 0x22DB, # \gtreqless + 0x53 => 0x2A8B, # \lesseqqgtr + 0x54 => 0x2A8C, # \gtreqqless + 0x55 => 0x00A5, # yen + 0x56 => 0x21DB, # \Rrightarrow + 0x57 => 0x21DA, # \Lleftarrow + 0x58 => 0x2713, # checkmark + 0x59 => 0x22BB, # \veebar + 0x5A => 0x22BC, # \barwedge + 0x5B => 0x2A5E, # \doublebarwedge + 0x5C => 0x2220, # \angle + 0x5D => 0x2221, # \measuredangle + 0x5E => 0x2222, # \sphericalangle + 0x5F => 0x221D, # \varpropto + 0x60 => 0x2323, # \smallsmile + 0x61 => 0x2322, # \smallfrown + 0x62 => 0x22D0, # \Subset + 0x63 => 0x22D1, # \Supset + 0x64 => 0x22D3, # \Cup + 0x65 => 0x22D2, # \Cap + 0x66 => 0x22CF, # \curlywedge + 0x67 => 0x22CE, # \curlyvee + 0x68 => 0x22CB, # \leftthreetimes + 0x69 => 0x22CC, # \rightthreetimes + 0x6A => 0x2AC5, # \subseteqq + 0x6B => 0x2AC6, # \supseteqq + 0x6C => 0x224F, # \bumpeq + 0x6D => 0x224E, # \Bumpeq + 0x6E => 0x22D8, # \lll + 0x6F => 0x22D9, # \ggg + 0x70 => 0x250C, # \ulcorner + 0x71 => 0x2510, # \urcorner + 0x72 => 0x00AE, # registered sign + 0x73 => 0x24C8, # \circledS + 0x74 => 0x22D4, # \pitchfork + 0x75 => 0x2214, # \dotplus + 0x76 => 0x223D, # \backsim + 0x77 => 0x22CD, # \backsimeq + 0x78 => 0x2514, # \llcorner + 0x79 => 0x2518, # \lrcorner + 0x7A => 0x2720, # maltese cross + 0x7B => 0x2201, # \complement + 0x7C => 0x22BA, # \intercal + 0x7D => 0x229A, # \circledcirc + 0x7E => 0x229B, # \circledast + 0x7F => 0x229D, # \circleddash + ], +}; + +$map{msbm10} = { + "Size4" => [ + 0x5B => 0x2C6, # \widehat + 0x5B => [0x302,-1889,0],# \widehat (combining) + 0x5D => 0x2DC, # \widetilde + 0x5D => [0x303,-1889,0],# \widetilde (combining) + ], + + "Main-Regular" => [ + 0x7E => 0x210F, # \hbar + ], + + "Main-Italic" => [ + 0x7D => 0x210F, # \hbar (with slant) + ], + + "AMS" => [ + 0x00 => 0xE00C, # \lvertneqq + 0x01 => 0xE00D, # \gvertneqq + 0x02 => 0x2270, # \nleq + 0x03 => 0x2271, # \ngeq + 0x04 => 0x226E, # \nless + 0x05 => 0x226F, # \ngtr + 0x06 => 0x2280, # \nprec + 0x07 => 0x2281, # \nsucc + 0x08 => 0x2268, # \lneqq + 0x09 => 0x2269, # \gneqq + 0x0A => 0xE010, # \nleqslant + 0x0B => 0xE00F, # \ngeqslant + 0x0C => 0x2A87, # \lneq + 0x0D => 0x2A88, # \gneq + 0x0E => 0x22E0, # \npreceq + 0x0F => 0x22E1, # \nsucceq + 0x10 => 0x22E8, # \precnsim + 0x11 => 0x22E9, # \succnsim + 0x12 => 0x22E6, # \lnsim + 0x13 => 0x22E7, # \gnsim + 0x14 => 0xE011, # \nleqq + 0x15 => 0xE00E, # \ngeqq + 0x16 => 0x2AB5, # \precneqq + 0x17 => 0x2AB6, # \succneqq + 0x18 => 0x2AB9, # \precnapprox + 0x19 => 0x2ABA, # \succnapprox + 0x1A => 0x2A89, # \lnapprox + 0x1B => 0x2A8A, # \gnapprox + 0x1C => 0x2241, # \nsim + 0x1D => 0x2246, # \ncong + 0x1E => 0x2571, # \diagup + 0x1F => 0x2572, # \diagdown + 0x20 => 0xE01A, # \varsubsetneq + 0x21 => 0xE01B, # \varsupsetneq + 0x22 => 0xE016, # \nsubseteqq + 0x23 => 0xE018, # \nsupseteqq + 0x24 => 0x2ACB, # \subsetneqq + 0x25 => 0x2ACC, # \supsetneqq + 0x26 => 0xE017, # \varsubsetneqq + 0x27 => 0xE019, # \varsupsetneqq + 0x28 => 0x228A, # \subsetneq + 0x29 => 0x228B, # \supsetneq + 0x2A => 0x2288, # \nsubseteq + 0x2B => 0x2289, # \nsupseteq + 0x2C => 0x2226, # \nparallel + 0x2D => 0x2224, # \nmid + 0x2E => 0xE006, # \nshortmid + 0x2F => 0xE007, # \nshortparallel + 0x30 => 0x22AC, # \nvdash + 0x31 => 0x22AE, # \nVdash + 0x32 => 0x22AD, # \nvDash + 0x33 => 0x22AF, # \nVDash + 0x34 => 0x22ED, # \ntrianglerighteq + 0x35 => 0x22EC, # \ntrianglelefteq + 0x36 => 0x22EA, # \ntriangleleft + 0x37 => 0x22EB, # \ntriangleright + 0x38 => 0x219A, # \nleftarrow + 0x39 => 0x219B, # \nrightarrow + 0x3A => 0x21CD, # \nLeftarrow + 0x3B => 0x21CF, # \nRightarrow + 0x3C => 0x21CE, # \nLeftrightarrow + 0x3D => 0x21AE, # \nleftrightarrow + 0x3E => 0x22C7, # \divideontimes + 0x3F => 0x2205, # \varnothing + 0x40 => 0x2204, # \nexists + + [0x41,0x5A] => 0x41, # A-Z + 0x5C => 0x2C6, # \widehat + 0x5C => [0x302,-2333,0],# \widehat (combining) + 0x5E => 0x2DC, # \widetilde + 0x5E => [0x303,-2333,0],# \widetilde (combining) + + 0x60 => 0x2132, # \Finv + 0x61 => 0x2141, # \Game + 0x66 => 0x2127, # \mho + 0x67 => 0x00F0, # \eth + 0x68 => 0x2242, # minus-tilde + 0x69 => 0x2136, # \beth + 0x6A => 0x2137, # \gimel + 0x6B => 0x2138, # \daleth + 0x6C => 0x22D6, # \lessdot + 0x6D => 0x22D7, # \gtrdot + 0x6E => 0x22C9, # \ltimes + 0x6F => 0x22CA, # \rtimes + 0x70 => 0x2223, # \shortmid + 0x71 => 0x2225, # \shortparallel + 0x72 => 0x2216, # \smallsetminus + 0x73 => 0x223C, # \thicksim + 0x74 => 0x2248, # \thickapprox + 0x75 => 0x224A, # \approxeq + 0x76 => 0x2AB8, # \succapprox + 0x77 => 0x2AB7, # \precapprox + 0x78 => 0x21B6, # \curvearrowleft + 0x79 => 0x21B7, # \curvearrowright + 0x7A => 0x03DD, # \digamma + 0x7B => 0x03F0, # \varkappa + 0x7A => 0xE008, # \digamma (non-standard, for IE) + 0x7B => 0xE009, # \varkappa (non-standard, for IE) + 0x7C => 0x006B, # \Bbbk + 0x7D => 0x210F, # \hslash + 0x7E => 0x0127, # \hbar + 0x7F => 0x220D, # \backepsilon + ], +}; + +$map{eufm10} = { + "Fraktur-Regular" => [ + [0,7] => 0xE300, # variants + 0x12 => 0x2018, # left quote + 0x13 => 0x2019, # right quote + 0x21 => 0x21, # ! + [0x26,0x2F] => 0x26, # &, ', (, ), *, +, comma, -, ., / + [0x30,0x39] => 0x30, # 0-9 + [0x3A,0x3B] => 0x3A, # :, ; + 0x3D => 0x3D, # = + 0x3F => 0x3F, # ? + [0x41,0x5A] => 0x41, # A-Z + 0x5B => 0x5B, # [ + [0x5D,0x5E] => 0x5D, # ], ^ + [0x61,0x7A] => 0x61, # a-z + 0x7D => 0x22, # " + ], +}; + +$map{cmtt10} = { + "Typewriter-Regular" => [ + [0,1] => 0x393, # \Gamma, \Delta + 2 => 0x398, # \Theta + 3 => 0x39B, # \Lambda + 4 => 0x39E, # \Xi + 5 => 0x3A0, # \Pi + 6 => 0x3A3, # \Sigma + [7,8] => 0x3A5, # \Upsilon, \Phi + [9,0xA] => 0x3A8, # \Psi, \Omega + 0xD => 0x2032, # ' + + 0x10 => 0x131, # \i + 0x11 => 0x237, # \j + 0x12 => 0x2CB, # \grave + 0x13 => 0x2CA, # \acute + 0x14 => 0x2C7, # \check + 0x15 => 0x2D8, # \breve + 0x16 => 0x2C9, # \bar + 0x17 => 0xB0, # \degree + 0x17 => 0x02DA, # \r, ring above + 0x18 => 0xB8, # \c, cedilla + 0x20 => 0x2423, # graphic representation of space + + [0x21,0x7F] => 0x21, + + 0x27 => 0x2018, # left quote + 0x60 => 0x2019, # right quote + 0x5E => [0x302,-525,0], # \hat (combining) + 0x7E => [0x303,-525,0], # \tilde (combining) + 0x7F => [0x308,-525,0], # \ddot (combining) + ], +}; + +$map{rsfs10} = { + "Script-Regular" => [ + [0x41,0x5A] => 0x41, # A-Z + ], +}; + +$map{cmssbx10} = { + "SansSerif-Bold" => [ + [0,1] => 0x393, # \Gamma, \Delta + 2 => 0x398, # \Theta + 3 => 0x39B, # \Lambda + 4 => 0x39E, # \Xi + 5 => 0x3A0, # \Pi + 6 => 0x3A3, # \Sigma + [7,8] => 0x3A5, # \Upsilon, \Phi + [9,0xA] => 0x3A8, # \Psi, \Omega + + 0x10 => 0x131, # \i + 0x11 => 0x237, # \j + 0x13 => 0xB4, # \acute + 0x14 => 0x2C7, # \check + 0x15 => 0x2D8, # \breve + 0x16 => 0x2C9, # \bar + 0x17 => [0xB0,-58,0], # \degree + 0x17 => 0x02DA, # \r, ring above + 0x18 => 0xB8, # \c, cedilla + + [0x21,0x2F] => 0x21, # !, ", #, $, %, &, ', (, ), *, +, comma, -, ., / + 0x22 => 0x201D, # " + 0x27 => 0x2019, # ' + [0x30,0x39] => 0x30, # 0-9 + [0x3A,0x3B] => 0x3A, # :, ; + 0x3D => 0x3D, # = + [0x3F,0x40] => 0x3F, # ?, @ + [0x41,0x5A] => 0x41, # A-Z + 0x5B => 0x5B, # [ + 0x5C => 0x201C, # `` + [0x5D,0x5E] => 0x5D, # ], ^ + 0x5E => 0x2C6, # \hat + 0x5F => 0x2D9, # \dot + 0x60 => 0x2018, # ` + [0x61,0x7A] => 0x61, # a-z + [0x7B,0x7C] => 0x2013, # \endash, \emdash + 0x7B => [0x5F,0,-350], # underline + 0x7D => 0x2DD, # double acute + 0x7E => [0x7E,0,-350], # ~ + 0x7E => 0x2DC, # \tilde + 0x7F => 0xA8, # \ddot + ], +}; + +$map{cmss10} = { + "SansSerif-Regular" => [ + [0,1] => 0x393, # \Gamma, \Delta + 2 => 0x398, # \Theta + 3 => 0x39B, # \Lambda + 4 => 0x39E, # \Xi + 5 => 0x3A0, # \Pi + 6 => 0x3A3, # \Sigma + [7,8] => 0x3A5, # \Upsilon, \Phi + [9,0xA] => 0x3A8, # \Psi, \Omega + + 0x10 => 0x131, # \i + 0x11 => 0x237, # \j + 0x12 => 0x2CB, # \grave + 0x13 => 0x2CA, # \acute + 0x14 => 0x2C7, # \check + 0x15 => 0x2D8, # \breve + 0x16 => 0x2C9, # \bar + 0x17 => [0xB0,-142,0], # \degree + 0x17 => 0x02DA, # \r, ring above + 0x18 => 0xB8, # \c, cedilla + + [0x21,0x2F] => 0x21, # !, ", #, $, %, &, ', (, ), *, +, comma, -, ., / + 0x22 => 0x201D, # " + 0x27 => 0x2019, # ' + [0x30,0x39] => 0x30, # 0-9 + [0x3A,0x3B] => 0x3A, # :, ; + 0x3D => 0x3D, # = + [0x3F,0x40] => 0x3F, # ?, @ + [0x41,0x5A] => 0x41, # A-Z + 0x5B => 0x5B, # [ + 0x5C => 0x201C, # `` + [0x5D,0x5E] => 0x5D, # ], ^ + 0x5E => 0x2C6, # \hat + 0x5F => 0x2D9, # \dot + 0x60 => 0x2018, # ` + [0x61,0x7A] => 0x61, # a-z + [0x7B,0x7C] => 0x2013, # \endash, \emdash + 0x7B => [0x5F,0,-350], # underline + 0x7D => 0x2DD, # double acute + 0x7E => [0x7E,0,-350], # ~ + 0x7E => 0x2DC, # \tilde + 0x7F => 0xA8, # \ddot + ], +}; + +$map{cmssi10} = { + "SansSerif-Italic" => [ + [0,1] => 0x393, # \Gamma, \Delta + 2 => 0x398, # \Theta + 3 => 0x39B, # \Lambda + 4 => 0x39E, # \Xi + 5 => 0x3A0, # \Pi + 6 => 0x3A3, # \Sigma + [7,8] => 0x3A5, # \Upsilon, \Phi + [9,0xA] => 0x3A8, # \Psi, \Omega + + 0x10 => 0x131, # \i + 0x11 => 0x237, # \j + 0x12 => 0x2CB, # \grave + 0x13 => 0x2CA, # \acute + 0x14 => 0x2C7, # \check + 0x15 => 0x2D8, # \breve + 0x16 => 0x2C9, # \bar + 0x17 => [0xB0,-113,0], # \degree + 0x17 => 0x02DA, # \r, ring above + 0x18 => 0xB8, # \c, cedilla + + [0x21,0x2F] => 0x21, # !, ", #, $, %, &, ', (, ), *, +, comma, -, ., / + 0x22 => 0x201D, # " + 0x27 => 0x2019, # ' + [0x30,0x39] => 0x30, # 0-9 + [0x3A,0x3B] => 0x3A, # :, ; + 0x3D => 0x3D, # = + [0x3F,0x40] => 0x3F, # ?, @ + [0x41,0x5A] => 0x41, # A-Z + 0x5B => 0x5B, # [ + 0x5C => 0x201C, # `` + [0x5D,0x5E] => 0x5D, # ], ^ + 0x5E => 0x2C6, # \hat + 0x5F => 0x2D9, # \dot + 0x60 => 0x2018, # ` + [0x61,0x7A] => 0x61, # a-z + [0x7B,0x7C] => 0x2013, # \endash, \emdash + 0x7B => [0x5F,0,-350], # underline + 0x7D => 0x2DD, # double acute + 0x7E => [0x7E,0,-350], # ~ + 0x7E => 0x2DC, # \tilde + 0x7F => 0xA8, # \ddot + ], +}; + +foreach $cmfont (keys %map) { + foreach $mjfont (keys %{$map{$cmfont}}) { + $style = $mjfont; $style =~ s/.*?(-|$)//; $style = "Regular" unless $style; + $family = $mjfont; $family =~ s/-.*//; + $fontname = "$family-$style"; + @{$reverse{$fontname}{$cmfont}} = @{$map{$cmfont}{$mjfont}}; + } +} + +my %output; + +sub add_to_output { + my ($mjfont,$cmfont,$from,$to) = @_; + + my $xshift = 0, $yshift = 0; + + if (ref($to) eq "ARRAY") { + $xshift = $to->[1]; + $yshift = $to->[2]; + $to = $to->[0]; + } + + $data = { + "font" => $cmfont, + "char" => $from, + "xshift" => $xshift, + "yshift" => $yshift + }; + + if (defined($output{$mjfont}{$to})) { + print STDERR "Duplicate mapping $to for $mjfont: " . + $output{$mjfont}{$to}{font} . ":" . + $output{$mjfont}{$to}{char} . " vs. $cmfont:$from\n"; + die "Duplicate mapping!"; # disable this line to see all of them + } + $output{$mjfont}{$to} = $data; +} + +foreach $mjfont (keys %reverse) { + foreach $cmfont (keys %{$reverse{$mjfont}}) { + @remap = @{$reverse{$mjfont}{$cmfont}}; + while (defined($item = shift(@remap))) { + $remap = shift(@remap); + + if (ref($item) eq "ARRAY") { + foreach $from ($item->[0]...$item->[1]) { + $to = $from - $item->[0] + $remap; + add_to_output($mjfont, $cmfont, $from, $to); + } + } else { + add_to_output($mjfont, $cmfont, $item, $remap); + } + } + } +} + +print(encode_json(\%output)); diff --git a/src/metrics/parse_tfm.py b/src/metrics/parse_tfm.py new file mode 100644 index 00000000..56f2db08 --- /dev/null +++ b/src/metrics/parse_tfm.py @@ -0,0 +1,211 @@ +class CharInfoWord(object): + def __init__(self, word): + b1, b2, b3, b4 = (word >> 24, + (word & 0xff0000) >> 16, + (word & 0xff00) >> 8, + word & 0xff) + + self.width_index = b1 + self.height_index = b2 >> 4 + self.depth_index = b2 & 0x0f + self.italic_index = (b3 & 0b11111100) >> 2 + self.tag = b3 & 0b11 + self.remainder = b4 + + def has_ligkern(self): + return self.tag == 1 + + def ligkern_start(self): + return self.remainder + + +class LigKernProgram(object): + def __init__(self, program): + self.program = program + + def execute(self, start, next_char): + curr_instruction = start + while True: + instruction = self.program[curr_instruction] + (skip, inst_next_char, op, remainder) = instruction + + if inst_next_char == next_char: + if op < 128: + # Don't worry about ligatures for now, we only need kerns + return None + else: + return 256 * (op - 128) + remainder + elif skip >= 128: + return None + else: + curr_instruction += 1 + skip + + +class TfmCharMetrics(object): + def __init__(self, width, height, depth, italic, kern_table): + self.width = width + self.height = height + self.depth = depth + self.italic_correction = italic + self.kern_table = kern_table + + +class TfmFile(object): + def __init__(self, start_char, end_char, char_info, width_table, + height_table, depth_table, italic_table, ligkern_table, + kern_table): + self.start_char = start_char + self.end_char = end_char + self.char_info = char_info + self.width_table = width_table + self.height_table = height_table + self.depth_table = depth_table + self.italic_table = italic_table + self.ligkern_program = LigKernProgram(ligkern_table) + self.kern_table = kern_table + + def get_char_metrics(self, char_num, fix_rsfs=False): + """Return glyph metrics for a unicode code point. + + Arguments: + char_num: a unicode code point + fix_rsfs: adjust for rsfs10.tfm's different indexing system + """ + if char_num < self.start_char or char_num > self.end_char: + raise RuntimeError("Invalid character number") + + if fix_rsfs: + # all of the char_nums contained start from zero in rsfs10.tfm + info = self.char_info[char_num - self.start_char] + else: + info = self.char_info[char_num + self.start_char] + + char_kern_table = {} + if info.has_ligkern(): + for char in range(self.start_char, self.end_char + 1): + kern = self.ligkern_program.execute(info.ligkern_start(), char) + if kern: + char_kern_table[char] = self.kern_table[kern] + + return TfmCharMetrics( + self.width_table[info.width_index], + self.height_table[info.height_index], + self.depth_table[info.depth_index], + self.italic_table[info.italic_index], + char_kern_table) + + +class TfmReader(object): + def __init__(self, f): + self.f = f + + def read_byte(self): + return ord(self.f.read(1)) + + def read_halfword(self): + b1 = self.read_byte() + b2 = self.read_byte() + return (b1 << 8) | b2 + + def read_word(self): + b1 = self.read_byte() + b2 = self.read_byte() + b3 = self.read_byte() + b4 = self.read_byte() + return (b1 << 24) | (b2 << 16) | (b3 << 8) | b4 + + def read_fixword(self): + word = self.read_word() + + neg = False + if word & 0x80000000: + neg = True + word = (-word & 0xffffffff) + + return (-1 if neg else 1) * word / float(1 << 20) + + def read_bcpl(self, length): + str_length = self.read_byte() + data = self.f.read(length - 1) + return data[:str_length] + + +def read_tfm_file(file_name): + with open(file_name, 'rb') as f: + reader = TfmReader(f) + + # file_size + reader.read_halfword() + header_size = reader.read_halfword() + + start_char = reader.read_halfword() + end_char = reader.read_halfword() + + width_table_size = reader.read_halfword() + height_table_size = reader.read_halfword() + depth_table_size = reader.read_halfword() + italic_table_size = reader.read_halfword() + + ligkern_table_size = reader.read_halfword() + kern_table_size = reader.read_halfword() + + # extensible_table_size + reader.read_halfword() + # parameter_table_size + reader.read_halfword() + + # checksum + reader.read_word() + # design_size + reader.read_fixword() + + if header_size > 2: + # coding_scheme + reader.read_bcpl(40) + + if header_size > 12: + # font_family + reader.read_bcpl(20) + + for i in range(header_size - 17): + reader.read_word() + + char_info = [] + for i in range(start_char, end_char + 1): + char_info.append(CharInfoWord(reader.read_word())) + + width_table = [] + for i in range(width_table_size): + width_table.append(reader.read_fixword()) + + height_table = [] + for i in range(height_table_size): + height_table.append(reader.read_fixword()) + + depth_table = [] + for i in range(depth_table_size): + depth_table.append(reader.read_fixword()) + + italic_table = [] + for i in range(italic_table_size): + italic_table.append(reader.read_fixword()) + + ligkern_table = [] + for i in range(ligkern_table_size): + skip = reader.read_byte() + next_char = reader.read_byte() + op = reader.read_byte() + remainder = reader.read_byte() + + ligkern_table.append((skip, next_char, op, remainder)) + + kern_table = [] + for i in range(kern_table_size): + kern_table.append(reader.read_fixword()) + + # There is more information, like the ligkern, kern, extensible, and + # param table, but we don't need these for now + + return TfmFile(start_char, end_char, char_info, width_table, + height_table, depth_table, italic_table, + ligkern_table, kern_table) diff --git a/submodules/katex-fonts b/submodules/katex-fonts deleted file mode 160000 index 56e79c93..00000000 --- a/submodules/katex-fonts +++ /dev/null @@ -1 +0,0 @@ -Subproject commit 56e79c93c88c9054b017cc92e496b383e0bf82d7 diff --git a/wallaby.js b/wallaby.js index 6b7c5d75..02fbfda9 100644 --- a/wallaby.js +++ b/wallaby.js @@ -15,7 +15,6 @@ module.exports = function(wallaby) { "src/**/*.js", "test/**/*.js", "contrib/**/*.js", - "submodules/**/*.js", "katex.js", // These paths are excluded.