首页 > 其他分享 >记一次手动将LATEX数学公式转换为微信公众号支持的svg过程

记一次手动将LATEX数学公式转换为微信公众号支持的svg过程

时间:2024-05-23 11:56:50浏览次数:19  
标签:LATEX use SVG svg 元素 公式 微信

前言

今日发公众号转载别人的某篇文章。本来是个很简单的活,但文章里有几个公式排版炸了。虽然可以无视,但抱着挑战的心态,我还是试着去修了下。百度,不出所料,基本都是推广,不过还是有一些有用的信息。本着和微信较劲以及绝不注册新账号的精神,我决定尝试手动将LATEX公式转svg。

由于这次修的几个公式比较简单,肯定有不少边界情况没有覆盖到,而且这一套工作流程也暂时没办法流水线化(懒得写脚本),因此本文章称不上是教程。

没有去Github上搜索有没有好心人写的转换脚本,可以去搜搜试试。

过程

  1. 随便找个网站或者包将LATEX公式转换为SVG。我这里用的是Thomas Lochmatter提供的在线转换器,其声称使用的是MathJAX这个包。不过这一步对后续的影响应该不大。
  2. 打开转换好的SVG。一般来说这种转换好的SVG里面会包括defs和use两部分。例如下面是$\theta$的转换结果:
<?xml version="1.0" encoding="UTF-8" standalone="no" ?>
<svg xmlns="http://www.w3.org/2000/svg" width="8.488px" height="12.944px" viewBox="0 -705 469 715" xmlns:xlink="http://www.w3.org/1999/xlink" aria-hidden="true">
<defs>
  <path id="MJX-27-TEX-I-1D703" d="M35 200Q35 302 74 415..."></path>
</defs>
<g stroke="#000000" fill="#000000" stroke-width="0" transform="scale(1,-1)">
  <g data-mml-node="math">
    <g data-mml-node="mi">
      <use data-c="1D703" xlink:href="#MJX-27-TEX-I-1D703"></use>
    </g>
  </g>
</g>
</svg>

SVG元素里面的各个子元素的具体意思可以去MDN docs上阅读。粗略来说,defs里面会定义各个符号对应的矢量图,而下面则会通过use元素来引用这些符号;
但不幸的是,微信的编辑器似乎不允许定义id这个属性(至少在path标签上不允许)。因此,这里我们必须将use节点手动展开。

  1. 观察use元素通过xlink:href所引用的元素,并将其手动展开。展开过程需要我们对use元素上的属性进行处理。理论上来说,use上的data-*属性应被复制到展开后的元素上,而xy属性(给这个元素一个额外的shift)则可以通过在外层的g标签上加transform=translation(x,y),以变换的形式来实现。这里展开之后应该如下所示:
<?xml version="1.0" encoding="UTF-8" standalone="no" ?>
<svg xmlns="http://www.w3.org/2000/svg" width="8.488px" height="12.944px" viewBox="0 -705 469 715" xmlns:xlink="http://www.w3.org/1999/xlink" aria-hidden="true">
<g stroke="#000000" fill="#000000" stroke-width="0" transform="scale(1,-1)">
  <g data-mml-node="math">
    <g data-mml-node="mi">
      <path data-c="1D703" d="M35 200Q35 302 74 415..."></path>
    </g>
  </g>
</g>
</svg>
  1. 收尾工作。删去部分不需要的属性与元素,如第一行的<?xml ?>xmlns:xlink属性(不删应该问题也不大);值得注意的是,有的公式转换为SVG时会生成一个<g data-mml-node="TeXAtom" data-mjx-texclass="ORD">元素,而微信公众号平台很神奇的不知为何会把这个组元素以及之外的所有组全部删掉,导致公式直接变白纸,因此我们需要提前删掉这个元素。由于我不确认这个元素的具体作用(虽然我的场景下删了没事),因此请多加小心
  2. 将svg塞进微信图文编辑器。虽然上网一搜应该有不少插件,但我个人这里使用的方法是F12直接编辑前端。一般来说新建一个并塞到里面就足够了。
  3. 微调工作。塞进去的公式很可能在垂直方向上没有对齐,可以通过在svg元素上加内嵌css(具体来说是vertical-align属性)来控制svg不要飞出去。(这一偏移值应该可以自动生成,但我没有具体研究)。
  4. 看着舒服了之后点击保存为草稿按钮,看看微信处理过之后公式显示是否仍然正常。如果公式消失,请手动diff微信处理前后的svg源代码。

