Mathjax render issues on combination of bmatrix from jekyll with kramdown - jekyll

I use jekyll to build a static blog with kramdown and use mathjax to render the LaTeX equation in markdown files.
To make mathjax work for all files I write mathjax in _layout/default.html where add following:
<script type="text/x-mathjax-config">
MathJax.Hub.Config({
extensions: [
"tex2jax.js",
"MathMenu.js",
"MathZoom.js",
"AssistiveMML.js",
"a11y/accessibility-menu.js"
],
tex2jax: {
inlineMath: [['$', '$']],
displayMath: [['$$', '$$']]
},
jax: ["input/TeX", "output/CommonHTML"],
TeX: {
extensions: [
"AMSmath.js",
"AMSsymbols.js",
"noErrors.js",
"noUndefined.js",
]
}
});
</script>
<script type="text/javascript" src="http://cdn.mathjax.org/mathjax/latest/MathJax.js?config=TeX-AMS-MML_HTMLorMML"></script>
A quick example, I can render
$(a_n)_{n=1}^{\infty}$
but failed:
$(a_n)_{n=1}^{\infty} = (a_n)_{n=1}^{\infty}$
It also appear in other equation, e.g.
the equation I exactly write is:
$(1 / \sqrt{n}) 1_n$ \: $ d_i = Y_i - \bar X_i 1_n = \begin{bmatrix} y_{i1} - \bar x_i \\\ y_{i2} - \bar x_i \\\ \vdots \\\ y_{in} - \bar x_i \end{bmatrix}$
But I separate them such as (first part with colon on the first line):
We also have deviation vectore which the collection of the distance of each element from $Y_i$ to its projection on $(1 / \sqrt{n}) 1_n$:
$d_i = Y_i - \bar X_i 1_n =$
$\begin{bmatrix} y_{i1} - \bar x_i \\\ y_{i2} - \bar x_i \\\ \vdots \\\ y_{in} - \bar x_i \end{bmatrix}$
then each of them renders correctly:
I wonder why and how can I fix it :(
For reference, see also my Markdown on GitHub and my page.

Markdown uses underscores to produce italics, and in systems that don't protect the mathematics from being processed by markdown, that can lead to HTML tags being inserted in the middle of the mathematics. Note that in your screen shot of the un-typeset mathematics, the underscore for 1_n is missing, and the text following it, up to the missing underscore for y_{i1} are in italics. That means Markdown has processed and removed this underscores and inserted tags to produce italics. Since MathJax doesn't process math containing HTML tags, that is why the math isn't being processed. See the MathJax documentation for more details.
One solution is to use \_ rather than _ for the underscores, as that will prevent Markdown from processing them, and they will be sent to MathJax as plain underscores.

Related

How to stop Kramdown from removing indents in code blocks?

When rendering Python codeblocks on my Jekyll site, Kramdown removes all of the indents.
The code:
from sort.AbstractSort import AbstractSort
class BubbleSort(AbstractSort):
#staticmethod
def swap(arr, i, j):
arr[i], arr[j] = arr[j], arr[i]
def _sort(self, arr):
for i in range(len(arr) - 1):
for j in range(len(arr) - 1):
if arr[j] > arr[j + 1]:
BubbleSort.swap(arr, j, j + 1)
return arr
Kramdown render:
Kramdown doesn't have the best documentation and I couldn't find any obvious settings that I should change in _config.yaml of my Jekyll site.
I'm hosting the site on GitHub pages.
If it is not possible, maybe I should change to a different rendered? But then this is also poorly documented and my attempts to switch to GFM had failed.
As Benjamin W. have written, this is due to bad CSS configuration in assets/css/style.css.
To solve the problem, change:
pre code {
...
white-space: pre-line !important;
...
}
to
pre code {
...
white-space: pre !important;
...
}
solves the problem.

Chrome console backslash with numbers

Why is chrome console converting numbers preceeded by backslash to unicode or in some cases - to special characters like "\b, \t, \f" etc.? In case of \8 and \9 it is even returning just the numbers itself? What is the logic behind this?
You can test it by opening console in chrome and just typing strings.
Here are some examples:
"\0" - outputs "\u0000"
"\1" - outputs "\u0001"
"\2" - outputs "\u0002"
"\3" - outputs "\u0003"
"\4" - outputs "\u0004"
"\5" - outputs "\u0005"
"\6" - outputs "\u0006"
"\7" - outputs "\u0007"
"\8" - outputs "8" ???
"\9" - outputs "9" ???
"\10" - outputs "\b"
"\11" - outputs "\t"
"\12" - outputs "\n"
"\13" - outputs "\u000b"
"\14" - outputs "\f"
"\15" - outputs "\r"
"\16" - outputs "\u000e"
"\17" - outputs "\u000f"
"\18" - outputs "\u00018"
"\19" - outputs "\u00019"
"\20" - outputs "\u00010"
This is problably because \8 and \9 are invalid octal escape sequences in javascript.
\[0-7], \[0-7][0-7], and \[0-7][0-7][0-7] are octal escape sequences, which is obvious at \10 (octal) == \u0008 (hex/unicode) == \b (backspace).
For me, the strange thing is that \18 is not treated as an invalid octal escape sequence, but as hexadecimal...

LISP: how to properly encode a slash ("/") with cl-json?

I have code that uses the cl-json library to add a line, {"main" : "build/electron.js"} to a package.json file:
(let ((package-json-pathname (merge-pathnames *app-pathname* "package.json")))
(let
((new-json (with-open-file (package-json package-json-pathname :direction :input :if-does-not-exist :error)
(let ((decoded-package (json:decode-json package-json)))
(let ((main-entry (assoc :main decoded-package)))
(if (null main-entry)
(push '(:main . "build/electron.js") decoded-package)
(setf (cdr main-entry) "build/electron.js"))
decoded-package)))))
(with-open-file (package-json package-json-pathname :direction :output :if-exists :supersede)
(json:encode-json new-json package-json))
)
)
The code works, but the result has an escaped slash:
"main":"build\/electron.js"
I'm sure this is a simple thing, but no matter which inputs I try -- "//", "/", "#//" -- I still get the escaped slash.
How do I just get a normal slash in my output?
Also, I'm not sure if there's a trivial way for me to get pretty-printed output, or if I need to write a function that does this; right now the output prints the entire package.json file to a single line.
Special characters
The JSON Spec indicates that "Any character may be escaped.", but some of them MUST be escaped: "quotation mark, reverse solidus, and the control characters". The linked section is followed by a grammar that show "solidus" (/) in the list of escaped characters. I don't think it is really important in practice (typically it needs not be escaped), but that may explain why the library escapes this character.
How to avoid escaping
cl-json relies on an internal list of escaped characters named +json-lisp-escaped-chars+, namely:
(defparameter +json-lisp-escaped-chars+
'((#\" . #\")
(#\\ . #\\)
(#\/ . #\/)
(#\b . #\Backspace)
(#\f . #\)
(#\n . #\Newline)
(#\r . #\Return)
(#\t . #\Tab)
(#\u . (4 . 16)))
"Mapping between JSON String escape sequences and Lisp chars.")
The symbol is not exported, but you can still refer to it externally with ::. You can dynamically rebind the parameter around the code that needs to use a different list of escaped characters; for example, you can do as follows:
(let ((cl-json::+json-lisp-escaped-chars+
(remove #\/ cl-json::+json-lisp-escaped-chars+ :key #'car)))
(cl-json:encode-json-plist '("x" "1/5")))
This prints:
{"x":"1/5"}

Mathjax being parsed with Jekyll

I have been trying for a while now to get MathJax to render properly using Jekyll.
I have tried several parsers (regular, kramdown and redcarpet) but none seem to do what I want. I have also tried all the solution mentioned here: Using MathJax with Jekyll
The problem is that I am using rules to write down some equations. I have created a minimal working example using plain html, to make sure that my code is actually valid. You can see that here: http://call-cc.be/files/example.html
I just want to display that exact code (well, ill change it once it works) on my jekyll-generated website.
However, the parser is reading through the mathjax and complaining about liquid tags not being closed:
Configuration file: /Users/m1dnight/vcs/cdetroye.github.io/_config.yml
Source: /Users/m1dnight/vcs/cdetroye.github.io
Destination: /Users/m1dnight/vcs/cdetroye.github.io/_site
Incremental build: disabled. Enable with --incremental
Generating...
Liquid Exception: Liquid syntax error: Variable '{{#1}' was not properly terminated with regexp: /\}\}/ in /Users/m1dnight/vcs/cdetroye.github.io/_posts/2015-11-11-stlc.md
jekyll 3.0.1 | Error: Liquid syntax error: Variable '{{#1}' was not properly terminated with regexp: /\}\}/
In addition to the solutions I tried mentioned above, I have tried putting the code in {%raw%} tags and that just rendered the actual mathjax code, including some <p> here and there.
Another solution I tried was this plugin I found, but again, to no avail. https://gist.github.com/jessykate/834610
The full post I am trying to render is shown below. Watch out, is rather lenghty.
---
layout: post
title: Work goddamnit
---
Foo bar bar
<div>
$$
\newcommand{\lolli}{\multimap}
\newcommand{\tensor}{\otimes}
\newcommand{\with}{\&}
\newcommand{\all}[2]{\forall {#1}.\;{#2}}
\newcommand{\fix}[2]{\mu {#1}.\;{#2}}
\newcommand{\letv}[3]{\mathsf{let}\,{#1} = {#2}\;\mathsf{in}\;{#3}}
\newcommand{\Fun}[2]{\Lambda {#1}.\;{#2}}
\newcommand{\fun}[2]{\lambda {#1}.\;{#2}}
\newcommand{\unit}{\left(\right)}
\newcommand{\letunit}[2]{\letv{\unit}{#1}{#2}}
\newcommand{\pair}[2]{\left({#1},{#2}\right)}
\newcommand{\letpair}[4]{\letv{\pair{#1}{#2}}{#3}{#4}}
\newcommand{\unita}{\left[\right]}
\newcommand{\paira}[2]{\left[{#1}, {#2}\right]}
\newcommand{\fst}[1]{\mathsf{fst}\,{#1}}
\newcommand{\snd}[1]{\mathsf{snd}\,{#1}}
\newcommand{\inl}[1]{\mathsf{inl}\,{#1}}
\newcommand{\inr}[1]{\mathsf{inr}\,{#1}}
\newcommand{\case}[5]{\mathsf{case}({#1}, \inl{#2} \to {#3}, \inr{#4} \to {#5})}
\newcommand{\abort}[1]{\mathsf{abort}\,{#1}}
\newcommand{\fold}[1]{\mathsf{in}\,{#1}}
\newcommand{\unfold}[1]{\mathsf{out}\,{#1}}
\newcommand{\judge}[4]{{#1};{#2} \vdash {#3} : {#4}}
\newcommand{\judgetp}[2]{{#1} \vdash {#2} : \mathsf{type}}
\newcommand{\judgectx}[2]{{#1} \vdash {#2} : \mathsf{ctx}}
%% Rule names
\newcommand{\rulename}[3]{{#2}{\mathrm{#3}}_{\mathrm{#1}}}
\newcommand{\intro}[2][]{\rulename{#1}{#2}{I}}
\newcommand{\elim}[2][]{\rulename{#1}{#2}{E}}
\newcommand{\Var}{\rulename{}{}{Var}}
\newcommand{\AllI}{\intro{\forall}}
\newcommand{\AllE}{\elim{\forall}}
\newcommand{\LolliI}{\intro{\lolli}}
\newcommand{\LolliE}{\elim{\lolli}}
\newcommand{\UnitI}{\intro{1}}
\newcommand{\UnitE}{\elim{1}}
\newcommand{\TensorI}{\intro{\tensor}}
\newcommand{\TensorE}{\elim{\tensor}}
\newcommand{\TopI}{\intro{\top}}
\newcommand{\TopE}{\elim{\top}}
\newcommand{\WithI}{\intro{\with}}
\newcommand{\WithEFst}{\elim[fst]{\with}}
\newcommand{\WithESnd}{\elim[snd]{\with}}
\newcommand{\ZeroI}{\intro{0}}
\newcommand{\ZeroE}{\elim{0}}
\newcommand{\SumIInl}{\intro[inl]{\oplus}}
\newcommand{\SumIInr}{\intro[inr]{\oplus}}
\newcommand{\SumE}{\elim{\oplus}}
\newcommand{\MuI}{\intro{\mu}}
\newcommand{\MuE}{\elim{\mu}}
\newcommand{\size}[1]{\left|#1\right|}
\newcommand{\inferrule}[3][]{\frac{#2}{#3}\;{#1}}
$$
$$
\boxed{\judge{\Delta}{\Gamma}{e}{A}}
\\
\inferrule[\Var]
{ }
{\judge{\Delta}{x:A}{x}{A}}
\\
\begin{array}{cc}
\inferrule[\AllI]
{\judge{\Delta, \alpha}{\Gamma}{e}{A}}
{\judge{\Delta}{\Gamma}{\Fun{\alpha}{e}}{\all{\alpha}{A}}}
&
\inferrule[\AllE]
{\judge{\Delta}{\Gamma}{e}{\all{\alpha}{B}} \\
\judgetp{\Delta}{A}}
{\judge{\Delta}{\Gamma}{e\;A}{[A/\alpha]B}}
\\[2em]
\inferrule[\LolliI]
{\judge{\Delta}{\Gamma, x:A}{e}{B}}
{\judge{\Delta}{\Gamma}{\fun{x:A}{e}}{A \to B}}
&
\inferrule[\LolliE]
{\judge{\Delta}{\Gamma}{e}{A \to B} \\
\judge{\Delta}{\Gamma'}{e'}{A}}
{\judge{\Delta}{\Gamma,\Gamma'}{e\;e'}{B}}
\\[2em]
\inferrule[\UnitI]
{ }
{\judge{\Delta}{\cdot}{\unit}{1}}
&
\inferrule[\UnitE]
{\judge{\Delta}{\Gamma}{e}{1} \\
\judge{\Delta}{\Gamma'}{e'}{C}}
{\judge{\Delta}{\Gamma,\Gamma'}{\letunit{e}{e'}}{C}}
\\[2em]
\inferrule[\TensorI]
{\judge{\Delta}{\Gamma}{e}{A} \\
\judge{\Delta}{\Gamma'}{e'}{B} }
{\judge{\Delta}{\Gamma,\Gamma'}{\pair{e}{e'}}{A \tensor B}}
&
\inferrule[\TensorE]
{\judge{\Delta}{\Gamma}{e}{A \tensor B} \\\\
\judge{\Delta}{\Gamma', x:A, y:B}{e'}{C}}
{\judge{\Delta}{\Gamma,\Gamma'}{\letpair{x}{y}{e}{e'}}{C}}
\\[2em]
\inferrule[\TopI]
{ }
{\judge{\Delta}{\Gamma}{\unita}{\top}}
&
\\[1em]
\inferrule[\WithI]
{\judge{\Delta}{\Gamma}{e}{A} \\
\judge{\Delta}{\Gamma}{e'}{B} }
{\judge{\Delta}{\Gamma}{\paira{e}{e'}}{A \with B}}
&
\begin{array}{l}
\inferrule[\WithEFst]
{\judge{\Delta}{\Gamma}{e}{A \with B}}
{\judge{\Delta}{\Gamma}{\fst{e}}{A}}
\\[1em]
\inferrule[\WithESnd]
{\judge{\Delta}{\Gamma}{e}{A \with B}}
{\judge{\Delta}{\Gamma}{\snd{e}}{B}}
\end{array}
\\[3em]
\begin{array}{l}
\inferrule[\SumIInl]
{\judge{\Delta}{\Gamma}{e}{A }}
{\judge{\Delta}{\Gamma}{\inl{e}}{A \oplus B}}
\\[1em]
\inferrule[\SumIInr]
{\judge{\Delta}{\Gamma}{e}{ B}}
{\judge{\Delta}{\Gamma}{\inr{e}}{A \oplus B}}
\end{array}
&
\begin{array}{l}
\inferrule[\SumE]
{\judge{\Delta}{\Gamma}{e}{A \oplus B} \\\\
\judge{\Delta}{\Gamma', x:A}{e'}{C} \\\\
\judge{\Delta}{\Gamma', y:B}{e''}{C} }
{\judge{\Delta}{\Gamma, \Gamma'}{\case{e}{x}{e'}{y}{e''}}{C}}
\end{array}
\\[3em]
&
\inferrule[\ZeroE]
{\judge{\Delta}{\Gamma}{e}{0}}
{\judge{\Delta}{\Gamma}{\abort{e}}{C}}
\end{array}
$$
$$a^2 + b^2 = c^2$$
$$
\begin{array}{lcl}
(\Fun{\alpha}{e})\;A & \mapsto & [A/\alpha]e \\
(\fun{x:A}{e})\;e' & \mapsto & [e'/x]e \\
\letv{\unit}{\unit}{e'} & \mapsto & e' \\
\letv{\pair{x}{y}}{\pair{e_1}{e_2}}{e'} & \mapsto & [e_1/x, e_2/y]e' \\
\fst{\paira{e}{e'}} & \mapsto & e \\
\snd{\paira{e}{e'}} & \mapsto & e' \\
\case{\inl{e}}{x}{e'}{y}{e''} & \mapsto & [e/x]e' \\
\case{\inr{e}}{x}{e'}{y}{e''} & \mapsto & [e/y]e'' \\
\end{array}
$$</div>
The end.
We have two problems here :
Liquid is parsing you code because of the brace. We make use of {% raw %}{% endraw %} tag.
Kramdown is also parsing your mathjax as code and embed it in
<div class="highlighter-rouge"><pre class="highlight"><code>
Your code here
</code></pre></div>
This is because your code is indented four spaces or more.
To avoid this you can remove indentation or make use of the {::nomarkdown}{:/} tag.
This definitely resolve this issue :
{% raw %}{::nomarkdown}
<div>
$$
\newcommand{\lolli}{\multimap}
\newcommand{\tensor}{\otimes}
... More mathjax here
$$
</div>
{:/}{% endraw %}

regex to replace '\\' by <br> but only outside some tags

I am new to regex and have been struggling for a while on this one: I want to transform LaTeX files to HTML.
I use mathjax to render equations and some javascript replace functions to convert the tags. I have nearly finished, but I still have an issue with the line breaks: I need to transform \\ to <br>, but only outside the tags \begin{array} and \end{array}.
Example: in this portion, only the \\ before Montrer l'equivalence should be replaced.
$M=\left(
\begin{array}{c|c}
A &B \\ \hline
C &D \\
\end{array}
\right)$
$in$ $\mathcal{M}_{n}(\mathbb{K})$ avec $A$ $\in$ $\mathcal{M}_{r}(\mathbb{K})$ inversible.\\ Montrer l'equivalence:
\[
\Bigl( rg(A) = rg(M) \Bigr) \Leftrightarrow \Bigl( D = CA^{-1}B \Bigr)
\]
\begin{enumerate}
\item Calculer $detB$ en fontion de $A$.
\item En déduire que $detB \geqslant 0$.
\end{enumerate}
$M=
\left(
\begin{array}{c|c}
A &B \\ \hline
C &D \\
\end{array}
\right)$
How can I do this with regex ?
EDIT: I have found here a handy regex tester...
You can use this pattern in a replace with a callback function that return the first capture group or <br> when it is void:
/(\\begin{array}(?:[^\\]+|\\(?!end{array}))*\\end{array})|\\\\/
The idea is to match \begin{array}...\end{array} before \\ to avoid to find \\ inside \begin{array}...\end{array}.
detail:
(?: # open a non-capturing group
[^\\]+ # all characters but \ 1 or more times
| # OR
\\(?!end{array}) # \ not followed by "end{array}"
)* # close non-capturing group, zero or more times
This structure is more efficient than a simple .*? that need many backtracks to succeed. It's a bit longer but more performant since it avoids lazy quantifiers.
(ps: remove the delimiters / in regexpal)