addFrac method
void
addFrac(
- TeXFunction frac
Adds a fraction to the current node.
There are two options: Either we divide the previous term, or we add an empty frac.
Implementation
void addFrac(TeXFunction frac) {
// We first want to divide the list with children at the current courser
// position. This way, we can always look at the last element in the list,
// when taking the numerator, and don't need to keep track of the index.
final tail = currentNode.children.sublist(currentNode.courserPosition);
currentNode.children
.removeRange(currentNode.courserPosition, currentNode.children.length);
// Expressions that indicate operators.
final operators = ['+', '-', r'\cdot', r'\div'];
// We need to determine whether we want to append an empty fraction or
// divide the last expression, therefore keep it as the numerator.
var keepNumerator = true;
// There are 3 cases where we want to append a clean fraction, and therefore
// don't keep a numerator.
// CASE 1: The current node is empty.
if (currentNode.children.isEmpty) {
keepNumerator = false;
}
// CASE 2: The tex symbol before is a opening parenthesis.
else if (currentNode.children.last.expression.endsWith('(')) {
keepNumerator = false;
}
// CASE 3: The tex symbol before is an operator.
else if (operators.contains(currentNode.children.last.expression)) {
keepNumerator = false;
}
// If the goal is to divide the previous expression, we want to remove this
// part from the current node and use it as the first argument of the frac.
if (keepNumerator) {
_takeNumerator(frac);
// We then need to set the courserPosition to the new length of the
// current node's children list.
currentNode.courserPosition = currentNode.children.length;
}
currentNode.addTeX(frac);
// We know want to add all elements that we saved earlier to the end of
// the list.
currentNode.children.addAll(tail);
// If we took the numerator, we want to jump straight into the second
// argument.
currentNode = frac.argNodes[keepNumerator ? 1 : 0];
}