diff --git a/distribution/ReleaseNotes.txt b/distribution/ReleaseNotes.txt
index 72aaf1409..7f704e149 100644
--- a/distribution/ReleaseNotes.txt
+++ b/distribution/ReleaseNotes.txt
@@ -14,9 +14,11 @@ Head, planned as v0.25
- The layout shape uses a slightly different algorithm to determine
the pin positions. You may need to adjust usages of embedded circuits
that use the layout shape.
- - The CommandLineTester has moved! Tests are now executed like
+ - The CommandLineTester has moved! Tests are now executed like this:
java -cp Digital.jar CLI test [file to test]
[-tests [optional file with test cases]]
+ - Text formatting was reworked. Disable formatting with a '\' in the
+ beginning does not longer work. Use "\_" to escape a underscore.
v0.24, released on 1. Feb. 2020
- Improved SVG export
diff --git a/src/main/dig/misc/TextFormatExample.dig b/src/main/dig/misc/TextFormatExample.dig
index 6543f3e2b..67589d65a 100644
--- a/src/main/dig/misc/TextFormatExample.dig
+++ b/src/main/dig/misc/TextFormatExample.dig
@@ -11,7 +11,7 @@
~A
-
+
In
@@ -21,7 +21,7 @@
~{A<B}
-
+
In
@@ -31,7 +31,7 @@
s_1^n
-
+
In
@@ -41,7 +41,7 @@
s_1^{n+1}
-
+
In
@@ -51,7 +51,7 @@
~s_1^{n+1}
-
+
In
@@ -61,7 +61,7 @@
~{s_1^{n+1}}
-
+
Text
@@ -74,7 +74,7 @@ of ~{s_1^{n+1}} in detail.
von ~{s_1^{n+1}} im Detail erklärt.}}
-
+
In
@@ -84,7 +84,7 @@ von ~{s_1^{n+1}} im Detail erklärt.}}
~ABC
-
+
In
@@ -94,7 +94,7 @@ von ~{s_1^{n+1}} im Detail erklärt.}}
~{A}BC
-
+
In
@@ -111,11 +111,31 @@ von ~{s_1^{n+1}} im Detail erklärt.}}
Label
- \A_B
+ A\_B
+
+ In
+
+
+ Label
+ A\\B
+
+
+
+
+
+ In
+
+
+ Label
+ \foo
+
+
+
+
diff --git a/src/main/java/de/neemann/digital/draw/graphics/text/Parser.java b/src/main/java/de/neemann/digital/draw/graphics/text/Parser.java
index 55f352e82..0517a7394 100644
--- a/src/main/java/de/neemann/digital/draw/graphics/text/Parser.java
+++ b/src/main/java/de/neemann/digital/draw/graphics/text/Parser.java
@@ -8,14 +8,23 @@ package de.neemann.digital.draw.graphics.text;
import de.neemann.digital.draw.graphics.text.text.*;
import de.neemann.digital.draw.graphics.text.text.Character;
+import java.util.HashMap;
+
/**
* The text parser
*/
public class Parser {
+ private static final HashMap COMMANDS = new HashMap<>();
+
+ static {
+ COMMANDS.put("sum", "∑");
+ COMMANDS.put("prod", "∏");
+ }
private final String text;
private int pos;
+
/**
* Creates a new instance
*
@@ -67,8 +76,6 @@ public class Parser {
* @throws ParseException ParseException
*/
public Text parse() throws ParseException {
- if (text.length() > 0 && text.charAt(0) == '\\')
- return new Simple(text.substring(1).trim());
return parse('\0');
}
@@ -99,6 +106,24 @@ public class Parser {
case '^':
getChar();
sentence.getIndex().addSuper(parseBrace());
+ break;
+ case '\\':
+ getChar();
+ char p = peekChar();
+ switch (p) {
+ case '\\':
+ case '^':
+ case '_':
+ sentence.add(new Character(getChar()));
+ break;
+ default:
+ String command = readWord();
+ String t = COMMANDS.get(command);
+ if (t == null)
+ t = '\\' + command;
+ sentence.add(new Simple(t).simplify());
+ }
+
break;
default:
if (isNormal(peekChar()))
diff --git a/src/main/java/de/neemann/digital/draw/graphics/text/formatter/LaTeXFormatter.java b/src/main/java/de/neemann/digital/draw/graphics/text/formatter/LaTeXFormatter.java
index 75114d904..4a3960e5b 100644
--- a/src/main/java/de/neemann/digital/draw/graphics/text/formatter/LaTeXFormatter.java
+++ b/src/main/java/de/neemann/digital/draw/graphics/text/formatter/LaTeXFormatter.java
@@ -109,6 +109,10 @@ public final class LaTeXFormatter {
return "\\textgreater{}";
case '&':
return "\\&";
+ case '_':
+ return "\\_";
+ case '\\':
+ return "\\\\";
case '∑':
if (inMath)
return "\\sum ";
diff --git a/src/main/java/de/neemann/digital/draw/library/ElementLibrary.java b/src/main/java/de/neemann/digital/draw/library/ElementLibrary.java
index ca6727445..72a208bd1 100644
--- a/src/main/java/de/neemann/digital/draw/library/ElementLibrary.java
+++ b/src/main/java/de/neemann/digital/draw/library/ElementLibrary.java
@@ -597,7 +597,7 @@ public class ElementLibrary implements Iterable
private String createShortName(String name, String userDefined) {
if (userDefined.isEmpty()) {
- if (name.endsWith(".dig")) return "\\" + name.substring(0, name.length() - 4);
+ if (name.endsWith(".dig")) return name.substring(0, name.length() - 4).replace("_", "\\_");
String transName = Lang.getNull("elem_" + name);
if (transName == null)
diff --git a/src/main/java/de/neemann/digital/draw/shapes/ShapeFactory.java b/src/main/java/de/neemann/digital/draw/shapes/ShapeFactory.java
index c74698211..9d7559b47 100644
--- a/src/main/java/de/neemann/digital/draw/shapes/ShapeFactory.java
+++ b/src/main/java/de/neemann/digital/draw/shapes/ShapeFactory.java
@@ -174,7 +174,7 @@ public final class ShapeFactory {
attributes.getLabel(), true, attributes.get(Keys.WIDTH)) {
@Override
public String format(String s) {
- return "\\" + s;
+ return s.replace("_", "\\_");
}
});
diff --git a/src/test/java/de/neemann/digital/draw/graphics/text/ParserTest.java b/src/test/java/de/neemann/digital/draw/graphics/text/ParserTest.java
index dd5f69551..e79a2df76 100644
--- a/src/test/java/de/neemann/digital/draw/graphics/text/ParserTest.java
+++ b/src/test/java/de/neemann/digital/draw/graphics/text/ParserTest.java
@@ -23,6 +23,9 @@ public class ParserTest extends TestCase {
t = new Parser("\\I^n_0").parse();
assertTrue(t instanceof Simple);
assertEquals("I^n_0", ((Simple) t).getText());
+
+ t = new Parser("A\\_B").parse();
+ assertEquals("A_B", t.toString());
}
public void testSimple() throws ParseException {
@@ -43,6 +46,9 @@ public class ParserTest extends TestCase {
assertEquals("Decorate{≥1, MATH}", new Parser("$≥1$").parse().toString());
assertEquals("Decorate{MR, OVERLINE}", new Parser("~MR").parse().toString());
+
+ assertEquals("A=∑ b", new Parser("A=\\sum b").parse().toString());
+ assertEquals("A=∑^{m}_{n=0}", new Parser("A=\\sum_{n=0}^m").parse().toString());
}
}