当前位置: 首页 > 知识库问答 >
问题:

关于MathJax的具体问题(自动?)保存到word或pdf

欧阳子石
2023-03-14

听着,这可能是一个愚蠢的问题,如果是的话,我很抱歉...但老实说,我在这个问题上发现的一切似乎都来自2007年,或者对IE6等提出了特别警告。

设置:使用数学标记和MathJax在网页中呈现数学的网页(工作正常)。

用户需要能够将其导出到某种文档(word、PDF等),以便分发给不允许/不希望“在系统中”提供页面的校对员。

问题是:到目前为止,我试图将渲染的最终产品输出到某种文档(而不是用户启动的浏览器打印)的所有内容都显示了未渲染的标记,而不是最终产品。

这显然是由于MathJax库在浏览器中完全可用时呈现页面的方式,因为它只是一个JS脚本包含。这并不奇怪。

我可以通过对呈现的页面进行ajax调用,然后将整个html块发送到第三个页面,将其写入光盘,并使用msword的mime和内容处置头重新提供它,将其保存到光盘,等等,来接近这一点,但呈现不正确——可能是因为在POST调用中打包了它。不管怎样,这需要很多步骤才能最终找到一个不太正确的解决方案。

我猜答案是“你不能这样做”,至少不能不使用TeX Live或MikTex等的大型安装。,并在后端使用shell调用...但是我无论如何都没有能力安装在这些主机上。

我是否被用户在做打印到PDF的解决方案所困扰?我有什么遗漏吗?

谢谢,很高兴在需要的地方充实自己,但我不是第一个尝试这样做的人。

共有2个答案

郑哲彦
2023-03-14

如果您正在考虑商业解决方案,请查看callas software的pdfChip(警告:我与此解决方案有很大关联)。

它可以将HTML转换为PDF,并使用MathJax将MathML转换为适当的PDF文件(如果您愿意,甚至可以是PDF/X或PDF/a文件)。我很乐意离线提供更多细节。

薄瑞
2023-03-14

对于PDF,有几个选项,主要取决于你想投入多少工作。

快速而肮脏的解决方案可能是wkhtmltopdf,但您必须指定JavaScript呈现完成的等待时间——这并不理想。

PhantomJS需要稍微多做一些工作,但允许您在页面上收听,例如,本讨论链接到一个简单的示例。(实际上有很多基于PhantomJS的工具。)

另一种方法是首先使用MathJax节点进行预处理,然后将结果传递给wkhtmltopdf(然后您不必等待MathJax)。

对于doc/docx,我认为现在没有任何办法。自然的方法是使用MathJax节点生成MathML,因为Word可以导入MathML。但从HTML导入时,Word似乎不支持MathML。使用MathJax节点生成SVG也是如此(但是使用SVG,您将失去编辑公式的能力,因此这可能是禁止的)。

Pandoc可能最终会有所帮助。它显然可以将数学转换为微软办公格式,见演示#30)。但是从一个快速测试来看,这似乎现在不适用于超文本标记语言输入。

 类似资料:
  • 关于这个问题,我已经做了相当多的谷歌搜索,我发现的大多数线程都有2年多的历史了,所以我想知道是否有什么改变,或者是否有一个新的方法来解决与这个话题有关的问题。 您在使用IntelliJ(我使用14.0.2)时可能知道,它经常自动保存文件。对我来说,在Java或JavaScript文件中进行更改时,大约需要2秒才能保存更改。有一些选项可能会对此产生影响,例如设置>外观和行为>系统设置>同步>如果应用

  • 主要内容:1.缓存雪崩,2.缓存穿透,3.缓存击穿,4.数据不一致,5.数据并发竞争,6.热点key问题,7.BigKey问题1.缓存雪崩 指缓存同一时间大面积的失效,所以,后面的请求都会落到数据库上,造成数据库短时间内承受大量请求而崩掉。 解决方案: Redis 高可用,主从+哨兵,Redis cluster,避免全盘崩溃 本地 ehcache 缓存 + hystrix 限流&降级,避免 MySQL 被打死 缓存数据的过期时间设置随机,防止同一时间大量数据过期现象发生。 逻辑上永不过期给每一个

  • 我是Kafka的新手。我看了一眼Kafka文档。似乎分派给订阅消费者组的消息是通过将分区与消费者实例绑定来实现的。 在使用Apache Kafka时,我们应该记住一件重要的事情,即同一消费者组中的消费者数量应该小于或等于所使用主题中的分区数量。否则,将不会收到来自主题的任何消息。 在非prod环境中,我没有配置主题分区。在这种情况下,Kafka是否只有一个分区。如果我启动共享同一组的多个消费者并向

  • 我有一个Java应用程序午餐一个flink工作来处理Kafka流。

  • 然后,我遇到了这篇文章/帖子旅使用MVC替代方案的经验,它描述了我目前正在做的事情。 在实际尝试在一个新的iOS项目上实现VIPER之后,我遇到了一些问题: 演示者可以在视图中查询信息吗?还是“信息传递”应该总是从视图开始?例如,如果视图触发了演示者中的某个操作,但根据通过该操作传递的参数,演示者可能需要更多信息。我的意思是:用户点击“donewithstate:”,如果state==“somet

  • 在放开最后一行注释后执行 : A的引用内存反而降低了,A对B的引用好像并没有解除,为什么会降低内存了? 为什么A对象的内存降低了呢