在Tinymce編輯器裡,整合數學公式
在以前,需要在Web頁面顯示數學公式,常用的都是先製作成圖片,然後插入到頁面裡。這使得後期對數學公式的修改變的麻煩,同時也不利於搜尋引擎搜尋。
本文將介紹如何在TinyMce編輯器裡整合數學公式。先看演示: http://demo.dotnetcms.org/math/
(一)公式錄入效果
1.開啟演示站點,點選“數學公式”,錄入如下文字,系統會自動給出公式的預覽
然後,點選OK,你錄入的公式就插入到文件裡了。你不用擔心公式錄入錯誤,因為,公式是以文字方式儲存的,你可以再任何時候雙擊公式
來修改它。
為了更方便體驗,你也可以複製下面程式碼,貼上到demo的“插入公式”裡,體驗其效果:
f\left( \left[ \frac{ 1+\left\{x,y\right\} }{ \left( \frac{x}{y}+\frac{y}{x} \right) \left(u+1\right) }+a \right]^{3/2} \right)
現在,一個更為複雜的數學公式生成了。
當您通過TinyMce編輯器檢視器原始碼時,下面顯示了其原始碼:class="math-tex"裡的內容在最終顯示時,有MathJax核心自動解析。
1.當<span class="math-tex">\( a \ne 0 \)</span>時,一元二次方式<span class="math-tex">\( ax^2 + bx + c = 0 \)</span>的兩個根是:
<br><br><span class="math-tex">\( x = {-b \pm \sqrt{b^2-4ac} \over 2a} \)</span> <br> <span class="math-tex">\( f\left( \left[ \frac{ 1+\left\{x,y\right\} }{ \left( \frac{x}{y}+\frac{y}{x} \right) \left(u+1\right) }+a \right]^{3/2} \right) \)</span>
瞭解了上面功能前,先介紹一下數學符號和公式的背景。
(二)數學公式的問題
為了使得在Web上錄入數學符號變的簡單,國際上提供了幾種解決方法:
1) W3C提出了MathML語言
W3C在2014年提出了Mathematical Markup Language (MathML) ,旨在解決數學符號錄入與顯示的問題。其思想是和HTML類似,MathML通過使用語義的標籤來顯示數學符號。有興趣的朋友可以到 https://www.w3.org/TR/MathML3/ 檢視
簡單說,要顯示 sin x 只要用如下圖所示標籤即可。
這裡 <mi> 是mathematical identifier的簡寫,他的意思是告訴瀏覽器 <mi>sin</mi>之間內容是一個整體,內容不要分開。
因為MathML提出的語義太細,導致用的人並不多。
2)MathJax
MathJax是一個開源組織,其前身是由美國數學學會( American Mathematical Society )和工業與應用數學學會(Society for Industrial and Applied Mathematics)贊助的一個協會,他提出了一個基於 HTML+JS+CSS的方法來實現數學公式的解決方案,並且逐漸成為行業標準。
MathJax採用類似Markdown的LaTex標記來記錄數學符號,並附帶了常規的文字語義,例如
a不等於0,直接用 下面程式碼表示,ne 是 not equal,很容易理解。
a ne 0
(三)MathJax語法
以MathJax為基礎,又衍生出幾套不用的顯示語法。(大家可以做一個簡單類別: 作業系統最初是Unix,後來芬蘭的託瓦茲在Unix上開發了Linux,蘋果在Linux整合上開發了MacOS,谷歌在Linux基礎上開發了Android,華為在Android上開發了鴻蒙。。。而Linux更衍生出CentOS,紅帽、深度等作業系統。同樣MathJax也衍生出不少顯示方法,這裡介紹主要的3種)
3.1)AsciiMath
AsciiMath以MathJax為基礎,提出了一套簡單的輸入和顯示數學符號的方法。詳見官網 http://asciimath.org/
3.2)Google解決方法
考慮瀏覽器相容性,google提出了根據MathJax語法生成圖片公式的解決方法。簡單說,你只要在 https://chart.googleapis.com/chart? 後面傳入數學符號,系統自動給你生成數學符號。
但是,這個方法有致命缺陷:他生成的是圖片,這使得後期對公式修改變的麻煩。同時,當瀏覽器放大或者縮小時,圖片也跟著放大或縮小,導致公式圖片變的模糊。
生成圖片的好處時,如果頁面佈局較為複雜,生成圖片更容易排版
3.3)MathJax解決方案
MathJax最終通過採用LaTex語法並加上HTML+CSS+JS來顯示數學公式,另外他也支援通過SVG渲染數學公式。
3.3.1)Tex語法
TeX最初是一個由美國計算機教授高德納(Donald Ervin Knuth)編寫的排版軟體。TeX的MIME型別為application/x-tex,是一款自由軟體。高德納最早開始自行編寫TeX的原因,是因為當時的電腦排版技術十分粗糙,已經影響到他的鉅著《計算機程式設計藝術》的印刷質量。他以典型的黑客思維模式,決定自行編寫一個排版軟體:TeX。
以二次方程為例,參考下圖:Tex基本思想是:用 2個$符號之間的內容表示數學公式 (這個類似HTML裡 style設定為inline,行內元素)。
如果公式要換行,就用4個$表示(這個類似HTML裡 style設定為block,塊元素)。
3.3.2) LaTeX語法
在TeX實際執行中,偶爾會產生一些問題,考慮如下一句話:
這個蘋果是$2.5美元現在漲為$3.0美元
在實際排版時,直接使用2個$,使用者的本意是顯示文字,但是卻被當成了公式,因此LaTeX提出以2個"$$"作為公式的標誌。另外LaTex也對Tex進行了預設。
例如:
\documentclass[a4paper]{book} \begin{document} \section{ ... a title } \subsection{ ... a subtitle} %% Text goes here \end{document}
執行後的效果是:
下面程式碼顯示了一個矩陣:
\begin{pmatrix} 1 & a_1 & a_1^2 & \cdots & a_1^n \\ 1 & a_2 & a_2^2 & \cdots & a_2^n \\ \vdots & \vdots& \vdots & \ddots & \vdots \\ 1 & a_m & a_m^2 & \cdots & a_m^n \end{pmatrix}
你甚至可以編寫更復雜的公式:
\begin{align} \sqrt{37} & = \sqrt{\frac{73^2-1}{12^2}} \\ & = \sqrt{\frac{73^2}{12^2}\cdot\frac{73^2-1}{73^2}} \\ & = \sqrt{\frac{73^2}{12^2}}\sqrt{\frac{73^2-1}{73^2}} \\ & = \frac{73}{12}\sqrt{1 - \frac{1}{73^2}} \\ & \approx \frac{73}{12}\left(1 - \frac{1}{2\cdot73^2}\right) \end{align}
請注意:上圖生成的公式都是文字格式,這意味就算你放大瀏覽器,文字仍然清晰,而且易於修改。
3.3.3)使用SVG顯示公式
MathJax支援使用SVG顯示數學公式。要了解SVG,可以參考 https://www.runoob.com/svg/svg-tutorial.html 的介紹。
在以前,如果要在頁面顯示一個三角形,不用圖片,而用CSS+HTML+JS實現,通常非常麻煩。用SVG,則變的簡單很多。 見 https://www.runoob.com/try/try.php?filename=trysvg_polygon
只要一行程式碼,就可以實現:
<svg xmlns="http://www.w3.org/2000/svg" version="1.1"> <polygon points="200,10 250,190 160,210" style="fill:lime;stroke:purple;stroke-width:1" /> </svg>
你完全可以把SVG當做HTML標籤使用,很多HTML的屬性都可以用的上,更主要的是,他是向量的,不論放大還是縮小,都不模糊。
在MathJAX裡,也支援以SVG方式,顯示數學公式。在MathJax的demo站點裡有說明:https://github.com/mathjax/MathJax-demos-web
(四)MathJax兩種模式的比較
如上所述,Mathjax支援 “HTML+CSS+JS”和“SVG”兩種模式顯示數學公式,從外表上看,基本上一樣,但是瀏覽器渲染原理並相同。
(1)demo https://mathjax.github.io/MathJax-demos-web/tex-chtml.html
HTML+CSS+JS模式,MathJax通過自定義語義標籤顯示公式。
(2)demo https://mathjax.github.io/MathJax-demos-web/tex-svg.html
SVG渲染模式,通過svg標籤渲染頁面。
當你使用MathJax時,你不用關心這些細節,整個渲染流程由MathJax自動完成!!
(五)TinyMce增加數學公式
有了上面鋪墊,現在你就可以使用TinyMce編輯器了。
首先在頁面放置一個 div或者input作為編輯器容器
<div id="xx" style=" border:solid 1px #000" ></div>
接下來引入TinyMce程式碼,可以直接到 http://www.tinymce.com 下載 或者引入CDN
<script src="https://cdn.tiny.cloud/1/no-api-key/tinymce/5/tinymce.min.js" referrerpolicy="origin"></script>
接下來引入MathJax,可以到 https://www.mathjax.org/ 下載MathJax.js包或者直接引入CDN
<script src="https://polyfill.io/v3/polyfill.min.js?features=es6"></script> <script id="MathJax-script" async src="https://cdn.jsdelivr.net/npm/mathjax@3/es5/tex-mml-chtml.js"></script>
其中polyfill.min.js不是必須的,他主要是解決瀏覽器相容性的問題
最後,需要再載入一個外掛 https://github.com/dimakorotkov/tinymce-mathjax
最後,更改效果如下:(關於LaTex語法請自行搜尋,網上很多介紹。)
f\left( \left[ \frac{ 1+\left\{x,y\right\} }{ \left( \frac{x}{y}+\frac{y}{x} \right) \left(u+1\right) }+a \right]^{3/2} \right)
這樣,一個基於TinyMce的附帶數學公式的編輯器就完成了。再複雜的公式,也so easy~~
歡迎轉載本文轉載請保留出處:啟明星工