diff --git a/src/main/java/de/prob2/jupyter/ProBKernel.java b/src/main/java/de/prob2/jupyter/ProBKernel.java index 6872fbf4619559dee4284a59b1014067fc29b243..920481204c5facf14a68cd264a4073a626d4c385 100644 --- a/src/main/java/de/prob2/jupyter/ProBKernel.java +++ b/src/main/java/de/prob2/jupyter/ProBKernel.java @@ -64,6 +64,7 @@ public final class ProBKernel extends BaseKernel { private static final @NotNull Pattern COMMAND_PATTERN = Pattern.compile("\\s*(\\:[^\\s]*)(?:\\h*(.*))?", Pattern.DOTALL); private static final @NotNull Pattern SPACE_PATTERN = Pattern.compile("\\s*"); private static final @NotNull Pattern BSYMB_COMMAND_PATTERN = Pattern.compile("\\\\([a-z]+)"); + private static final @NotNull Pattern LATEX_FORMULA_PATTERN = Pattern.compile("(\\$\\$?)([^\\$]+)\\1"); private static final @NotNull Map<@NotNull String, @NotNull String> BSYMB_COMMAND_DEFINITIONS; static { @@ -185,8 +186,23 @@ public final class ProBKernel extends BaseKernel { } if (defs.length() > 0) { - return "$" + defs + "$\n" + markdown; + // Find the first LaTeX formula in the output and add the definitions to it. + final Matcher latexFormulaMatcher = LATEX_FORMULA_PATTERN.matcher(markdown); + if (latexFormulaMatcher.find()) { + // We do this manually instead of using Matcher.replaceFirst to prevent backslashes from being processed. + return markdown.substring(0, latexFormulaMatcher.start()) + + latexFormulaMatcher.group(1) + + defs + + latexFormulaMatcher.group(2) + + latexFormulaMatcher.group(1) + + markdown.substring(latexFormulaMatcher.end()); + } else { + // No LaTeX formula found, add an extra one at the start. + // This can produce an unwanted empty line at the start, so we avoid this method if possible. + return "$" + defs + "$\n\n" + markdown; + } } else { + // No definitions needed, so don't modify the output. return markdown; } }