附言

  • 实际上上述大部分过程均可以写个脚本自动化,大概调个beautifulsoup就行,但是明显很耗时间。
  • 上述过程很可能没有覆盖到一些边界情况,需要手动修正查错;如果你决定使用这一方案,请确保你对前端有一定了解;
  • 不确定svg元素放在其他的行间元素(如strong)里面会不会出问题。
  • 一定要确保你粘贴的源代码里面的所有标签都正确关闭了,不然很可能会导致文章其他部分的排版莫名爆炸,只能回滚。

标签:LATEX,use,SVG,svg,元素,公式,微信
From: https://www.cnblogs.com/tadshi/p/18208095

相关文章

  • Senparc.Weixin.MP SDK 微信公众平台开发--自定义菜单相关
      publicvirtualIResponseMessageBaseOnImageRequest(RequestMessageImagerequestMessage);    publicvirtualIResponseMessageBaseOnLinkRequest(RequestMessageLinkrequestMessage);    publicvirtualIResponseMessageBaseOnLocationRequest(Requ......
  • Latex wiki
    HomeJumptobottomTakashiTamuraeditedthispageMar11,2022·4revisionsLaTeXWorkshopisanextensionforVisualStudioCode,aimingtoprovideall-in-onefeaturesandutilitiesforLaTeXtypesettingwithVisualS......
  • BibTeX 和 BibLaTeX
    BibTeX:传统的参考文献处理工具,使用.bst文件来定义参考文献的样式。BibLaTeX:功能更强大且更现代的工具,使用.bbx、.cbx和.dbx文件来定义参考文献和引用的样式。BibTeX使用.bst文件来指定参考文献列表的格式。使用方法:\documentclass{article}%指定自定义的.bst......
  • LaTeX 交叉引用的三次编译
    源文件main.tex\documentclass{article}\begin{document}Hereisacitation\cite{example}.\bibliographystyle{plain}\bibliography{references}\end{document}references.bib@article{example,author={AuthorName},title={TitleofthePap......
  • 用charles反向代理来进行微信公众号的调试
     参考网站https://blog.csdn.net/qq_38179167/article/details/80654093 https://www.axihe.com/charles/charles/proxy-phone.html http://www.cnblogs.com/jiayuchn-test/p/8875105.html https://www.cnblogs.com/maxiaodan/p/10066345.html 下载charleshttps://......
  • 完整教程-微信小程序发布攻略
    完整教程-微信小程序发布攻略上篇分享了了小程序发布前的准备工作这篇我们来分享如何上传代码版本及发布流程话不多说,直接上干货三、工具准备✅1、下载微信小程序开发工具,⚠️⚠️⚠️根据自己电脑系统选择对应的版本。2、下载完成后安装运行,使用微信扫码登录。3、创建项目,导入写好的小......
  • 微信JSAPI支付
    Tips:当你看到这个提示的时候,说明当前的文章是由原emlog博客系统搬迁至此的,文章发布时间已过于久远,编排和内容不一定完整,还请谅解`微信JSAPI支付日期:2019-3-30阿珏折腾代码浏览:1883次评论:6条前段时间一直在做微信相关的业务,虽说不是什么新技术,但之前一直没有机会接触......
  • 微信授权登录
    Tips:当你看到这个提示的时候,说明当前的文章是由原emlog博客系统搬迁至此的,文章发布时间已过于久远,编排和内容不一定完整,还请谅解`微信授权登录日期:2019-4-5阿珏折腾代码浏览:1874次评论:1条文档:https://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp14211353......
  • QQ、支付宝、微信收款码三合一
    Tips:当你看到这个提示的时候,说明当前的文章是由原emlog博客系统搬迁至此的,文章发布时间已过于久远,编排和内容不一定完整,还请谅解`QQ、支付宝、微信收款码三合一日期:2018-8-24阿珏折腾代码浏览:21094次评论:144条收款啦收款啦,是一款支付宝、微信、QQ收款码三......
  • 小白总结uniapp微信小程序跨域问题的解决(前端)
    小白总结uniapp微信小程序跨域问题的解决(前端):https://blog.csdn.net/m0_69848498/article/details/137628381?ops_request_misc=&request_id=&biz_id=102&utm_term=%E5%B0%8F%E7%A8%8B%E5%BA%8F%E5%AD%98%E5%9C%A8%E8%B7%A8%E5%9F%9F%E9%97%AE%E9%A2%98%E5%90%97&utm_medium=......