Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

公式引用 #985

Closed
dualer opened this issue Jul 14, 2021 · 20 comments
Closed

公式引用 #985

dualer opened this issue Jul 14, 2021 · 20 comments
Labels
Area: Math Issue: Question Res: Out of scope Upstream Pertaining to an upstream component, or blocked by an upstream issue.

Comments

@dualer
Copy link

dualer commented Jul 14, 2021

Proposal

现在似乎无法引用公式, 下面的代码无效:

$$
\pi   \tag{1}\label{1}
$$

eq.$\eqref{1}$

References

@yzhang-gh
Copy link
Owner

请参考

https://katex.org/docs/supported.html

以及

https://github.com/yzhang-gh/vscode-markdown#math

Please use Markdown+Math for dedicated math support. Be sure to disable math.enabled option of this extension.

@Lemmingh Lemmingh added the Upstream Pertaining to an upstream component, or blocked by an upstream issue. label Jul 15, 2021
@Lemmingh
Copy link
Collaborator

Markdown+Math 也做不到。这个问题我们以前解释过很多遍,KaTeX 也解释过很多遍。KaTeX 的工作方式导致它几乎不可能支持 label / ref。要么用 MathJax,要么上 LaTeX。

@dualer
Copy link
Author

dualer commented Jul 15, 2021

Markdown+Math 也做不到。这个问题我们以前解释过很多遍,KaTeX 也解释过很多遍。KaTeX 的工作方式导致它几乎不可能支持 label / ref。要么用 MathJax,要么上 LaTeX。

不好意思, 之前没调研完全. 刚才将katex的文档挨着查看了遍, 确实没找到哪里说可以引用公式, 可这不应该是刚需吗

@yzhang-gh
Copy link
Owner

Markdown+Math 也做不到。

印象里有个插件可以用 MathJax,仔细一想应该是 Markdown Preview Enhanced

@dualer
Copy link
Author

dualer commented Jul 15, 2021

Markdown+Math 也做不到。

印象里有个插件可以用 MathJax,仔细一想应该是 Markdown Preview Enhanced

已经试过了, 不行, 比如

$$ 
\pi \tag{1}\label{1}
$$
eq.(\ref{1})

数学公式加载不出来, eq.(1)中的链接是网络链接, 如图所示
image

唉, 这么基本的功能都这么麻烦啊. Markdown Preview Enhanced 的作者也一直在潜水, 我看地址上面的issues他就基本没回复过, 也不尝试去问了

@yzhang-gh
Copy link
Owner

