mathlive icon indicating copy to clipboard operation
mathlive copied to clipboard

feat: Newline command

Open zeyad-ahmad-aql opened this issue 1 year ago • 6 comments

  • Added newline command \\. Inspired by KaTeX.
  • Added feature to add new line on enter press.
  • In virtual keyboard, replace [action] key with [return] key. Also, pressing return adds new line, pressing shift + return performs commit action.

zeyad-ahmad-aql avatar Apr 16 '23 12:04 zeyad-ahmad-aql

I don't think the default behavior of return should be a newline - it's just not the expected behavior in most cases. Though unreleased, alt + return will create a lines environment, which seems like what you're looking for.

WildYellowfin avatar Apr 16 '23 13:04 WildYellowfin

Thanks for the PR! This is something I was just thinking about. This convention of interpreting \\ as a new line even when outside of environments seems pretty common, and it makes sense.

I would go a bit differently on the implementation, though. I think using the lines environment that was recently added would be better. It would give you the benefits of being in an environment, such as keyboard navigation with up/down arrows, being able to control the height of lines (with \\[18mu]), supporting the existing keybinding to add a line before or after the current one and being able to convert to other environments (by adding a column, for example). It would also avoid introducing a new kind of atom.

The lines environment currently serializes to \begin{lines}...\end{lines} but I was thinking of changing that so that it would serialize to just its body (i.e. the rows, separated by \\). The trick would then be to recognize a \\ at the root while parsing and automatically interpret the root as if a \begin{lines}...\end{lines} had been present.

I agree with James that the return/action should not add a line by default. Maybe that can be an option (multiline attribute?).

A few other comments:

  • in core-definitions/symbols.ts you call both newSymbols() and defineFunction(). You should only call defineFunction(). newSymbols() is to define commands that are not functions, i.e. that do not have arguments and map to a plain literal.
  • the e2e tests are currently failing. It looks likes there's a \\ added at the end of serialization. This might be related to the superfluous call to newSymbols()

arnog avatar Apr 16 '23 15:04 arnog

@arnog Hello! I noticed you're considering the \lines environment for your project. I'd like to recommend using the Gathered environment instead, as it is well-supported by both MathJax and KaTeX. Unfortunately, the lines environment is not currently supported in KaTeX, which may lead to compatibility issues.

By opting for the Gathered environment, you can ensure seamless integration with MathJax and KaTeX, providing a more robust and user-friendly solution for your mathematical expressions.

michelmar avatar Apr 19 '23 19:04 michelmar

@michelmar indeed, the lines environment has been added to MathLive. Unless I'm mistaken, gathered is center-aligned. I couldn't find a "standard" multiline environment that was left-aligned. Another option would be to use the \displaylines command.

arnog avatar Apr 19 '23 22:04 arnog

@arnog @michelmar my suggestion would be to serialize lines as:

\begin{align*}
  & row_1 \\
  & row_2 
\end{align*}

Which will produce left aligned equations in standard latex environments. It may be possible to replace the lines environment with an align environment, but it would need to change the default column spacing (try pasting the above in a mathfield and you will see a gap).

WildYellowfin avatar Apr 19 '23 23:04 WildYellowfin

@arnog I understand the challenge you're facing in finding a suitable environment for your multiline math expressions. I was thinking in using the matrix environment, but it is primarily designed for matrices, which might not be the best for most use cases. But the behavior of creating a new pmatrix with each new line within parentheses is logical within the context of matrix formatting, so we could think in use the matrix environment instead.

Creating a custom environment in KaTeX would have been a great solution, but as you've noted, this feature is currently not supported. Therefore, the workaround I'm considering is building a parser that converts the lines environment into either a gathered or equation* environment.

I remember that in the past, the default behavior of copying an equation on mathlive was to add an equation* environment, but I don't know if this persists.

I don't really know what the best choice, but this feature is really awesome. I'm thinking to use mathlive to render my static math as well, but I don't have any comparison, if it is slower, I know that it uses the same font. And I'm using a nextJS application and sometimes I have some issues with mathlive in SSR.

michelmar avatar Apr 19 '23 23:04 michelmar