Skip to content

Commit

Permalink
Merge pull request #275 from mgreminger/improved-output-latex
Browse files Browse the repository at this point in the history
feat: improve latex output
  • Loading branch information
mgreminger authored Sep 17, 2024
2 parents aa264b1 + 68c83ef commit b0d5261
Show file tree
Hide file tree
Showing 13 changed files with 46 additions and 46 deletions.
2 changes: 1 addition & 1 deletion public/dimensional_analysis.py
Original file line number Diff line number Diff line change
Expand Up @@ -875,7 +875,7 @@ def custom_latex(expression: Expr) -> str:
new_expression = expression.replace(Piecewise, piecewise)

try:
result_latex = latex(new_expression)
result_latex = latex(new_expression, ln_notation=True, mul_symbol='dot', inv_trig_style='full')
except ValueError as e:
result_latex = """
\\begin{split}
Expand Down
18 changes: 9 additions & 9 deletions tests/test_basic.spec.mjs
Original file line number Diff line number Diff line change
Expand Up @@ -766,7 +766,7 @@ test('Test function notation with integrals', async () => {
await page.waitForSelector('text=Updating...', {state: 'detached'});

let content = await page.textContent('#result-value-1');
expect(content).toBe('\\frac{b h^{3}}{12}');
expect(content).toBe('\\frac{b \\cdot h^{3}}{12}');
content = await page.textContent('#result-value-2');
expect(parseLatexFloat(content)).toBeCloseTo(2, precision);
content = await page.textContent('#result-value-4');
Expand Down Expand Up @@ -1088,7 +1088,7 @@ test("Test complicated function evaluation", async () => {
let content = await page.textContent('#result-value-4');
expect(parseLatexFloat(content)).toBeCloseTo((-(9.81*(100/1.09361)**2)/(cos(45*pi/180)**2*2*(1200/3.28084)**2)+ (100/1.09361)*tan(45*(45*pi/180)))*3.28084, 2);
content = await page.textContent('#result-value-5');
expect(content).toBe('l w');
expect(content).toBe('l \\cdot w');

});

Expand Down Expand Up @@ -1387,16 +1387,16 @@ test('Negative grouping', async () => {
expect(content).toBe('b');

content = await page.textContent('#result-value-1');
expect(content).toBe('2 a - b');
expect(content).toBe('2 \\cdot a - b');

content = await page.textContent('#result-value-2');
expect(content).toBe('- b');

content = await page.textContent('#result-value-3');
expect(content).toBe('- 2 a - b');
expect(content).toBe('- 2 \\cdot a - b');

content = await page.textContent('#result-value-3');
expect(content).toBe('- 2 a - b');
expect(content).toBe('- 2 \\cdot a - b');
});

test('Negative grouping with fractions', async () => {
Expand All @@ -1418,13 +1418,13 @@ test('Negative grouping with fractions', async () => {
expect(content).toBe('b');

content = await page.textContent('#result-value-1');
expect(content).toBe('2 a - b');
expect(content).toBe('2 \\cdot a - b');

content = await page.textContent('#result-value-3');
expect(content).toBe('- 2 a - b');
expect(content).toBe('- 2 \\cdot a - b');

content = await page.textContent('#result-value-3');
expect(content).toBe('- 2 a - b');
expect(content).toBe('- 2 \\cdot a - b');
});

test('Negative grouping with fractions with negative denominator', async () => {
Expand All @@ -1443,7 +1443,7 @@ test('Negative grouping with fractions with negative denominator', async () => {
await page.waitForSelector('.status-footer', { state: 'detached'});

let content = await page.textContent('#result-value-0');
expect(content).toBe('2 a - b');
expect(content).toBe('2 \\cdot a - b');

content = await page.textContent('#result-value-1');
expect(content).toBe('b');
Expand Down
6 changes: 3 additions & 3 deletions tests/test_calc.spec.mjs
Original file line number Diff line number Diff line change
Expand Up @@ -80,7 +80,7 @@ test('test basic calculus', async () => {
content = await page.textContent('#result-value-2');
expect(parseLatexFloat(content)).toBeCloseTo((10*30**3/12), precision);
content = await page.textContent('#result-value-6');
expect(content).toBe('12 x y');
expect(content).toBe('12 \\cdot x \\cdot y');
content = await page.textContent('#result-value-7');
expect(parseLatexFloat(content)).toBeCloseTo(6, precision);
content = await page.textContent('#result-value-10');
Expand Down Expand Up @@ -190,7 +190,7 @@ test('Test derivative substitution bug #156', async () => {
await page.waitForSelector('.status-footer', {state: 'detached'});

let content = await page.textContent('#result-value-1');
expect(content).toBe('40 x');
expect(content).toBe('40 \\cdot x');

});

Expand Down Expand Up @@ -366,7 +366,7 @@ test('Test derivative substitution order', async () => {
await page.waitForSelector('.status-footer', {state: 'detached'});

let content = await page.textContent('#result-value-0');
expect(content).toBe(String.raw`2 L`);
expect(content).toBe('2 \\cdot L');
});

test('Test numerical integral and derivative using interpolation function', async () => {
Expand Down
2 changes: 1 addition & 1 deletion tests/test_data_table.spec.mjs
Original file line number Diff line number Diff line change
Expand Up @@ -656,7 +656,7 @@ test('Test polyfit (quadratic and linear)', async () => {
await page.waitForSelector('text=Updating...', {state: 'detached'});

content = await page.textContent('#result-value-0');
expect(content).toBe(String.raw`10.0 - 1.0 x`);
expect(content).toBe('10.0 - 1.0 \\cdot x');
content = await page.textContent('#result-units-0');
expect(content).toBe('');
});
Expand Down
2 changes: 1 addition & 1 deletion tests/test_matrix_calc.spec.mjs
Original file line number Diff line number Diff line change
Expand Up @@ -36,5 +36,5 @@ test('Derivative', async () => {
await page.waitForSelector('text=Updating...', {state: 'detached'});

let content = await page.textContent(`#result-value-0`);
expect(content).toBe(String.raw`\begin{bmatrix} 1 & 2 x \\ 3 x^{2} & 4 x^{3} \end{bmatrix}`);
expect(content).toBe('\\begin{bmatrix} 1 & 2 \\cdot x \\\\ 3 \\cdot x^{2} & 4 \\cdot x^{3} \\end{bmatrix}');
});
4 changes: 2 additions & 2 deletions tests/test_matrix_determinant.spec.mjs
Original file line number Diff line number Diff line change
Expand Up @@ -51,7 +51,7 @@ test('Determinant of matrix literal with symbolic entries', async () => {
await page.waitForSelector('text=Updating...', {state: 'detached'});

let content = await page.textContent(`#result-value-0`);
expect(content).toBe('a d - b c');
expect(content).toBe('a \\cdot d - b \\cdot c');
});

test('Determinant of nonsquare matrix', async () => {
Expand All @@ -70,7 +70,7 @@ test('Determinant of variable matrix', async () => {
await page.waitForSelector('text=Updating...', {state: 'detached'});

let content = await page.textContent(`#result-value-0`);
expect(content).toBe('a d - b c');
expect(content).toBe('a \\cdot d - b \\cdot c');
});

test('Determinant of variable matrix with units', async () => {
Expand Down
2 changes: 1 addition & 1 deletion tests/test_matrix_inverse.spec.mjs
Original file line number Diff line number Diff line change
Expand Up @@ -117,7 +117,7 @@ test('Inverse of symbolic matrix', async () => {
await page.waitForSelector('text=Updating...', {state: 'detached'});

let content = await page.textContent(`#result-value-0`);
expect(content).toBe(String.raw`\begin{bmatrix} \frac{d}{a d - b c} & - \frac{b}{a d - b c} \\ - \frac{c}{a d - b c} & \frac{a}{a d - b c} \end{bmatrix}`);
expect(content).toBe('\\begin{bmatrix} \\frac{d}{a \\cdot d - b \\cdot c} & - \\frac{b}{a \\cdot d - b \\cdot c} \\\\ - \\frac{c}{a \\cdot d - b \\cdot c} & \\frac{a}{a \\cdot d - b \\cdot c} \\end{bmatrix}');
});

test('Inverse of large matrix with units', async () => {
Expand Down
2 changes: 1 addition & 1 deletion tests/test_matrix_keyboard.spec.mjs
Original file line number Diff line number Diff line change
Expand Up @@ -93,7 +93,7 @@ test('Matrix virtual keyboard entry', async () => {
await page.waitForSelector('text=Updating...', {state: 'detached'});

let content = await page.textContent(`#result-value-0`);
expect(content).toBe(String.raw`\begin{bmatrix} a c + b d \end{bmatrix}`);
expect(content).toBe('\\begin{bmatrix} a \\cdot c + b \\cdot d \\end{bmatrix}');
});

test('Matrix with more than 10 columns', async () => {
Expand Down
28 changes: 14 additions & 14 deletions tests/test_matrix_multiplication.spec.mjs
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,7 @@ test('Square multiplication', async () => {
await page.waitForSelector('text=Updating...', {state: 'detached'});

let content = await page.textContent(`#result-value-0`);
expect(content).toBe(String.raw`\begin{bmatrix} 5 a + 7 b & 6 a + 8 b \\ 5 c + 7 d & 6 c + 8 d \end{bmatrix}`);
expect(content).toBe('\\begin{bmatrix} 5 \\cdot a + 7 \\cdot b & 6 \\cdot a + 8 \\cdot b \\\\ 5 \\cdot c + 7 \\cdot d & 6 \\cdot c + 8 \\cdot d \\end{bmatrix}');

// add some numbers for variables that define first matrix
await page.locator('#add-math-cell').click();
Expand All @@ -43,7 +43,7 @@ test('Square multiplication with matrix multiplication operator', async () => {
await page.waitForSelector('text=Updating...', {state: 'detached'});

let content = await page.textContent(`#result-value-0`);
expect(content).toBe(String.raw`\begin{bmatrix} 5 a + 7 b & 6 a + 8 b \\ 5 c + 7 d & 6 c + 8 d \end{bmatrix}`);
expect(content).toBe('\\begin{bmatrix} 5 \\cdot a + 7 \\cdot b & 6 \\cdot a + 8 \\cdot b \\\\ 5 \\cdot c + 7 \\cdot d & 6 \\cdot c + 8 \\cdot d \\end{bmatrix}');

// add some numbers for variables that define first matrix
await page.locator('#add-math-cell').click();
Expand Down Expand Up @@ -71,7 +71,7 @@ test('Square variable matrix times literal matrix using matrix multiplication op
await page.waitForSelector('text=Updating...', {state: 'detached'});

let content = await page.textContent(`#result-value-0`);
expect(content).toBe(String.raw`\begin{bmatrix} 5 a + 7 b & 6 a + 8 b \\ 5 c + 7 d & 6 c + 8 d \end{bmatrix}`);
expect(content).toBe('\\begin{bmatrix} 5 \\cdot a + 7 \\cdot b & 6 \\cdot a + 8 \\cdot b \\\\ 5 \\cdot c + 7 \\cdot d & 6 \\cdot c + 8 \\cdot d \\end{bmatrix}');

// add some numbers for variables that define first matrix
await page.locator('#add-math-cell').click();
Expand Down Expand Up @@ -102,7 +102,7 @@ test('Square variable matrix times variable matrix using matrix multiplication o
await page.waitForSelector('text=Updating...', {state: 'detached'});

let content = await page.textContent(`#result-value-0`);
expect(content).toBe(String.raw`\begin{bmatrix} 5 a + 7 b & 6 a + 8 b \\ 5 c + 7 d & 6 c + 8 d \end{bmatrix}`);
expect(content).toBe('\\begin{bmatrix} 5 \\cdot a + 7 \\cdot b & 6 \\cdot a + 8 \\cdot b \\\\ 5 \\cdot c + 7 \\cdot d & 6 \\cdot c + 8 \\cdot d \\end{bmatrix}');

// add some numbers for variables that define first matrix
await page.locator('#add-math-cell').click();
Expand All @@ -127,7 +127,7 @@ test('Units with square multiplication', async () => {
await page.waitForSelector('text=Updating...', {state: 'detached'});

let content = await page.textContent(`#result-value-0`);
expect(content).toBe(String.raw`\begin{bmatrix} 5 a + 7 b & 6 a + 8 b \\ 5 c + 7 d & 6 c + 8 d \end{bmatrix}`);
expect(content).toBe('\\begin{bmatrix} 5 \\cdot a + 7 \\cdot b & 6 \\cdot a + 8 \\cdot b \\\\ 5 \\cdot c + 7 \\cdot d & 6 \\cdot c + 8 \\cdot d \\end{bmatrix}');

// add some numbers for variables that define first matrix
await page.locator('#add-math-cell').click();
Expand All @@ -151,7 +151,7 @@ test('Units with square variable matrix times variable matrix using matrix multi
await page.waitForSelector('text=Updating...', {state: 'detached'});

let content = await page.textContent(`#result-value-0`);
expect(content).toBe(String.raw`\begin{bmatrix} 5 a + 7 b & 6 a + 8 b \\ 5 c + 7 d & 6 c + 8 d \end{bmatrix}`);
expect(content).toBe('\\begin{bmatrix} 5 \\cdot a + 7 \\cdot b & 6 \\cdot a + 8 \\cdot b \\\\ 5 \\cdot c + 7 \\cdot d & 6 \\cdot c + 8 \\cdot d \\end{bmatrix}');

// add some numbers for variables that define first matrix
await page.locator('#add-math-cell').click();
Expand Down Expand Up @@ -182,7 +182,7 @@ test('Mixed compatible units with square variable matrix times variable matrix u
await page.waitForSelector('text=Updating...', {state: 'detached'});

let content = await page.textContent(`#result-value-0`);
expect(content).toBe(String.raw`\begin{bmatrix} 5 a + 7 b & 6 a + 8 b \\ 5 c + 7 d & 6 c + 8 d \end{bmatrix}`);
expect(content).toBe('\\begin{bmatrix} 5 \\cdot a + 7 \\cdot b & 6 \\cdot a + 8 \\cdot b \\\\ 5 \\cdot c + 7 \\cdot d & 6 \\cdot c + 8 \\cdot d \\end{bmatrix}');

// add some numbers for variables that define first matrix
await page.locator('#add-math-cell').click();
Expand Down Expand Up @@ -311,7 +311,7 @@ test('Cross product with column vectors and variable entries', async () => {
await page.waitForSelector('text=Updating...', {state: 'detached'});

let content = await page.textContent(`#result-value-0`);
expect(content).toBe(String.raw`\begin{bmatrix} a_{2} b_{3} - a_{3} b_{2} \\ - a_{1} b_{3} + a_{3} b_{1} \\ a_{1} b_{2} - a_{2} b_{1} \end{bmatrix}`);
expect(content).toBe(String.raw`\begin{bmatrix} a_{2} \cdot b_{3} - a_{3} \cdot b_{2} \\ - a_{1} \cdot b_{3} + a_{3} \cdot b_{1} \\ a_{1} \cdot b_{2} - a_{2} \cdot b_{1} \end{bmatrix}`);
});

test('Cross product with column vectors and numeric entries', async () => {
Expand Down Expand Up @@ -346,7 +346,7 @@ test('Cross product with row vectors and symbolic values', async () => {
await page.waitForSelector('text=Updating...', {state: 'detached'});

let content = await page.textContent(`#result-value-0`);
expect(content).toBe(String.raw`\begin{bmatrix} a_{2} b_{3} - a_{3} b_{2} & - a_{1} b_{3} + a_{3} b_{1} & a_{1} b_{2} - a_{2} b_{1} \end{bmatrix}`);
expect(content).toBe(String.raw`\begin{bmatrix} a_{2} \cdot b_{3} - a_{3} \cdot b_{2} & - a_{1} \cdot b_{3} + a_{3} \cdot b_{1} & a_{1} \cdot b_{2} - a_{2} \cdot b_{1} \end{bmatrix}`);
});

test('Cross product unit cancellation bug #240', async () => {
Expand Down Expand Up @@ -379,7 +379,7 @@ test('Cross product with variable column vectors', async () => {
await page.waitForSelector('text=Updating...', {state: 'detached'});

let content = await page.textContent(`#result-value-0`);
expect(content).toBe(String.raw`\begin{bmatrix} a_{2} b_{3} - a_{3} b_{2} \\ - a_{1} b_{3} + a_{3} b_{1} \\ a_{1} b_{2} - a_{2} b_{1} \end{bmatrix}`);
expect(content).toBe(String.raw`\begin{bmatrix} a_{2} \cdot b_{3} - a_{3} \cdot b_{2} \\ - a_{1} \cdot b_{3} + a_{3} \cdot b_{1} \\ a_{1} \cdot b_{2} - a_{2} \cdot b_{1} \end{bmatrix}`);
});

test('Dot product with column vectors and symbolic entries', async () => {
Expand All @@ -388,7 +388,7 @@ test('Dot product with column vectors and symbolic entries', async () => {
await page.waitForSelector('text=Updating...', {state: 'detached'});

let content = await page.textContent(`#result-value-0`);
expect(content).toBe(String.raw`a_{1} b_{1} + a_{2} b_{2} + a_{3} b_{3}`);
expect(content).toBe(String.raw`a_{1} \cdot b_{1} + a_{2} \cdot b_{2} + a_{3} \cdot b_{3}`);
});

test('Dot product with variable column vectors', async () => {
Expand All @@ -412,13 +412,13 @@ test('Dot product with variable column vectors', async () => {
await page.waitForSelector('text=Updating...', {state: 'detached'});

let content = await page.textContent(`#result-value-0`);
expect(content).toBe(String.raw`a_{1} b_{1} + a_{2} b_{2} + a_{3} b_{3}`);
expect(content).toBe(String.raw`a_{1} \cdot b_{1} + a_{2} \cdot b_{2} + a_{3} \cdot b_{3}`);

content = await page.textContent(`#result-value-1`);
expect(content).toBe(String.raw`a_{1} b_{1} + a_{2} b_{2} + a_{3} b_{3}`);
expect(content).toBe(String.raw`a_{1} \cdot b_{1} + a_{2} \cdot b_{2} + a_{3} \cdot b_{3}`);

content = await page.textContent(`#result-value-2`);
expect(content).toBe(String.raw`a_{1} b_{1} + a_{2} b_{2} + a_{3} b_{3}`);
expect(content).toBe(String.raw`a_{1} \cdot b_{1} + a_{2} \cdot b_{2} + a_{3} \cdot b_{3}`);
});

test('Dot product with incompatible matrix dimensions', async () => {
Expand Down
2 changes: 1 addition & 1 deletion tests/test_matrix_transpose.spec.mjs
Original file line number Diff line number Diff line change
Expand Up @@ -56,5 +56,5 @@ test('Column and row matrix transpose', async () => {
await page.waitForSelector('text=Updating...', {state: 'detached'});

let content = await page.textContent(`#result-value-0`);
expect(content).toBe(String.raw`\begin{bmatrix} a c + b d \end{bmatrix}`);
expect(content).toBe('\\begin{bmatrix} a \\cdot c + b \\cdot d \\end{bmatrix}');
});
10 changes: 5 additions & 5 deletions tests/test_number_format.spec.mjs
Original file line number Diff line number Diff line change
Expand Up @@ -75,15 +75,15 @@ test('Test symbolic format', async () => {
await page.getByRole('button', { name: 'Confirm' }).click();

content = await page.textContent('#result-value-0');
expect(content).toBe('2 \\pi')
expect(content).toBe('2 \\cdot \\pi')

content = await page.textContent('#result-value-1');
expect(content).toBe('- 2000 \\pi');
expect(content).toBe('- 2000 \\cdot \\pi');
content = await page.textContent('#result-units-1');
expect(content).toBe('m');

content = await page.textContent('#result-value-2');
expect(content).toBe(String.raw`- \frac{3 \sqrt{2}}{2000}`);
expect(content).toBe(String.raw`- \frac{3 \cdot \sqrt{2}}{2000}`);
content = await page.textContent('#result-units-2');
expect(content).toBe('m');

Expand All @@ -108,7 +108,7 @@ test('Test disabling automatic expressions simplification', async () => {

// check query result in cell 1
content = await page.textContent('#result-value-0');
expect(content).toBe(String.raw`- F - F_{B} - F_{W} - \frac{F l_{4} - F_{B} l_{2} + F_{W} l_{3}}{l_{1} + l_{2}} + \frac{F l_{1} + F l_{2} + F l_{4} + F_{B} l_{1} + F_{W} l_{1} + F_{W} l_{2} + F_{W} l_{3}}{l_{1} + l_{2}}`);
expect(content).toBe(String.raw`- F - F_{B} - F_{W} - \frac{F \cdot l_{4} - F_{B} \cdot l_{2} + F_{W} \cdot l_{3}}{l_{1} + l_{2}} + \frac{F \cdot l_{1} + F \cdot l_{2} + F \cdot l_{4} + F_{B} \cdot l_{1} + F_{W} \cdot l_{1} + F_{W} \cdot l_{2} + F_{W} \cdot l_{3}}{l_{1} + l_{2}}`);

});

Expand Down Expand Up @@ -653,5 +653,5 @@ test('Test intermediate results with only symbolic values', async () => {

// there should be no intermediate result
let content = await page.textContent('#result-value-0');
expect(content).toBe(String.raw`x y`);
expect(content).toBe(String.raw`x \cdot y`);
});
8 changes: 4 additions & 4 deletions tests/test_syntax_error_messages.spec.mjs
Original file line number Diff line number Diff line change
Expand Up @@ -188,7 +188,7 @@ test('Error auto correcting of unintended extra mathrm', async () => {
await page.waitForSelector('text=Updating...', {state: 'detached'});

let content = await page.textContent(`#result-value-0`);
expect(content).toBe(String.raw`a \operatorname{myfunc}{\left(1 \right)}`);
expect(content).toBe('a \\cdot \\operatorname{myfunc}{\\left(1 \\right)}');


await page.setLatex(0, String.raw`\mathrm{myfunc}\left(1\right)=`);
Expand All @@ -201,7 +201,7 @@ test('Error auto correcting of unintended extra mathrm', async () => {
await page.waitForSelector('text=Updating...', {state: 'detached'});

content = await page.textContent(`#result-value-0`);
expect(content).toBe(String.raw`2 \operatorname{myfunc}{\left(1 \right)}`);
expect(content).toBe(String.raw`2 \cdot \operatorname{myfunc}{\left(1 \right)}`);


await page.setLatex(0, String.raw`\mathrm{myfunc}\left(1\right)=`);
Expand Down Expand Up @@ -242,7 +242,7 @@ test('Error auto correcting of unintended extra mathrm', async () => {
await page.waitForSelector('text=Updating...', {state: 'detached'});

content = await page.textContent(`#result-value-0`);
expect(content).toBe(String.raw`\frac{a + b \operatorname{myfunc}{\left(1 \right)}}{b}`);
expect(content).toBe(String.raw`\frac{a + b \cdot \operatorname{myfunc}{\left(1 \right)}}{b}`);


await page.setLatex(0, String.raw`\mathrm{myfunc}\left(1\right)=`);
Expand All @@ -257,5 +257,5 @@ test('Error auto correcting of unintended extra mathrm', async () => {
await page.waitForSelector('text=Updating...', {state: 'detached'});

content = await page.textContent(`#result-value-0`);
expect(content).toBe(String.raw`\frac{a + b \operatorname{myfunc}{\left(1 \right)}}{b}`);
expect(content).toBe(String.raw`\frac{a + b \cdot \operatorname{myfunc}{\left(1 \right)}}{b}`);
});
6 changes: 3 additions & 3 deletions tests/test_system_solve.spec.mjs
Original file line number Diff line number Diff line change
Expand Up @@ -270,7 +270,7 @@ test("Test case where all solutions don't have results for the same variables",
content = await page.textContent('#result-value-1');
expect(content).toBe('m');
content = await page.textContent('#result-value-2');
expect(content).toBe(`- \\sqrt{2} \\sqrt{g h}`);
expect(content).toBe('- \\sqrt{2} \\cdot \\sqrt{g \\cdot h}');

// third solution
await page.locator('#solution-radio-0-2').click();
Expand All @@ -279,7 +279,7 @@ test("Test case where all solutions don't have results for the same variables",
content = await page.textContent('#result-value-1');
expect(content).toBe('m');
content = await page.textContent('#result-value-2');
expect(content).toBe(`\\sqrt{2} \\sqrt{g h}`);
expect(content).toBe(`\\sqrt{2} \\cdot \\sqrt{g \\cdot h}`);
});

test('Test function notation with equation solving and combined function/assignment and expression as argument for function', async () => {
Expand Down Expand Up @@ -363,7 +363,7 @@ test('Test system with 5 equations', async () => {

// check Rb
let content = await page.textContent('#result-value-3');
expect(content).toBe(`\\frac{3 l q}{8}`);
expect(content).toBe(`\\frac{3 \\cdot l \\cdot q}{8}`);

// add function query that depends on solution
await page.click("#add-math-cell");
Expand Down

0 comments on commit b0d5261

Please sign in to comment.