mindoc-org / mindoc

Golang实现的基于beego框架的接口在线文档管理系统
https://mindoc.com.cn/docs/mindochelp
Apache License 2.0
7.29k stars 1.9k forks source link

未能正确渲染行内的LaTeX公式 #742

Open MiniDay opened 2 years ago

MiniDay commented 2 years ago

请按照一下格式提交issue,谢谢!

  1. 你当前使用的是哪个版本的 MinDoc(godoc_linux_amd64 version)? v2.1-beta.5

  2. 你当前使用的是什么操作系统? debian 10.2

  3. 你是如何操作的?

书写 markdown 内容:

正弦:对边比斜边

$\sin A = \frac {a} {c}$
$\sin B = \frac {b} {c}$
  1. 你期望得到什么结果?

行内的数学公式能够被正确渲染

  1. 当前遇到的是什么结果?

行内的数学公式未被正确渲染,仍以文字 $\sin A = \frac {a} {c}$ 显示。


但使用 $$\sin A = \frac {a} {c}$$ 时却可以正确渲染整行公式。 此问题在官方演示网站中也存在: https://doc.iminho.me/docs/mindoc/mindoc-1dc9h5j1i7sv4

Cmd Markdown 高阶语法手册 小节的第五点 LaTeX 公式 中可见该错误

davidliyutong commented 2 years ago

其实是可以渲染的,只不过要用两个$$把公式括起来。

可以试试修改容器内的/mindoc/static/editor.md/editormd.js,大概在3597行左右,原来的代码是这样的:

        markedRenderer.paragraph = function(text) {
            var isTeXInline     = /\$\$(.*)\$\$/g.test(text);
            var isTeXLine       = /^\$\$(.*)\$\$$/.test(text);
            var isTeXAddClass   = (isTeXLine)     ? " class=\"" + editormd.classNames.tex + "\"" : "";
            var isToC           = (settings.tocm) ? /^(\[TOC\]|\[TOCM\])$/.test(text) : /^\[TOC\]$/.test(text);
            var isToCMenu       = /^\[TOCM\]$/.test(text);

            if (!isTeXLine && isTeXInline) 
            {
                text = text.replace(/(\$\$([^\$]*)\$\$)+/g, function($1, $2) {
                    return "<span class=\"" + editormd.classNames.tex + "\">" + $2.replace(/\$/g, "") + "</span>";
                });
            } 

修改为

        markedRenderer.paragraph = function(text) {
            var isTeXInline     = /\$(.*)\$/g.test(text); // Change this line
            var isTeXLine       = /^\$\$(.*)\$\$$/.test(text);
            var isTeXAddClass   = (isTeXLine)     ? " class=\"" + editormd.classNames.tex + "\"" : "";
            var isToC           = (settings.tocm) ? /^(\[TOC\]|\[TOCM\])$/.test(text) : /^\[TOC\]$/.test(text);
            var isToCMenu       = /^\[TOCM\]$/.test(text);

            if (!isTeXLine && isTeXInline) 
            {
                text = text.replace(/(\$([^\$]*)\$)+/g, function($1, $2) { // Change this line
                    return "<span class=\"" + editormd.classNames.tex + "\">" + $2.replace(/\$/g, "") + "</span>";
                });
            } 

其实就是改变regex让它匹配单个$符号的行内公式。修改之后可能需要清理一下浏览器缓存

ywz978020607 commented 9 months ago

还有个问题,cherry编辑器无法渲染公式,只能用第一个编辑器,但是第一个编辑器无法调颜色,纯白好辣眼睛

ywz978020607 commented 9 months ago

还有个问题,cherry编辑器无法渲染公式,只能用第一个编辑器,但是第一个编辑器无法调颜色,纯白好辣眼睛

无论是行间还是单行公式,cherry编辑器都无法渲染

ywz978020607 commented 9 months ago

其实是可以渲染的,只不过要用两个$$把公式括起来。

可以试试修改容器内的/mindoc/static/editor.md/editormd.js,大概在3597行左右,原来的代码是这样的:

        markedRenderer.paragraph = function(text) {
            var isTeXInline     = /\$\$(.*)\$\$/g.test(text);
            var isTeXLine       = /^\$\$(.*)\$\$$/.test(text);
            var isTeXAddClass   = (isTeXLine)     ? " class=\"" + editormd.classNames.tex + "\"" : "";
            var isToC           = (settings.tocm) ? /^(\[TOC\]|\[TOCM\])$/.test(text) : /^\[TOC\]$/.test(text);
            var isToCMenu       = /^\[TOCM\]$/.test(text);

            if (!isTeXLine && isTeXInline) 
            {
                text = text.replace(/(\$\$([^\$]*)\$\$)+/g, function($1, $2) {
                    return "<span class=\"" + editormd.classNames.tex + "\">" + $2.replace(/\$/g, "") + "</span>";
                });
            } 

修改为

        markedRenderer.paragraph = function(text) {
            var isTeXInline     = /\$(.*)\$/g.test(text); // Change this line
            var isTeXLine       = /^\$\$(.*)\$\$$/.test(text);
            var isTeXAddClass   = (isTeXLine)     ? " class=\"" + editormd.classNames.tex + "\"" : "";
            var isToC           = (settings.tocm) ? /^(\[TOC\]|\[TOCM\])$/.test(text) : /^\[TOC\]$/.test(text);
            var isToCMenu       = /^\[TOCM\]$/.test(text);

            if (!isTeXLine && isTeXInline) 
            {
                text = text.replace(/(\$([^\$]*)\$)+/g, function($1, $2) { // Change this line
                    return "<span class=\"" + editormd.classNames.tex + "\">" + $2.replace(/\$/g, "") + "</span>";
                });
            } 

其实就是改变regex让它匹配单个$符号的行内公式。修改之后可能需要清理一下浏览器缓存

另外,这个方法可以对普通行生效,但是对于- 开头的列表行不生效