不知道 MPE 是怎么做的,只能说 MathJax 理论上是可以的 (http://docs.mathjax.org/en/latest/input/tex/eqnumbers.html),加上已知 MPE 是可以选择 MathJax 的

你想要的这个功能已经不算「基本」了(想想 Word),这种情况还是 LaTeX 比较适合

@dualer
Copy link
Author

dualer commented Jul 15, 2021

应该是MPE支持不完全吧. 想换编辑器了😂, 但还不清楚应该换哪个编辑器, typora看起来挺好, 但没补全, 平时写的东西公式比较多, 没补全简直是灾难. 你有没有什么建议吗? 因为latex不能即时预览, 平时写点东西, 还是愿意用markdown.

@dualer
Copy link
Author

dualer commented Jul 15, 2021

总算大致解决了, 可以安装Mathpix Markdown, 公式自动计数、引用都可以了, 只是引用公式显示为[1]这种形式. 竟然这插件可用, 那么后续或许可以增加

\begin{align/equation(*)}
\end{align/equation(*)}

这些环境的补全、颜色显示(不知道怎么称呼. 渲染?). 补全可以自己配置, 颜色不知道怎么弄.

@yzhang-gh
Copy link
Owner

Mathpix Markdown

有意思(也是基于 MathJax 的)。之前用过 Mathpix 不过没想到又出现一个 Markdown 分支了

这些环境的补全、颜色显示

没太看懂

@dualer
Copy link
Author

dualer commented Jul 15, 2021

找了半天才找到这个插件, 是挺有趣的, 我觉得这是目前最优的解决方案.

没太看懂

image
就是没颜色啊, 如上图所示. 不过这个问题不大, 只是我有点强迫症. 其实我还在想能不能搞出定理环境, 不过感觉这就太为难markdown了, 放弃了, 暂时用"引用"环境凑合着吧.

@yzhang-gh
Copy link
Owner

这个叫做语法高亮,我这看着没问题,但是你用了其它的语法就不一定能匹配上了

@Lemmingh
Copy link
Collaborator

MathJax is not MathJax.

Math is not math.

Markdown is not Markdown.

Webview is not web browser.

心累,明天细说。

@dualer
Copy link
Author

dualer commented Jul 16, 2021

这个叫做语法高亮,我这看着没问题,但是你用了其它的语法就不一定能匹配上了

我指的就是这些额外的语法, 现在插件不支持\begin{align}...\end{align}这些语法, 所以没有高亮.

@yzhang-gh
Copy link
Owner

只是你的主题的原因,你的截图花括号都有颜色

syntax highlight


@Lemmingh 感觉这次可以整合到 https://markdown-all-in-one.github.io/docs/decisions/math-support.html

@dualer
Copy link
Author

dualer commented Jul 16, 2021

只是你的主题的原因,你的截图花括号都有颜色

syntax highlight

不是. 那个括号我是用了另外一个插件, 可以让括号显示为彩色. 不是$$\begin{align}..\end{align}$$, 而是直接\begin{align}..\end{align}

@yzhang-gh
Copy link
Owner

yzhang-gh commented Jul 16, 2021

既然你都没用 $$ 那没有高亮不就很正常吗。。。已经不是一般意义的 Markdown(或其常见语法扩展)了😑。太小众,可预见的时间内应该不会支持。

Comparison of syntax extensions in Markdown flavors

@Lemmingh
Copy link
Collaborator

decisions/math-support

那个文件已经更名为 guide/math。断断续续地改了有两个星期吧,细碎东西真多,但愿这个月能写完。

当初我提出 Decisions 是想有一个类似 RFC 的汇总处。但现在我也感觉这一层多余:关于功能的介绍可以合并进 Guide,关于开发的规则可以放到对应的 Spec 的开头。

doge

看来现在不用细说了,等下个月吧。讲几个要点:

ref 的原理

LaTeX 编译整个文档两遍,第一遍算出所有 label,第二遍插入引用。

MathJax 输入 HTML 文档,输出 HTML 文档,能做到二次编译。打开比较大的页面,比如 Feynman 讲义,就能感受该过程。

KaTeX 输入数学模式表达式,输出 HTML 片段,几乎不可能实现引用。

MathJax 3 原生支持 synchronous rendering on server-side。但是,按这个方式工作的 MathJax 受到基本与 KaTeX 相同的限制。

VS Code webview

VS Code webview 可以大致看做一个 iframeiframe 的实现。外层环境 (Virtual Document) 是 VS Code 的一部分,用于管理内层环境(webview 的内容)。

Webview 有很多邪事,其中一部分是从 Electron 传下来的。VS Code 已经做了 workaround,但仍然有一部分问题会暴露给用户。

在 1.58 及以前版本中,webview 基于 Electron 的 <webview>;从 1.59 版本开始,完全改为嵌在主 UI 中的 iframe

MathJax 水土不服

同时适用于 MathJax 2 和 3。

在浏览器中异步渲染时,一旦有 <base> 存在,MathJax 输出的 <a> 就会指向绝对 URL。

我不知道这是为了实现某种需求,还是单纯的怪癖。但它确实导致那些 refeqref 生成的 <a> 无法在 VS Code webview 中工作。

Webview 中的 location 实质上是用来代表它的专用 URI。而为了访问 workspace 中的相对路径,必须设置 base URL。MPE 当然也设了,虽然值不太对。(不过,它加载资源都用绝对路径,不体现这个问题。)

MathJax 一看到 <base>,就在它输出的 href 前都缀上 location,结果,全都成了无效的值,谁都不捕获,被当成外部 URI,扔出 VS Code。


@dualer
我真的认为你不是 Markdown 的目标用户。

Markdown 是一种小型、语法极度宽松的标记语言,通常用于论坛、邮件和结构简单的文档。一些 wiki、博客也可以考虑 Markdown,但往往会不得不用上具有多种扩展语法的 flavor。算是 Markdown 的硬伤。

你是在写高量还是粒子。尤其是做粒子方向的论文、专著之类的大型文档,最佳的选择仍然是 LaTeX。想想后面那些稀奇古怪的记号,跟 package 节省的时间相比,两次 compile 不算什么。

@DawnGnius
Copy link

在 KaTex 的 Issue: Support \eqref and \label 中, zhangpeng96 提到了一种可以实现公式引用的方法, 需要使用 \href & \htmlId command. 不清楚如何在 vscode-markdown 中使用?

@yzhang-gh
Copy link
Owner

由于这是非官方的做法,不太可能加入到正式支持之中,但是你可以自行修改插件的本地文件

$HOME/.vscode/extensions/yzhang.markdown-all-in-one-3.4.x/dist/extension.js 中搜索 l={throwOnError:!1} 并替换为 l={throwOnError:!1, trust: true}

@hyliang96
Copy link

安装vscode插件: Markdown+Math,并在vscode配置文件里添加如下设置,即可渲染\label、\ref、\eqref

"mdmath.katexoptions": {
    "trust": "(context) => ['\\htmlId', '\\href'].includes(context.command)"
},
"mdmath.macros": {
    "\\eqref": "\\href{###1}{(\\text{#1})}",
    "\\ref": "\\href{###1}{\\text{#1}}",
    "\\label": "\\htmlId{#1}{}"
},
image-20240126165126318

本方法参考这个帖子

但本法有个缺点: $\ref{eq:1}$ $\eqref{eq:1}$ 渲染为'eq:1'而非 '1'(即公式编号)。不知是否有方法修补此bug?或是否有其他支持\label \ref \eqref的方法可避免此bug?

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
Area: Math Issue: Question Res: Out of scope Upstream Pertaining to an upstream component, or blocked by an upstream issue.
Projects
None yet
Development

No branches or pull requests

5 participants