Repository: mgreminger/EngineeringPaper.xyz
Branch: main
Commit: 7d3bb8bcdf26
Files: 228
Total size: 19.7 MB
Directory structure:
gitextract_l2a2pt1h/
├── .dev.vars
├── .gitattributes
├── .github/
│ ├── pull_request_template.md
│ └── workflows/
│ └── playwright.yml
├── .gitignore
├── .node-version
├── CONTRIBUTING.md
├── LICENSE
├── README.md
├── index.html
├── notebooks/
│ ├── HA_parameters.csv
│ ├── HA_parameters_order.csv
│ ├── coolprop_options.ipynb
│ ├── coolprop_predifined_mixtures.ipynb
│ ├── latex_unicode_equivalents.ipynb
│ ├── predefined_mixtures.json
│ ├── propsSI_fluids.csv
│ ├── propsSI_mixtures.csv
│ ├── propsSI_parameters.csv
│ ├── propsSI_parameters_order.csv
│ ├── reserved_ids.ipynb
│ ├── reserved_ids_no_sympy.ipynb
│ └── sympy_test.ipynb
├── package.json
├── playwright.config.mjs
├── public/
│ ├── .well-known/
│ │ └── assetlinks.json
│ ├── _routes.json
│ ├── dimensional_analysis.py
│ ├── iframe_test.html
│ ├── jedi_code_analysis.py
│ ├── manifest.json
│ ├── pyodide/
│ │ ├── contourpy-1.3.1-cp313-cp313-pyodide_2025_0_wasm32.whl
│ │ ├── coolprop-7.2.0-cp313-cp313-pyodide_2025_0_wasm32.whl
│ │ ├── cycler-0.12.1-cp313-none-any.whl
│ │ ├── drawsvg-2.4.1-cp313-none-any.whl
│ │ ├── fonttools-4.56.0-cp313-none-any.whl
│ │ ├── jedi-0.19.2-cp313-none-any.whl
│ │ ├── jinja2-3.1.6-cp313-none-any.whl
│ │ ├── joblib-1.4.2-cp313-none-any.whl
│ │ ├── kiwisolver-1.4.8-cp313-cp313-pyodide_2025_0_wasm32.whl
│ │ ├── markupsafe-3.0.2-cp313-cp313-pyodide_2025_0_wasm32.whl
│ │ ├── matplotlib-3.8.4-cp313-cp313-pyodide_2025_0_wasm32.whl
│ │ ├── mpmath-1.3.0-cp313-none-any.whl
│ │ ├── nlopt-2.9.1-cp313-cp313-pyodide_2025_0_wasm32.whl
│ │ ├── numpy-2.2.5-cp313-cp313-pyodide_2025_0_wasm32.whl
│ │ ├── packaging-24.2-cp313-none-any.whl
│ │ ├── pandas-2.3.3-cp313-cp313-pyodide_2025_0_wasm32.whl
│ │ ├── parso-0.8.4-cp313-none-any.whl
│ │ ├── pillow-11.3.0-cp313-cp313-pyodide_2025_0_wasm32.whl
│ │ ├── pyodide-lock.json
│ │ ├── pyodide.asm.js
│ │ ├── pyodide.asm.wasm
│ │ ├── pyodide.js
│ │ ├── pyparsing-3.2.1-cp313-none-any.whl
│ │ ├── python_dateutil-2.9.0.post0-cp313-none-any.whl
│ │ ├── pytz-2025.2-cp313-none-any.whl
│ │ ├── rich-13.9.4-cp313-none-any.whl
│ │ ├── scikit_learn-1.7.0-cp313-cp313-pyodide_2025_0_wasm32.whl
│ │ ├── scipy-1.14.1-cp313-cp313-pyodide_2025_0_wasm32.whl
│ │ ├── six-1.17.0-cp313-none-any.whl
│ │ ├── sympy-1.13.3-cp313-none-any.whl
│ │ └── threadpoolctl-3.5.0-cp313-none-any.whl
│ └── robots.txt
├── scripts/
│ ├── generate-parser.js
│ ├── get_pyodide_files.py
│ └── setupTypeScript.js
├── src/
│ ├── App.svelte
│ ├── BaseUnitsConfigDialog.svelte
│ ├── ButtonBar.svelte
│ ├── Cell.svelte
│ ├── CellList.svelte
│ ├── CodeCell.svelte
│ ├── CodeEditor.svelte
│ ├── CustomMatrixModal.svelte
│ ├── DataTableCell.svelte
│ ├── DataTableInput.svelte
│ ├── DeletedCell.svelte
│ ├── DocumentTitle.svelte
│ ├── DocumentationCell.svelte
│ ├── DocumentationField.svelte
│ ├── DownloadDocumentModal.svelte
│ ├── DropOverlay.svelte
│ ├── FluidCell.svelte
│ ├── GenerateCodeDialog.svelte
│ ├── IconButton.svelte
│ ├── InsertCell.svelte
│ ├── InsertSheetModal.svelte
│ ├── KeyboardButton.svelte
│ ├── KeyboardShortcuts.svelte
│ ├── MathCell.svelte
│ ├── MathCellConfigDialog.svelte
│ ├── MathField.svelte
│ ├── NumberFormatOptionsDialog.svelte
│ ├── PiecewiseCell.svelte
│ ├── Plot.svelte
│ ├── PlotCell.svelte
│ ├── RequestPersistentStorage.svelte
│ ├── SetDefaultConfigDialog.svelte
│ ├── SystemCell.svelte
│ ├── TableCell.svelte
│ ├── Terms.svelte
│ ├── TextBox.svelte
│ ├── TextButton.svelte
│ ├── TextCheckbox.svelte
│ ├── UnitsDocumentation.svelte
│ ├── UpdateAvailable.svelte
│ ├── Updates.svelte
│ ├── VirtualKeyboard.svelte
│ ├── carbon-theme.scss
│ ├── cells/
│ │ ├── BaseCell.ts
│ │ ├── Cells.ts
│ │ ├── CodeCell.svelte.ts
│ │ ├── DataTableCell.svelte.ts
│ │ ├── DeletedCell.ts
│ │ ├── DocumentationCell.svelte.ts
│ │ ├── FluidCell.svelte.ts
│ │ ├── InsertCell.ts
│ │ ├── MathCell.svelte.ts
│ │ ├── MathField.svelte.ts
│ │ ├── PiecewiseCell.svelte.ts
│ │ ├── PlotCell.svelte.ts
│ │ ├── SystemCell.svelte.ts
│ │ └── TableCell.svelte.ts
│ ├── constants.ts
│ ├── customPlotButtonIcons.ts
│ ├── database/
│ │ ├── _worker.ts
│ │ ├── scripts/
│ │ │ ├── initialize.sql
│ │ │ ├── sheets_used_for_tests.json
│ │ │ └── transfer_sheets.js
│ │ ├── tsconfig.json
│ │ ├── types.ts
│ │ └── utility.ts
│ ├── fluidConstants.ts
│ ├── global.css
│ ├── global.d.ts
│ ├── jediWorker.ts
│ ├── jediWrapper.ts
│ ├── keyboard/
│ │ └── Keyboard.svelte.ts
│ ├── main.js
│ ├── parser/
│ │ ├── LatexIdFragments.g4
│ │ ├── LatexLexer.g4
│ │ ├── LatexLexer.ts
│ │ ├── LatexParser.g4
│ │ ├── LatexParser.ts
│ │ ├── LatexParserVisitor.ts
│ │ ├── LatexToSympy.ts
│ │ ├── constants.ts
│ │ ├── parserWorker.ts
│ │ ├── parserWrapper.ts
│ │ ├── types.ts
│ │ └── utility.ts
│ ├── pyodide-info.json
│ ├── pyodideWorker.ts
│ ├── resultTypes.ts
│ ├── sheet/
│ │ └── Sheet.ts
│ ├── stores.svelte.ts
│ ├── types.ts
│ └── utility.ts
├── svelte.config.js
├── tests/
│ ├── seed-data.json
│ ├── spreadsheets/
│ │ ├── bottle_data.csv
│ │ ├── headers_and_units.csv
│ │ ├── headers_and_units.xlsx
│ │ ├── headers_no_units.xlsx
│ │ ├── interpolation_autosort.csv
│ │ ├── interpolation_repeated_input.csv
│ │ ├── multivariable_interpolation_no_units.xlsx
│ │ ├── multivariable_interpolation_units_large_scale.xlsx
│ │ ├── multivariable_interpolation_units_small_scale.xlsx
│ │ ├── no_headers.xlsx
│ │ ├── plane_interpolation_no_units.csv
│ │ ├── plane_interpolation_with_units_large_scale.csv
│ │ ├── plane_interpolation_with_units_small_scale.csv
│ │ └── polyfit_symbolic.xlsx
│ ├── test_advanced_assignments.spec.mjs
│ ├── test_advanced_var_names.spec.mjs
│ ├── test_basic.spec.mjs
│ ├── test_calc.spec.mjs
│ ├── test_checkpoints.spec.mjs
│ ├── test_code_cell.spec.mjs
│ ├── test_code_cell_rendering.spec.mjs
│ ├── test_complex.spec.mjs
│ ├── test_context_menu.spec.mjs
│ ├── test_csv_export_reference_data_table_format.csv
│ ├── test_custom_base_units.spec.mjs
│ ├── test_data_table.spec.mjs
│ ├── test_database.spec.mjs
│ ├── test_ep_custom_units.spec.mjs
│ ├── test_file_save_open.spec.mjs
│ ├── test_fluid_properties.spec.mjs
│ ├── test_functions.spec.mjs
│ ├── test_generated_code.spec.mjs
│ ├── test_iframe.spec.mjs
│ ├── test_insert_sheet.spec.mjs
│ ├── test_keyboard_shortcuts.spec.mjs
│ ├── test_latex_scientific_notation.spec.mjs
│ ├── test_matrix_addition.spec.mjs
│ ├── test_matrix_calc.spec.mjs
│ ├── test_matrix_determinant.spec.mjs
│ ├── test_matrix_functions.spec.mjs
│ ├── test_matrix_indexing_and_assembling.spec.mjs
│ ├── test_matrix_inverse.spec.mjs
│ ├── test_matrix_keyboard.spec.mjs
│ ├── test_matrix_multiplication.spec.mjs
│ ├── test_matrix_transpose.spec.mjs
│ ├── test_md_export.epxyz
│ ├── test_md_export_reference.md
│ ├── test_md_export_reference_centered.md
│ ├── test_md_export_reference_data_table_format.md
│ ├── test_number_format.spec.mjs
│ ├── test_parse_id_bug.spec.mjs
│ ├── test_piecewise_cell.spec.mjs
│ ├── test_plotting.spec.mjs
│ ├── test_sheet.epxyz
│ ├── test_sheet_long_calculation.epxyz
│ ├── test_sheet_parsing_error.epxyz
│ ├── test_sheet_slow_simplify.epxyz
│ ├── test_sheet_with_results.epxyz
│ ├── test_sheet_with_wrong_result.epxyz
│ ├── test_single_char_scripts.spec.mjs
│ ├── test_sum_and_prod.spec.mjs
│ ├── test_symbolic_expression_error_handling.spec.mjs
│ ├── test_syntax_error_messages.spec.mjs
│ ├── test_system_solve.spec.mjs
│ ├── test_table_cell.spec.mjs
│ └── utility.mjs
├── tsconfig.json
└── vite.config.js
================================================
FILE CONTENTS
================================================
================================================
FILE: .dev.vars
================================================
DOCGEN_API=http://127.0.0.1:8000
DEV=1
================================================
FILE: .gitattributes
================================================
tests/** linguist-vendored
public/pyodide/** linguist-vendored
================================================
FILE: .github/pull_request_template.md
================================================
### Related Issue
Read the [contributing guide](https://github.com/mgreminger/EngineeringPaper.xyz/blob/main/CONTRIBUTING.md#contributing) before submitting a pull request. Outside pull requests must be proceeded by creating a [GitHub issue](https://github.com/mgreminger/EngineeringPaper.xyz/issues) to discuss the proposed changes.
Please indicate the issue number that this pull request relates to here:
### Description of Pull Request
Describe your pull request here:
### DCO Signoff
By creating this pull request, I agree that any code that I have submitted, or will
submit, to this pull request, satisfies this [Developer Certificate of Origin](https://developercertificate.org/).
Additionally, all other contributers to this pull request implicitly agree that their contributions satisfy the
[Developer Certificate of Origin](https://developercertificate.org/) by the act of contributing to this pull request.
================================================
FILE: .github/workflows/playwright.yml
================================================
name: Playwright Tests
on:
push:
branches: [ main, master ]
pull_request:
branches: [ main, master ]
jobs:
test:
timeout-minutes: 60
runs-on: ubuntu-24.04
strategy:
fail-fast: false
matrix:
shardIndex: [1, 2, 3, 4]
shardTotal: [4]
steps:
- uses: actions/checkout@v3
- uses: actions/setup-node@v3
with:
node-version: '22.x'
cache: 'npm'
- name: Install dependencies
run: npm ci
- name: Build site
run: npm run build
- name: Seed KV Stores
run: npm run test:seed
- name: Install Playwright
run: npx playwright install chromium firefox --with-deps
- name: Run Playwright tests
run: npm run test -- --shard=${{ matrix.shardIndex }}/${{ matrix.shardTotal }} --reporter=blob
- uses: actions/upload-artifact@v4
if: always()
with:
name: screenshots-${{ matrix.shardIndex }}
path: tests/images/*.png
retention-days: 10
- uses: actions/upload-artifact@v4
if: always()
with:
name: blob-report-${{ matrix.shardIndex }}
path: blob-report/
retention-days: 5
merge-reports:
if: always()
needs: [test]
runs-on: ubuntu-24.04
steps:
- uses: actions/checkout@v3
- uses: actions/setup-node@v3
with:
node-version: '22.x'
cache: 'npm'
- name: Install dependencies
run: npm ci
# --- SCREENSHOT MERGING ---
- name: Download all screenshots
uses: actions/download-artifact@v4
with:
pattern: screenshots-*
path: combined-screenshots
merge-multiple: true
- name: Upload unified screenshots artifact
uses: actions/upload-artifact@v4
with:
name: all-screenshots
path: combined-screenshots
retention-days: 10
# --- HTML REPORT MERGING ---
- name: Download all blob reports
uses: actions/download-artifact@v4
with:
pattern: blob-report-*
path: all-blob-reports
merge-multiple: true
# Playwright compiles the blobs into a unified HTML report
- name: Merge into HTML Report
run: npx playwright merge-reports --reporter=html ./all-blob-reports
- name: Upload unified HTML report
uses: actions/upload-artifact@v4
if: always()
with:
name: playwright-report
path: playwright-report/
retention-days: 10
================================================
FILE: .gitignore
================================================
.DS_store
node_modules
public/build
public/fonts
.antlr
*.tokens
*.interp
.ipynb_checkpoints
dist
.vscode/settings.json
tests/images/*screenshot*.png
tests/images/*_diff.png
test-results/
playwright-report/
public/_worker.js
src/database/_worker.js
src/database/utility.js
.wrangler/
public/parser/parserWorker.js
public/pyodideWorker.js
public/jediWorker.js
wrangler.toml
public/serviceworker.js
public/serviceworker.js.map
*.csv#
================================================
FILE: .node-version
================================================
22
================================================
FILE: CONTRIBUTING.md
================================================
## Get the Word Out
The easiest way to contribute to EngineeringPaper.xyz is to get the word out. A large and vibrant user community are critical to justify continued efforts to develop this open source software. The easiest ways to contribute are to like and subscribe to the official [YouTube channel](https://www.youtube.com/channel/UCaFxwEznNUfJagZ1Xi6Rh2A), participate in the official [Reddit Community](https://www.reddit.com/r/EngineeringPaperXYZ/), or rate the app in the [Windows store](https://apps.microsoft.com/store/detail/engineeringpaperxyz/9N1W74WC2X2M). User generated tutorials or videos are also welcome.
## Reporting Bugs or Requesting Features
To report issues or bugs, or to request new features, file a
[GitHub issue](https://github.com/mgreminger/EngineeringPaper.xyz/issues) or use the
[official EngineeringPaper.xyz subreddit](https://www.reddit.com/r/EngineeringPaperXYZ/). If you prefer email, bugs or feature
requests can be submitted to [support@EngineeringpPaper.xyz](mailto:support@engineeringpaper.xyz).
## Contributing
Since the [live EngineeringPaper.xyz](https://engineeringpaper.xyz) site is deployed from this repository's main branch, careful consideration is required before
adding new features. Becuase of this, a [GitHub issue](https://github.com/mgreminger/EngineeringPaper.xyz/issues) must be created to discuss a potential new feature before an external pull request
will be considered. Keep the following in mind when considering the implementation of new features:
* All features must work in Chrome, Safari, and Firefox
* All features must be usable on both desktop and mobile
* All features must format properly when printing a sheet using the browser's file print command
* All existing tests must pass (sometimes updates to old tests will be needed, depending on the feature) and any new features will most likely need new tests
* Ease of use and robustness of EngineeringPaper.xyz are top priorities, any new feature that makes EngineeringPaper.xyz more complicated to use will require careful consideration and may not be accepted
* It must always be possible to read old sheets created in previous versions of EngineeringPaper.xyz (on rare occasions, users may need to update their sheets but there can be no data loss)
* New features that require large javascript dependencies will most likely not be accepted (EngineeringPaper.xyz is already large because of its dependency on Pyodide, every effort will be made to limit bundle size growth)
Because of the limitations inherent to a repository tied to a running site, you may want to consider hosting your own fork of EngineeringPaper.xyz if you
want to run experimental features that are not accepted to the main EngineeringPaper.xyz repository. EngineeringPaper.xyz can be easily deployed as a
Coudflare Pages project (including the database back-end through the Pages Functions capability). It can be deployed using Cloudflare's
free tier.
Any contributors to this repository must confirm that their contributions satisfy the [Developer Certificate of Origin](https://developercertificate.org/).
## Setting up a Development Environment
See these instructions covering [setting up an EngineeringPaper.xyz development environment](https://github.com/mgreminger/EngineeringPaper.xyz#build-instructions).
================================================
FILE: LICENSE
================================================
Copyright 2020-25 Michael Greminger
Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
================================================
FILE: README.md
================================================
# [](https://engineeringpaper.xyz)
EngineeringPaper.xyz is a web app for engineering calculations that handles unit conversion/checking automatically and also supports plotting, solving systems of equations, and documenting your calculations (see the [official blog](https://blog.engineeringpaper.xyz) for many examples). It's easy to share your calculations by creating a [shareable link](https://engineeringpaper.xyz/oMbWLXMZ6ChQ3g3ZxRbJQD) that anyone can open and build off of. Additionaly, you can save and open your files locally if you prefer not to save to the cloud. EngineeringPaper.xyz runs on Mac, Windows, Linux, and ChromeOS and works on all of the major browsers. Additionally, EngineeringPaper.xyz is designed to run well on Android and iOS devices. [Launch EngineeringPaper.xyz](https://EngineeringPaper.xyz) in your browser to try it out.

All calculations are run on your own device using the [Pyodide project](https://pyodide.org) to run Python in your browser. The
[SymPy](https://www.sympy.org) Python symbolic math library is used to handle all calculations.
[](https://www.reddit.com/r/EngineeringPaperXYZ/)
## Learning to Use EngineeringPaper.yxz
There are many ways to learn EngineeringPaper.xyz. The built-in [editable tutorial](https://engineeringpaper.xyz/CUsUSuwHkHzNyButyCHEng) or this [tutorial video](https://youtu.be/r7EZQVhcr5Q) are good places to start. For other resources, including many video tutorials and example sheets, see the
[learning EngineeringPaper.xyz](https://blog.engineeringpaper.xyz/engineeringpaperxyz-tutorial) blog post. To get your
questions answered, or to share calculations you have created using EngineeringPaper.xyz, join the official
[EngineeringPaper.xyz subreddit](https://www.reddit.com/r/EngineeringPaperXYZ/).
## Dependencies
EngineeringPaper.xyz would not be possible without the many powerful open source projects that it depends on. Here's a partial list of the projects that EngineeringPaper.xyz builds off of:
* [Pyodide](https://pyodide.org), puts all of the power of Python in your browser using WebAssembly
* [SymPy](https://www.sympy.org), Python symbolic math library (this is the core computation engine for EngineeringPaper.xyz)
* [CoolProp](http://www.coolprop.org/), for thermodynamic fluid properties
* [MathLive](https://cortexjs.io/mathlive/), math editor component
* [Plotly](https://plotly.com/), used for plotting
* [Quill Editor](https://quilljs.com/), rich text editor used for documentation cells
* [Svelte](https://svelte.dev/), the javascript front-end framework that EngineeringPaper.xyz is based on
* [Math.js](https://mathjs.org/), used for unit parsing
* [ANTLR](https://www.antlr.org/), parser generator used to parse the math cells
## Build Instructions
These instructions are only needed to create a development environment for EngineeringPaper.xyz. To run the app, simply go to [EngineeringPaper.xyz](https://engineeringpaper.xyz). See the [contributing guide](https://github.com/mgreminger/EngineeringPaper.xyz/blob/main/CONTRIBUTING.md#contributing) for information on making contributions to EngineeringPaper.xyz.
[Node.js](https://nodejs.org) is used for EngineeringPaper.xyz development. If you don't already have node installed, the easiest way to get it installed is to use the [Volta](https://volta.sh/) node installer. Node version 20 or newer is required.
First, [fork and clone](https://docs.github.com/en/get-started/quickstart/fork-a-repo) this repository. Then, in the cloned project folder, use the following commands to start a local dev server (commands tested on Linux, MacOS, and on Windows using WSL2):
``` bash
# Install dependencies
npm install
# Run local dev server with live reload (point browser to localhost:8788)
npm run dev
```
To build the production version of the site and run the test suite, run the following commands (if the dev server is still running after running the above commands, close it using Ctrl-C before running these commands).
Note that after running `npm run build`, the contents of the `public` folder
can be hosted as a static site on a web server.
``` bash
# Build the production version of the site
npm run build
# run local server
npm run preview
# Install playwright browsers (only needs to be done once each time browsers need to be updated)
# Additional installation of dependencies may be required, follow instructions
npx playwright install
# Setup local database needed for test suite
npm run test:seed
# Run test suite
npm run test
```
================================================
FILE: index.html
================================================
Saving this document will create a private shareable link that can be used to access this document in the future. Anyone you share this link with will be able to access the document.
{:else if modalInfo.state === "uploadPending"}Save this link in order to be able to access or share this sheet.
If you have discovered a bug in EngineeringPaper.xyz, please send a bug report to support@engineeringpaper.xyz. Please include a description of the problem. Additionally, it's best if you can include a link to the sheet that is experiencing the problem.
{:else if modalInfo.state === "tryEpxyz"}Some environments indiscriminately block all .xyz domains. For example, some school districts block all .xyz domains for their school issued Chromebooks. Since it's important to us that all of the EngineeringPaper.xyz goodness is available to everyone, the full functionality of EngineeringPaper.xyz is now also available as a .com address at EPxyz.com. The functionality is the same between the two domains and sheets saved on one can be opened on the other. Shareable links are interchangeable as well. For example, https://engineeringpaper.xyz/fFjTsnFoSQMLwcvteVoNtL and https://epxyz.com/fFjTsnFoSQMLwcvteVoNtL point to the same sheet.
{:else if modalInfo.state === "supportedUnits"}This sheet contains code cells and was created with an old Python runtime. Code cell calculations could change due to package version differences in this new runtime. The old and new runtime versions are listed below. If your code cells need to run in their original runtime, the most recent permalink that uses this sheet's Python runtime is: {modalInfo.runtimeInfo.safePermalink}
Check the results of your code cells with this new runtime. If everything looks good, save this sheet to remove this warning. The see this message again, reopen this sheet without saving it.
{stdout}
{/if}
Press the number to the desired cell type or press Escape to cancel:
{/if}| Global Shortcuts | |
|---|---|
| {modifier} + S | Save current sheet to local file |
| {modifier} + Shift + S | Save current sheet to local file with a new filename instead of replacing existing file |
| {modifier} + L | Save current sheet to database to get a shareable link |
| {modifier} + O | Open sheet from local file (replaces currently loaded sheet) |
| {modifier} + Shift + N | Load blank sheet (replaces currently loaded sheet) |
| {modifier} + ↑ | Select cell above current cell |
| {modifier} + ↓ | Select cell below current cell |
| {modifier} + D | Delete current cell |
| Enter | Insert Math Cell when in a Math Cell, or add row when in a Plot, Table, Piecewise Expression, or System Solve Cell |
| Shift + Enter | Insert Math Cell |
| {modifier} + Enter then 1 | Insert Math Cell |
| {modifier} + Enter then 2 | Insert Documentation Cell |
| {modifier} + Enter then 3 | Insert Plot Cell |
| {modifier} + Enter then 4 | Insert Selector Table Cell |
| {modifier} + Enter then 5 | Insert Data Table Cell |
| {modifier} + Enter then 6 | Insert Piecewise Expression Cell |
| {modifier} + Enter then 7 | Insert System Solve Cell |
| {modifier} + Enter then 8 | Insert Code Cell |
| {modifier} + Enter then 9 | Insert Fluid Properties Cell |
| {modifier} + Enter then 0 | Insert Sheet |
| Esc | Unselect all cells |
| Math Field Shortcuts | ||
|---|---|---|
| * | Multiply | |
| / | Divide | |
| {modifier} + E | Insert *10^ for scientific notation | |
| < then = | Insert less than or equal to symbol (≤) | |
| > then = | Insert greater than or equal to symbol (≥) | |
| Type sqrt | Insert square root | |
| Type pi, e, or i | Inserts the reserved variable π, Euler's number e, or imaginary unit i | |
| Type the name of a lower case Greek letter | Inserts a lower case Greek character (updates after leaving the current math field, start with a backslash \ to update immediately), recognizes alpha, beta, gamma, delta, epsilon, zeta, eta, theta, iota, kappa, lambda, mu, nu, xi, rho, sigma, tau, phi, chi, psi, and omega | |
| Type the name of an upper case Greek character | Inserts an upper case Greek character (updates after leaving the current math field, start with a backslash \ to update immediately), recognizes Gamma, Delta, Theta, Lambda, Xi, Pi, Sigma, Upsilon, Phi, Psi, and Omega | |
| Tab | Navigate to next location in equation, if available, otherwise navigate to next focusable element on page | |
| ^ | Add exponent | |
| _ | Add subscript | |
| @ or {modifier} + * | Matrix multiply or cross product in the special case where both matrices are 3x1 or 1x3 | |
| {modifier} + ' | Matrix Transpose | |
| ←, →, ↓, or ↑ | Navigate within math field | |
| {modifier} + \ | Toggle visibility of virtual keyboard | |
| " | Toggle comment mode in a math field | |
| Type \int | Inserts an integral | |
| Type \der | Inserts a derivative | |
| Type \dder | Inserts a double derivative | |
| Type \tder | Inserts a triple derivative | |
| Type \sum | Inserts summation notation | |
| Type \prod | Inserts product notation | |
| {modifier} + Z | Undo edit in current math field | |
| {modifier} + Y | {:else}{modifier} + Shift + Z | {/if}Redo edit in current math field |
| Type \hat | Add hat accent to variable name | |
| Type \bar | Add bar accent to variable name | |
| Type \vec | Add vector accent to variable name | |
| Type \dot | Add dot accent to variable name | |
| Type \ddot | Add double dot accent to variable name | |
| ' | Add prime accent to variable name | |
| Documentation Field Shortcuts | ||
|---|---|---|
| {modifier} + B | Set selected text to Bold | |
| {modifier} + I | Set selected text to Italics | |
| {modifier} + U | Set selected text to Underline | |
| {modifier} + K | Insert link at selected text | |
| {modifier} + E | Insert formula at cursor location (uses LaTeX notation) | |
| {modifier} + Z | Undo edit in current documentation field | |
| {modifier} + Y | {:else}{modifier} + Shift + Z | {/if}Redo edit in current documentation field |
| Code Editor Shortcuts | ||
|---|---|---|
| {modifier} + / | Toggle comment | |
| Tab | Increase Indent | |
| Shift + Tab | Decrease Indent | |
| {modifier} + M | {:else}Opt + Shift + M | {/if}Toggle tab key behaviour for code editor (tab to indent or tab to navigate page) |
| Ctrl + Space | Show autocomplete menu | |
| {modifier} + Z | Undo edit in current code editor | |
| {modifier} + Y | {:else}{modifier} + Shift + Z | {/if}Redo edit in current code editor |
{renderResultValue}
{/if}
{/if}
{#if error}
EngineeringPaper.xyz uses your browser's local storage to store your default sheet config, your {numCheckpoints ?? ""} most recent autosave checkpoints, and your list of recently visited sheets. Your web browser will not automatically persist this local storage and may clear it at any time. Safari is particularly aggressive about freeing this storage and will automatically clear local storage for a site that has not been visited in the previous seven days.
Click the button below to request that your browser enables persistent local storage for the {hostName} domain. Your browser may popup a dialog that asks you to approve this request. Chrome and Edge may require you to bookmark {hostName} in order to enable persistent storage.
{#if persisted}
================================================ FILE: src/SetDefaultConfigDialog.svelte ================================================
{#if configsMatch}
Updated {versionDateString}
Welcome to EngineeringPaper.xyz! By using this software, you are agreeing to the following terms and conditions.
EngineeringPaper.xyz strives to protect user privacy. This is free and open source software that does not require you to create an account to use. All of the calculations you perform on EngineeringPaper.xyz are performed on your own computer and nothing you enter into your sheets is sent to our servers unless you create a shareable link or export your sheet as a Microsoft Word .docx file or a PDF file. When you create a shareable link, we only store the minimum amount of information required to run the shareable link service (see details below). When you export your sheet as a .docx or a .pdf file, no information is retained on the EngineeringPaper.xyz servers (see details below). Using your browser's print functionality to save your sheet as a PDF file sends no data to the EngineeringPaper.xyz servers.
You have the option to save your full sheets to your local drive as .epxyz files. If you only save your sheets locally as .epxyz or Markdown files, none of your data is ever sent to our servers.
THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
EngineeringPaper.xyz does not use cookies and does not track its users. The only time personal information is collected is when you use the "Get Shareable Link" feature of this site. When creating a shareable link, your IP address is stored in a database along with the contents of the sheet that is uploaded. The reason we collect the IP address for uploaded sheets is to protect this free shareable link service from abuse. When creating a shareable link, your data is stored on Cloudflare's global network. Cloudflare automatically attempts to locate data closest to the user to improve overall performance.
For technical reasons, it is necessary to send data to the EngineeringPaper.xyz servers to convert your sheets to .docx or .pdf files. No data is retained on the EngineeringPaper.xyz servers when creating .docx or .pdf files.
Saving your sheets locally as .epxyz or Markdown files avoids sending any of your data to our database. Additionally, sheets can be convert to a PDF file using the browser's print functionality without sending any data to the EngineeringPaper.xyz servers.
Our goal is to store sheets using the shareable link feature for the life of the shareable link service. However, we provide no guarantee to the accessibility of shareable links in the future. We reserve the right to shut down the shareable link service at any time, and for any reason, without warning. We also reserve the right to delete any uploaded sheet at any time, and for any reason, without warning.
To ensure future access to your sheets, be sure to save them locally as .epxyz files (even if you have created a shareable link).
The following unit definintions are supported by EngineeringPaper.xyz (from Math.js documentation). Units may be used in their long or short forms (meter or m) and they may be used in their singular or plural forms (second or seconds).
| Base | Unit |
|---|---|
| Length | meter (m), inch (in), foot (ft), yard (yd), mile (mi), link (li), rod (rd), chain (ch), angstrom, mil |
| Surface area | m2, sqin, sqft, sqyd, sqmi, sqrd, sqch, sqmil, acre, hectare |
| Volume | m3, litre (l, L, lt, liter), cc, cuin, cuft, cuyd, teaspoon, tablespoon |
| Liquid volume | minim, fluiddram (fldr), fluidounce (floz), gill (gi), cup (cp), pint (pt), quart (qt), gallon (gal), beerbarrel (bbl), oilbarrel (obl), hogshead, drop (gtt) |
| Angles | rad (radian), deg (degree), grad (gradian), cycle, arcsec (arcsecond), arcmin (arcminute) |
| Time | second (s, secs, seconds), minute (min, mins, minutes), hour (h, hr, hrs, hours), day (days), week (weeks), month (months), year (years), decade (decades), century (centuries), millennium (millennia) |
| Frequency | hertz (Hz) |
| Mass | gram(g), tonne, ton, grain (gr), dram (dr), ounce (oz), poundmass (lbm, lb, lbs), hundredweight (cwt), stick, stone |
| Electric current | ampere (A) |
| Temperature | kelvin (K), celsius (degC), fahrenheit (degF), rankine (degR) |
| Amount of substance | mole (mol) |
| Luminous intensity | candela (cd) |
| Force | newton (N), dyne (dyn), poundforce (lbf), kip, kilogramforce (kgf), gramforce (gf) |
| Energy | joule (J), erg, Wh, BTU (Btu), electronvolt (eV) |
| Power | watt (W), hp, tonrefrigeration (TR, RT, TOR, toncooling), boilerhp (BHP), MBH, MMBH |
| Pressure | Pa, psi, atm, torr, bar, mmHg, mmH2O, cmH2O, inHg, inH2O, ftH2O, kpsi (ksi), Mpsi |
| Electricity and magnetism | ampere (A), coulomb (C), watt (W), volt (V), ohm, farad (F), weber (Wb), tesla (T), henry (H), siemens (S), electronvolt (eV) |
| Viscosity (Dynamic and Kinematic) | poise (P), reyn, ureyn, stokes (St) |
| Binary | bits (b), bytes (B) |
| Name | Abbreviation | Value |
|---|---|---|
| deca | da | 1e1 |
| hecto | h | 1e2 |
| kilo | k | 1e3 |
| mega | M | 1e6 |
| giga | G | 1e9 |
| tera | T | 1e12 |
| peta | P | 1e15 |
| exa | E | 1e18 |
| zetta | Z | 1e21 |
| yotta | Y | 1e24 |
| Name | Abbreviation | Value |
|---|---|---|
| deci | d | 1e-1 |
| centi | c | 1e-2 |
| milli | m | 1e-3 |
| micro | u | 1e-6 |
| nano | n | 1e-9 |
| pico | p | 1e-12 |
| femto | f | 1e-15 |
| atto | a | 1e-18 |
| zepto | z | 1e-21 |
| yocto | y | 1e-24 |
For use with bits (b) or bytes (B)
| Name | Abbreviation | Value |
|---|---|---|
| kibi | Ki | 1024 |
| mebi | Mi | 1024^2 |
| gibi | Gi | 1024^3 |
| tebi | Ti | 1024^4 |
| pebi | Pi | 1024^5 |
| exi | Ei | 1024^6 |
| zebi | Zi | 1024^7 |
| yobi | Yi | 1024^8 |
| Name | Abbreviation | Value |
|---|---|---|
| kilo | k | 1e3 |
| mega | M | 1e6 |
| giga | G | 1e9 |
| tera | T | 1e12 |
| peta | P | 1e15 |
| exa | E | 1e18 |
| zetta | Z | 1e21 |
| yotta | Y | 1e24 |
An update is available for EngineeringPaper.xyz. The next time you close all of your windows and tabs and reopen EngineeringPaper.xyz, you'll receive the update (note that refreshing the page is not sufficient to trigger the update). You will know that the update has been applied when this icon disappears. It is safe to continue working until you are ready to update.
================================================ FILE: src/Updates.svelte ================================================ April 14, 2026 (Permalink: 20260414.engineeringpaper.xyz)The underlying Python runtime that EngineeringPaper.xyz depends on, Pyodide, has been updated. The main change is the inclusion of the latest version of the CoolProp library for fluid properties (v7.2.0), which adds the R1336mzz(E) refrigerant and includes numerous bug fixes. Potentially Breaking Change: For sheets that use code cells, there is a possibility that this change in Pyodide version will impact code cells that depend on old package versions. These sheets will notify users of the runtime change and will list the old and new package versions. Most of the time, sheets will work fine with the new versions and the message will disappear once the sheet is saved. If there are issues with the change in version for your code cells, the message will let you know the most recent permalink that has the old Python runtime version that will work with your code cells (re-open the sheet to see this message if it has been closed). Note that the Polars library is no longer available in this new Pyodide version, so code cells that use the Polars library will need to use the previous permalink version of EngineeringPaper.xyz.
The spacing for x-values is now logarithmic for log x plots. This produces evenly spaced points, which creates smooth log x plots without requiring a large number of points. Additionally, a warning is provided to the user if either the upper or lower limit for a log x plot is non-positive.
Previously, multiplying a dimensioned number by zero resulted in the dimensions being lost as in the following:
{String.raw`\(0\cdot1\left\lbrack m\right\rbrack=0\)`}
This behavior, at times, led to subtle issues when an expression worked with non-zero values and starts to have dimension errors for zero values. The new behavior gives the following result:
{String.raw`\(0\cdot1\left\lbrack m\right\rbrack=0\left\lbrack m\right\rbrack \)`}
This new behavior is particularly useful when using scalar multiplication to apply units to all values in a vector when some of those values may be zero:
{String.raw`\(\begin{bmatrix}1\\ 0\\ 2\end{bmatrix}\cdot1\left\lbrack N\right\rbrack= \begin{bmatrix} 1\left\lbrack N\right\rbrack \\ 0\left\lbrack N\right\rbrack \\ 2\left\lbrack N\right\rbrack \end{bmatrix}\)`}
Potentially Breaking Change: Even though the numerical results remain unchanged with this update, there may be rare cases where dimension errors are introduced for sheets that relied on the old behavior. If you experience dimension errors after this update, look for locations where zero is multiplied by other values and add compatible units to correct the issue. You'll most likely need to add units to the zero value itself to cancel the units of the value being multiplied by zero.
The ability to set the alternative text (alt text) for images in documentation cells has been added to increase the accessibility of EngineeringPaper.xyz sheets. This alt text is included in Markdown and DOCX exports. Alt text is not currently supported in PDF exports, but is anticipated to be supported soon.
Data table results now use the sheet settings for number formatting. Additionally, the number
format can be customized for each data table column using the settings button
Since it's possible to use this app with just your keyboard, it can be distracting to have the
virtual keyboard pop into and out of view as you're working. You can now hide the virtual keyboard
by clicking the
This release also includes general performance improvements. The caclulation performance for data tables has been improved. Additionally, the calculation speed for expressions that have nested {String.raw`\(\log()\)`} and/or {String.raw`\(\ln()\)`} function calls has been significantly improved.
Certain types of functions require a variable that is local to that function that should not be substituted until after the function is evaluated. Examples include integration, differentiation, and summation. For integrals, this variable is the variable of integration. Previously it was not possible to use these dummy variables in custom Python functions making it impossible to define certain integral transformations including Laplace and Fourier transforms. It is now possible to use dummy variables in your custom Python functions. See the Custom Laplace Transform Tutorial to see an example of using dummy variables in Python code cells.
Several improvements have been made to Word and PDF document exporting. Equations are now left justified by default. The previous behavior of centered equations is now an option. The paper size for exported documents can now be specified as either A4 or Letter. The size of scaled images is now carried through to the exported Word or PDF document. Previously, images always appeared at their original size in the exported document file. Finally, and most importantly, the PDF typesetting engine has been updated to use the amazing Typst typesetting library. This results in much faster PDF generation, support for international unicode fonts, emojis 😊➡️📄, and a more modern look for the PDF exports. Also, the Python Extensions Tutorial has been updated to show you how to get your Python code cell generated SVG images to show up in your exported Word and PDF documents (see the last Matplotlib example in the tutorial).
EngineeringPaper.xyz can now be extended with Python code cells! Access powerful Python libraries including NumPy, SciPy, scikit-learn, and SymPy within your EP sheets without any installations and it all runs locally on your own computer. Code cells are designed to be intuitive and easy to use without limiting what can be achieved. The text, HTML, and Markdown rendering capabilities enable adding variable driven visualizations and summaries to your EP sheets. See the Python Extensions Tutorial for details. There is also a video tutorial to help get you started. Enjoy!
EngineeringPaper.xyz now supports matrix slicing notation to extract rows and/or columns from a matrix. For example {String.raw`\(A_{2,1:end}\)`} extracts the second row of the matrix. See the updated Matrices and Vectors Tutorial for details. Additionally, the updated tutorial shows how to combine vectors and matrices as rows, columns, or both.
Have you ever been forced to use inconvenient variable names such as {String.raw`\(DeltaF_{DoublePrime}\)`}, {String.raw`\(i_{hat}\)`}, or {String.raw`\(doubleDotx_{alpha}\)`} in EngineeringPaper.xyz? These variables can now be more conveniently expressed as {String.raw`\(\Delta F^{\prime\prime}\)`}, {String.raw`\(\hat{\imath}\)`}, and {String.raw`\(\ddot{x_{\alpha}}\)`} , respectively, since EngineeringPaper.xyz now supports variable name accents such as bar, vector, dot, double dot, and prime. These accents are available on the {String.raw`\(\hat{a}\mathrm{\smallint\Sigma}\)`} tab of the virtual keyboard. Previously, Greek characters could only be used by themselves as variable names. Greek characters can now appear anywhere, and in any combination, within a variable name or subscript. Finally, and most importantly, international character sets can now be used in variable names making all of the following valid EngineeringPaper.xyz expressions:
{String.raw`\(面积=长度\cdot宽度\)`}
{String.raw`\(Ε\mu\beta\alpha\deltaό\nu=Μή\kappaο\varsigma\cdot\Pi\lambdaά\tauο\varsigma\)`}
{String.raw`\(क्षेत्रफल=लंबाई\cdotचौड़ाई\)`}
{String.raw`\(면적=길이\cdot너비\)`}
{String.raw`\(พื้นที่=ความยาว\cdotความกว้าง\)`}
{String.raw`\(面積=長さ\cdot幅\)`}
EngineeringPaper.xyz now supports all of the Unicode character sets that are supported by Python for variable names. Unfortunately, right-to-left character sets are not well supported at this time. This is due to some issues with the underlying math editor used by EngineeringPaper.xyz. Hopefully this can be addressed at some point in the future.
This release also includes additional changes to offload the parsing of mathematical expressions to a different browser thread. This makes editing large or complex mathematical expressions much more responsive. This change also makes editing large data tables much less laggy, which enables users to work with data tables that have thousands of rows.
Data tables now support multivariable interpolation and multivariable polynomial regression making it easy to perform bilinear interpolation of tabular data or to create response surfaces for design of experiments (DOE) data. See this multivariable interpolation tutorial video for details. Additionally, this update provides significant performance improvements for both calculations and load times through both code improvements and by upgrading the underlying Pyodide Python library.
Summation and product notation have been added. Summation or product notation can be inserted using the virtual keyboard with the new {String.raw`\(\mathrm{\smallint\infty\Sigma}\)`} tab. Alternatively, they can be inserted by typing the \sum or \prod keyboard shortcuts. The numrows and numcols functions have been added to make it easy to use the summation or product notation to loop over matrices or vectors of arbitrary size (see the Matrices and Vectors Tutorial for an example).
Matrices can now be resized using the context menu (access the context menu using right click on Windows, Ctrl-left-click on Mac, and long press on touch screen devices) or by using the {String.raw`\(\begin{bmatrix}A\end{bmatrix}\)`} tab on the virtual keyboard.
Finally, to accommodate these new features, the virtual keyboard tabs have been updated. The Math tab has been renamed to {String.raw`\(123\)`}. The calculus functions have been moved to the new {String.raw`\(\mathrm{\smallint\infty\Sigma}\)`} tab. The statistics functions have been moved to the {String.raw`\(\operatorname{f}\left(x\right)\)`} tab and the Matrices tab has been renamed to {String.raw`\(\begin{bmatrix}A\end{bmatrix}\)`}.
One of the more popular features of EngineeringPaper.xyz is the ability to document your calculations using documentation cells. This release adds frequently requested features to documentation cells. First, you are now able to add mathematical expressions to documentation cells using either the formula button in the toolbar or using the {modifier}-E keyboard shortcut. You enter your equations using LaTeX mathematial notation. Don't know LaTeX, no problem! You can simply copy the mathematical expression from one of the math fields in your EngineeringPaper.xyz and paste it into the formula field, it will be in LaTeX format since EP uses LaTeX as its native math format. Second, you're now able to set the text color and text highlight color in documentation fields. Finally, you can now resize images using the resize handles that appear when you click on images in your documentation fields.
This release has many behind the scenes changes that modernize the user interface libraries and code. Much effort has went into making sure that these changes do not introduce bugs, however, if you do notice a bug, please report the bug to support@engineeringpaper.xyz In the meantime, you may use the previous release's permalink (see below) until the bug is fixed.
The logic for dimension handling has been significantly revised and improved. The most significant benefit of this update is improved error messages for dimension errors. Instead of just getting the dreaded Dimension Error message, some context about the operation or function that lead to this error is included in the error message. This update also makes calculations faster in general, provides more robust handling of dimensions that are slightly different due to floating point rounding errors, and makes it easier to maintain and extend the dimension handling code in the future. This update is required to enable some significant new features that are coming your way!
Significant testing has gone into ensuring that this change does not introduce bugs. One change you may notice is that dimensions were sometimes lost in the past for dimensioned values that had zero magnitude. This should no longer happen but may lead to dimension errors for sheets that relied on the old behaviour. If you do notice a bug, please report the bug to support@engineeringpaper.xyz In the meantime, you may use the previous release's permalink (see below) until the bug is fixed.
New releases of EngineeringPaper.xyz roll out on a continuous basis. Because of this, if you go to the main EngineeringPaper.xyz site, you always get the most recent version with all of the newest features and bug fixes. This is also true for the alternative mirror addresses: epxyz.com and EngineeringPaper.com. Most of the time, this is what you want. However, there may be cases where you may want to use a specific release. If you find the updates distracting, using one of the release permalinks will allow you to avoid updates until you're ready. Additionally, in the event that a new version introduces a bug that is impacting your sheet, going back to a previous permalink will allow you to open your .epxyz file and keep working. Of course, if this happens, please report the bug to support@engineeringpaper.xyz so that we can get it fixed. A lot of effort is put into ensuring that new versions don't introduce bugs. However, a bug is always possible and ensuring that you're able to work with your existing sheets is a top priority.
For this, and all future releases, a permalink will be listed after the release date in this dialog (for this release, the permalink is: 20250116.engineeringpaper.xyz). This dialog can be accessed by clicking on the "Releases" entry in the left menu. The release permalinks will also be available on the EngineeringPaper.xyz GitHub site.
As you might expect, the introduction of permalinks is in anticipation of new releases coming your way. In the short term, most of the changes are related to updates to the internal structure of EngineeringPaper.xyz. These updates are important to modernize and simplify the code that backs EngineeringPaper.xyz and will pave the way for exciting new features in the future. Stay tuned!
You can now set your own custom default sheet settings (default units, default number
formating, etc.). These defaults will be used whenever you create a new sheet
and these settings can also be applied to existing sheets. All of this functionality
is accessible through the "Set User Default" tab of the "Sheet Settings"
dialog (available using the sheet settings button
The two multiplication symbols (the dot symbol obtained using the * key and the x symbol obtained using the @ key) can now be used interchangeably and will correctly apply either scalar or matrix multiplication as appropriate for the situation. Previously, the dot symbol would give unexpected results for some matrix multiplication situations. The only difference between the two symbols is that the x multiplication symbol will automatically perform a cross product when operating on compatible vectors (both 3x1 or both 1x3). This cross product behavior is unchanged from previous versions. This update also fixes some situations where the result of a matrix multiplication passed to a function would cause an error.
The reliability of PDF export has been greatly improved. Images that previously caused errors are now reproduced correctly in the generated PDF files. International fonts that previously caused errors no longer cause errors. However, some international fonts are still not rendered properly in the generated PDF. For full international font support, exporting to Word DOCX files or using the browser's print to PDF function are still your best options.
A frequent point of confusion was the lack of support for units immediately following a number expressed in scientific notation. Units now work as expected when used with scientific notation (see image below). Additionally, the {modifier}-E keyboard shortcut can be used to insert scientific notation and a new scientific notation button has been added to the virtual keyboard.
New scientific notation with units support:
A new sheet setting has been added (available using the settings button
Result with Show Intermediate Results setting disabled (default):
Result with Show Intermediate Results setting enabled:
This feature is useful for debugging results with a dimension error since it will highlight if one of the input values is the source of the dimension error. Additionally, this feature is useful in an educational context where including intermediate results may make it easier to evaluate a student's work or it may make it easier for a student to follow along with an example problem.
Spreadsheet files (Excel or CSV files) can now be dragged and dropped onto a
EngineeringPaper.xyz page to automatically add a new data table cell to the
current sheet. A new button,
EngineeringPaper.xyz can now do spreadsheets with Excel and CSV import! Additionally, the min and max functions have been updated to work with vectors and new functions geared towards working with data have been added (sum, average, stdev, stdevp, range, and count). See the data table tutorial for details.
Parametric plotting has been added to EngineeringPaper.xyz. See the parametric plotting tutorial for details.
For those of you who perform thermodynamic and fluid calculations, this release is for you! Powered by the powerful CoolProp library, EngineeringPaper.xyz now provides built in thermodynamic properties for many fluids including air, water/steam, humid air (psychrometrics), numerous refrigerants, and common heat transfer solutions including propylene and ethylene glycols. See the thermodynamic fluids tutorial to get started!
This release also borrows from the strange and fascinating world of engineering units by adding the following new units: poise (P), reyn, ureyn, stokes (St), kpsi (ksi), Mpsi, inHg, ftH2O, inH2O, tonrefrigeration (TR), boilerhp (BHP), MBH, MMBH, and gramforce (gf).
This release includes the following usability improvements and bug fixes:
The maximum number of columns allowed in a matrix has been increased to 50. The previous limit was 10. The number of rows allowed is unlimited, however, performance may become sluggish with large matrices.
Using the mouse or touch actions to drag and reorder cells has been improved and no longer has issues after repeated drag events.
Integration and differentiation now support piecewise functions. These updates will also fix situations that led to dimension errors when performing integration and differentiation on expressions that used certain builtin functions such as the min and max functions.
Two bugs that occur in certain situations when performing substitutions with derivatives and integrals have been fixed. This fix also has the benefit of speeding up calculations for sheets that make use of derivatives or integrals.
Math fields in EngineeringPaper.xyz now support a custom context menu for Cut/Copy/Paste, Undo/Redo, Select All, and Delete functionality. The context menu can be opened using the standard shortcuts for your system (right click on Windows, Ctrl-left-click on Mac, and long press on touch screen devices). Note that on iOS devices, the long press doesn't always work due to a bug in Safari. For these situations, a menu button ≡ has been added to the onscreen keyboard in order to ensure access to the context menu on all systems.
When using Chrome, or a Chrome based browser such as Edge, hitting {modifier}-S will automatically re-save the file using the same name, if it has already been saved. The {modifier}-Shift-S keyboard shortcut can now be used to perform a Save As operation to allow you to choose a different file name. Additionally, the Save Document menu now includes a Save As checkbox to serve the same purpose. The {modifier}-Shift-S keyboard shortcut was previously used to save your document as a shareable link. The {modifier}-L keyboard shortcut can now be used the create a shareable link.
When using Chrome, or a Chrome based browser such as Edge, the file saving experience has been improved. Hitting {modifier}-S on the keyboard will prompt you to choose the file name and location for the first save. For future saves, the file will be automatically replaced when you hit {modifier}-S. If you would like to save the file as a different name, simply change the sheet title and you'll be prompted to choose a new file name the next time you hit {modifier}-S. Another option to save as a different file name without changing the sheet title is to disable the file saving permission using the browser's address bar. These options are covered in this EngineeringPaper.xyz File Management Tutorial Video. Unfortunately, Firefox and Safari don't currently support the File System Access API required to enable these advanced file management features.
In addition to the Microsoft Word and PDF export options, your sheet can now also be exported as a LaTeX document. Note that images and plots cannot be included when using the LaTeX export option.
You're now able to export your EngineeringPaper.xyz sheets as Microsoft Word,
PDF, or Markdown files. Use the save icon
Some environments indiscriminately block all .xyz domains. For example, some school districts block all .xyz domains for their school issued Chromebooks. Since it's important to us that all of the EngineeringPaper.xyz goodness is available to everyone, the full functionality of EngineeringPaper.xyz is now also available as a .com address at EPxyz.com. The functionality is the same between the two domains and sheets saved on one can be opened on the other. Shareable links are interchangeable as well. For example, https://engineeringpaper.xyz/fFjTsnFoSQMLwcvteVoNtL and https://epxyz.com/fFjTsnFoSQMLwcvteVoNtL point to the same sheet.
The default base units used for results can now be set in the sheet settings dialog.
To access the base unit settings, click on the sheet settings
icon
As in the past, the default unit system for EngineeringPaper.xyz sheets is the SI unit system. The default unit symbols now all correspond to the official SI unit symbols (for example, the time unit now defaults to s rather than sec). However, all of the old unit symbols still work for user specified units.
Finally, the inverse time unit, 1/s, is no longer automatically converted to Hz since this behavior was confusing when the frequency unit should have been interpreted as rad/s. See this blog post for details on how to properly handle frequency units in EngineeringPaper.xyz.
Scatter plots are now supported by EngineeringPaper.xyz. Scatter plotting leverages the recently added ability to define vectors. See the Scatter Plotting Tutorial for details.
Three new rounding functions have been added. ceil to round up, floor to round down, and round to round to the nearest integer. These new functions can be found on the f(x) tab of the virtual keyboard. Note that these functions require that the input parameter is unitless. An input with units would lead to unexpected results since all calculation are performed internally in base SI units. For example, calculating the floor of 1 [mm] would evaluate to zero since the floor would be calculated on 0.001 after the millimeter value is converted to meters for the internal calculation.
The error messages for syntax errors have been improved for some common errors that can be difficult to detect by looking at the expression. Specifically, the error message will indicate if there is an empty subscript or superscript or if there is a missing multiplication symbol. Note that not all missing multiplication symbols are able to be detected, but many common situations are covered by the new error messages.
This release adds matrix and vector support. Just like all of the capabilities in EngineeringPaper.xyz, matrix and vector support is designed to be intuitive and easy to use and you'll get a long way by exploring the new "Matrices" tab on the onscreen keyboard. You can also check out the new Matrices and Vectors Tutorial to see all of the details. And, of course, all of the matrix and vector functionally has full units support.
If you're finding the need to do more in depth numerical analysis with your EngineeringPaper.xyz calculations, the new automatic Python code generation feature is for you! Check out the details in the new Python Code Generation Tutorial. And, you guessed it, the Python code generation is units aware and will use whatever units you specify in your EngineeringPaper.xyz sheet!
This is a minor release that includes the following usability improvements:
Several plotting improvements have been rolled out. The main change is that the axis labels and legend labels have been updated to render as math so that subscripts, Greek characters, and units appear the same in plots as they appear in math fields. This makes plot labels much easier to read, especially when there are complex units. See the example below to see the different between the old style plots and the new style plots. Plots can now be saved as SVG files, in addition to PNG files, using the buttons that appear above the plots.
Old Plots:
New Plots:
Additionally, the keyboard responsiveness of the app for large sheets with many plots has been improved. Finally, plots opened from the side menu now resize properly when the side menu is closed.
The formatting used for numerical output is now customizable, both at the sheet
level and at the individual math cell level. The number formatting can be set by
clicking on the settings icon
Default notation:
Fixed notation with one significant figure after the decimal point:
Scientific notation with four significant figures:
Engineering notation with four significant figures:
Symbolic notation:
Additionally, the precision of the numerical computations has been increased to 64 significant figures. Note that some unit conversions occurs at standard floating point precision (this occurs when using non-SI units and when converting between radians and degrees). This issue will be addressed in future updates.
Many thanks to @JWock82 for submitting these feature suggestions as a GitHub issue.
Up until this time, EngineeringPaper.xyz has been using the MathQuill math editor component. This editor worked well but is no longer being actively supported and has some limitations that has limited what features can be implemented in EngineeringPaper.xyz. Specifically, MathQuill does not support vectors and matrices. To enable the future advancement of EngineeringPaper.xyz, the math editor has been updated to use the MathLive math editing component. MathLive is under active development and supports many advanced math constructs, such as vectors and matrices. You will notice differences in how the equations look in your existing sheets. In general, MathLive uses a more modern font set and renders equations more clearly. We have aimed to keep the editing experience as close to the same as possible. One change is the shortcut for the square root symbol. Simply type "sqrt(" to create the square root symbol. Alternatively, you can use the onscreen keyboard to insert a square root symbol.
Extensive testing has been done to ensure that your existing sheets will still work without needing any updates. If you do run into issues with your existing sheets, this is a bug and should be reported to support@engineeringpaper.xyz, submitted as an issue on the GitHub issues page, or reported on the Reddit community page. In the case that you are having a issue opening an existing sheet or working with the math editor, the previous version of EngineeringPaper.xyz will remain available at classic.engineeringpaper.xyz. Keep in mind that sheets created in this and later versions of EngineeringPaper.xyz will not open in classic.engineeringpaper.xyz
This switch to a new math editor would not be complete without adding some
new features. In the past, sheets tended to use up a lot of vertical space
since each new assignment, each query, and each comment needed its own cell.
An assignment and query can now be combined into one statement as shown in
the image below:
Additionally, multiple assignments can be be made in a math cell by separating
them by commas:
Finally, comments can be added at any location within a math field by pressing
the quotation mark key to toggle comment mode on and off. The Comment button on the
ABC or abc panels of the onscreen keyboard may also be used to
toggle comment mode. Comments may be added at any point within a math expression
and will automatically be ignored (see example below). This is a capability directly enabled by
switching to the MathLive math editor.
To see these new features in action, checkout this
example sheet.
Many thanks to @JWock82 for
submitting these feature suggestions as a
GitHub issue.
The version of Python that EngineeringPaper.xyz uses for calculations, via the Pyodide project, has been updated to Python 3.11. This update provides significant speed improvements for both calculations and initial Pyodide load time. The initial Pyodide load time is about half of what it was for the Python 3.10 version of EngineeringPaper.xyz. Enjoy!
There were a few cases where valid variable names would cause an error since they were reserved names in Python or SymPy. This issue has been fixed.
Some improvements have been made to EngineeringPaper.xyz's handling of syntax errors. First of all, blank math cells are no longer considered a syntax error. Second, a syntax error in the current math field does not cause all of the results to disappear. Both of these changes allow users to maintain visibility to existing results as they enter new math expressions. Many thanks to @VanHulleOne for suggesting these usability improvements as GitHub issues.
As a community project, EngineeringPaper.xyz depends on feedback from its users. If you have a feature request or are experiencing a bug, there are multiple ways to report these issues. You can create an issue in EngineeringPaper.xyz's GitHub issues page, you can add a post to EngineeringPaper.xyz's Reddit community page, or you can send a email to support@engineeringpaper.xyz. Also, if you would like to share any of the sheets you are creating with EngineeringPaper.xyz, the Reddit community page is a great place to share and start a discussion.
EngineeringPaper.xyz is now a progressive web application (PWA). The biggest impact of this change is that EngineeringPaper.xyz will now work without an internet connection (offline functionality becomes available after the first time you load the page in your web browser). Another benefit of PWAs is that they can be installed as a native application on your computer or mobile device. The exact instructions will depend on your operating system and device type. See this NIOSH writeup on how to install a PWA for further details.
Another benefit of this change will be smoother rollouts of updates to EngineeringPaper.xyz. In the past, it was possible for various components of EngineeringPaper.xyz to become temporarily out of sync as updates were rolled out globally. EngineeringPaper.xyz will now only incorporate an update when all components are guaranteed to be in sync. This will eliminate the brief instability that occasionally occurred with previous updates. A green refresh icon will appear in the toolbar when an update is available. In order to apply the update, all tabs and windows of EngineeringPaper.xyz need to be closed. Using the refresh button is not sufficient to apply the update. It is safe to continue using the app while an update is pending.
To ensure that EngineeringPaper.xyz always remains free to use, it has now been released as open source software under the permissive MIT license. The source code can be found on the EngineeringPaper.xyz GitHub page . With this change, you can rest assured that EngineeringPaper.xyz will always be available and that your time invested in using this software will not be wasted. No other engineering calculation software can make this promise.
This release also adds a local file open and file save feature. The buttons for this new functionality are on the top toolbar. This allows you to save your sheets to your local drive. With this capability, along with the open source license of EngineeringPaper.xyz, you are assured that you will always have access to the calculations you create in EngineeringPaper.xyz. The {modifier}-S keyboard shortcut now saves your current sheet locally. To {modifier}-Shift-S keyboard shortcut is now used to create a shareable link (this was the previous behavior of the {modifier}-S shortcut). The {modifier}-O keyboard shortcut can be used to open a local file. Finally, the {modifier}-Shift-N key starts a new blank sheet. EngineeringPaper.xyz sheets have an .epxyz extension by default. Another way to open your saved sheets is to drag and drop them onto the EngineeringPaper.xyz window.
Many updates have been made to improve printing of EngineeringPaper.xyz sheets. Document flow issues have been fixed where items may have previously overlapped. All unnecessary user interface buttons and controls are now hidden when printing. Scroll bars no longer appear in printouts. Finally, plot sizing when printing has been improved.
Plots have been visually improved as well. The issue where the y-axis labels occasionally overlap the axis numbers has been fixed. Plot sizing has been improved on desktop and mobile. Finally, the plot legend is now placed horizontally below the plot for more efficient usage of screen space on desktop and mobile.
EngineeringPaper.xyz now automatically saves checkpoints of your sheet to prevent loss of data in the event that you accidentally navigate away from an unsaved sheet, accidentally refresh your page, or your browser window crashes. If you accidentally navigate away from your sheet, simply use the browser's back button to get back to your unsaved sheet. These autosave checkpoints are saved locally to your computer and can only be accessed on the computer, and the browser, where they were generated. In order to share your sheets with others, and to ensure future access to your work, you will still need to manually save your sheet using the upload button on the top right of the page or using the {modifier}-S keyboard shortcut.
The checkpoints are saved every 10 seconds (only if there have been changes to your sheet). Because of this, you can use the browser's back button to undo recent changes you've made to your sheet.
These autosave checkpoints are saved in your browser's local storage. Keep in mind that some browsers (Safari in particular) can be fairly aggressive about cleaning up local storage so make sure to manually save any sheets that you need access to in the future. See the side menu on the left for the "Enable Persistent Local Storage" option to request that your browser persists the data stored by EngineeringPaper.xyz.
The experience of using EngineeringPaper.xyz on iPhone and Android devices has been improved significantly. Specifically, the on-screen keyboard has been expanded to provide access to all controls and symbols required to edit math equations on mobile.
The improvements are not just for mobile users. The use of screen space has been improved on both mobile and desktop. The on-screen keyboard now includes quick access to commonly used units, eliminating the need to type them in. Finally, by placing the onscreen keyboard at the bottom of the screen, the issue of missed mouse clicks because of the on-screen keyboard appearing or disappearing has been eliminated.
Potentially Breaking Change: The inverse trig functions (arctan, arcsin, and arccos) now return values with the units of angle (radians by default but can be converted to degrees). If you have sheets that relied on the previous behavior, where the inverse trig functions return unitless values, you can multiple those values by (1 [1/rad]) to return to the previous behavior.
New Features: The complex number support has been improved with EngineeringPaper.xyz with the addition of the real, imag, conj, and angle functions (see the Imag tab added to the onscreen keyboard to access these new functions). If you prefer to learn by example, check out this blog post that uses these new capabilities to analyze a voltage divider with reactive electrical components
Bug Fixes and Improvements: The error handling for plots has been overhauled to provide more helpful error messages to help in debugging common plotting issues.
{modifier}-Z and {modifier}-Y can now be used to Undo/Redo edits in a math field. Note that the Undo/Redo funcitonality is local to the currently selected math or text field. When a sheet is saved and reloaded, the undo history will be lost.
A comprehensive set of keyboard shortcuts have been added to EngineeringPaper.xyz that allow you to navigate your sheet, add and remove cells, and save your work, all without leaving your keyboard. See the new keyboard shortcuts button on toolbar at the top of the app or see this blog post. There's also a tutorial video.
The number of points used for a plot defaults to 51. The number of points can now be specified by appending the plot function call with "with 500 points" to obtain a plot with 500 points, for example. This new feature is easiest shown by example, see bottom of the all new and improved plotting and function tutorial to see this new feature in action. This new feature is especially powerful when combined with the new "Copy Data" button to bring the plot data into Excel, Google Sheets, or Numbers.
Many improvements have been made to plotting in EngineeringPaper.xyz. The biggest new feature is the "Copy Data" button that copies all of the plot data to the clipboard where you can then paste it into Excel, Google Sheets, or Numbers. Support for log scaling of the x and/or y axes has also been added. Finally, an insert plot cell button has been added to make it simpler to create a plot. See the plotting and function tutorial to try out these new features.
EngineeringPaper.xyz now supports numerically solving equations and systems of equations in situations where the symbolic solver may not be able to find an exact solution. See the updated equation solving tutorial sheet to see how to use this new capability. There is also a short numerical solver tutorial video available.
The way EngineeringPaper.xyz handles equation solving has been updated and improved by adding a System Solve Cell type. This change makes it possible to solve multiple systems of equations in a single sheet and makes it easier to choose a particular solution when there are multiple solutions. Existing sheets that make use of equation solving will need to be updated to use the new System Solve Cell. See this equation solving tutorial sheet to see how to update your sheets that make use of the new System Solve Cell type. This change will also make it easier to add numerical equation solving in future versions of EngineeringPaper.xyz.
Piecewise functions can now easily be added to EngineeringPaper.xyz sheets. Check out this example sheet for an example of a Piecewise function used in a calculation.
You can now easily insert other sheets and tables into your sheets to save typing. See this tutorial video for a demo of this new feature.
Table cells make it easy to compare multiple scenarios in a single sheet. For example, different materials or different boundary conditions can be defined in a table. See this tutorial video for a demo of this new feature.
Check out this example sheet to learn how to use these exciting new features. This plotting and function tutorial is also available through the example sheets list in the top left menu. Additionally, the Terms of Conditions text has been updated for clarity (also accessible from the top left menu).
================================================ FILE: src/VirtualKeyboard.svelte ================================================