据别人介绍,在绘制平面分子式,乃至化学反应式、机理图时,大家使用的基本都是ChemDraw。当然ChemDraw是一款强大的软件,无论是平面的还是立体的分子结构式都能毫不费力地绘制出来。当然这份强大是要钱的,对于平面的分子式或反应式,不要钱而且还可行的方案大致也就LaTeX语言中的Chemfig宏包。
Chemfig是法国学者开发的宏包,εTeX,pdfLaTeX等TeX编译器都能正常使用,并且相对来说开发是比较活跃的。
TeX live 是 TUG (TeX User Group) 发布并维护的的 TeX 系统,可以称得上是TeX的官方系统。对于任何阶段的TeX用户,都可以使用TeX live, 以保持在跨 *** 作系统、跨用户的TeX文件一致性。
texlive Docker镜像及服务化改造texlive的安装B站有很多教程,目标是需要提供绘制chemfig化学方程式转换的服务,而texlive软件本身并不提供相关的API服务,需要对其进行服务化改造,因为考虑容器化部署,需要将texlive封装成docker镜像
话不多说,我们选择的基础镜像是 texlive:2020 ,使用Python对外提供服务,关于texlive相关的介绍可以参考博客:chemfig化学式转换为pdf
拉取镜像并运行docker pull texlive:2020docker run --name texlive -d texlive:2020docker ps -a | grep livedda1561ae866 texlive:2020 "tail -f /dev/null" 8 seconds ago Up 2 texlivedocker exec -it dda1561ae866 bash
安装python,制作texlive-python镜像# texlive是基于Alpine linux,目前主流cat /etc/issueWelcome to Alpine linux 3.12# 修改apk镜像源vi etc/apk/repositorIEs
替换文件内容为阿里源:
http://mirrors.aliyun.com/alpine/v3.8/main/
http://mirrors.aliyun.com/alpine/v3.8/community/
# 更新软件库apk updatefetch http://mirrors.aliyun.com/alpine/v3.8/main/x86_64/APKINDEX.tar.gzfetch http://mirrors.aliyun.com/alpine/v3.8/community/x86_64/APKINDEX.tar.gzv3.8.5-67-gf94de196ca [http://mirrors.aliyun.com/alpine/v3.8/main/]v3.8.5-66-gccbd6a8ae7 [http://mirrors.aliyun.com/alpine/v3.8/community/]OK: 9578 distinct packages available# 安装python3apk add --no-cache python3 python3-dev py-pip# 验证安装python3 -VPython 3.6.9bash-4.4# pip3 -Vpip 18.1 from /usr/lib/python3.6/site-packages/pip (python 3.6)
保存镜像docker commit dda1561ae866 textlive-python
至此,我们的拥有python环境texlive镜像就已经制作好了
服务化改造python脚本from flask import Flask, abort, request, Jsonifyimport osimport subprocessimport uuIDimport base64app = Flask(__name__)@app.route('/texlive/translate/', methods=['POST'])def translate(): if not request.Json or 'chemfig' not in request.Json: abort(400) chem_fig = request.Json['chemfig'] # 由于不好测算化学方程式图形的大小,这里支持配置纸张大小,我们这里默认a5paper if 'paper' in request.Json: paper = request.Json['paper'] else: paper = 'a5paper' tempfile = open("template.tex") lines = tempfile.readlines() lines[2] = lines[2].replace("a5paper", paper) lines[15] = chem_fig + "\n" uuIDStr = str(uuID.uuID1()) new_file_name = uuIDStr + '.tex' newfile = open(new_file_name, "a+") for line in lines: newfile.write(line) newfile.flush() newfile.close() try: # 这里使用subprocess比较稳定,os.system经常会出现莫名问题,至少这个pdflatex命令用os.system会报错 subprocess.run(["pdflatex", "-interaction=nonstopmode", new_file_name]) pdf_string = open(uuIDStr + '.pdf', "rb").read() encoded = base64.b64encode(pdf_string) pdf_link = "data:application/pdf;base64,{}".format(encoded) pdf_link = pdf_link.replace("b'", "").replace("'", "") except: remove_file(uuIDStr) else: remove_file(uuIDStr) return Jsonify({"image": pdf_link})def remove_file(uuID_str): os.system('rm ' + uuID_str + '.tex') os.system('rm ' + uuID_str + '.log') os.system('rm ' + uuID_str + '.pdf') os.system('rm ' + uuID_str + '.aux')if __name__ == '__main__': app.run(host="0.0.0.0", port=8080, deBUG=False)
Latex模板template.tex
\documentclass{minimal}\usepackage{xcolor, mol2chemfig}\usepackage[a5paper, margin=10px, total={6in, 8in}]{geometry}\usepackage[helvet]{sfmath}\setcrambond{2.5pt}{0.4pt}{1.0pt}\setbondoffset{1pt}\setdoublesep{2pt}\setatomsep{%(atomsep)spt}\renewcommand{\printatom}[1]{\Fontsize{8pt}{10pt}\selectFont{\ensuremath{\mathsf{#1}}}}\setlength{\parindent}{0pt}\setlength{\fBoxsep}{0pt}\begin{document}\chemfig{H_3C-[:30]N**6(-(=O)-(**5(-N(-CH_3)--N-))--N(-CH_3)-(=O)-)}\end{document}
mol2chemfig.sty
requirements.txtFlask
startup.shpython3 ./main.py
DockerfileFROM hub.iflytek.com/ainote/texlive-python:2020copY main.py /homecopY mol2chemfig.sty /homecopY template.tex /homecopY requirements.txt /homecopY startup.sh /homeworkdir /homeEXPOSE 8080RUN pip3 install -r requirements.txt && lsCMD ["bash", "startup.sh"]
服务镜像制作构建 texlive-python-API# dockerfile构建docker build -t texlive-python-API .# 打tagdocker tag texlive-python-API xxx.xxx.com/xxx/texlive-python-API:2020# 推送远程镜像仓库docker push xxx.xxx.com/xxx/texlive-python-API:2020
跑一个试试docker run -p 8080:8080 -d --name texlive-python-API texlive-python-API
请求body
{"paper":"a6paper","chemfig":"\chemfig{CH_3-[:108,,1]N-[:54](-[:180,0.85,,,draw=none]\mcfcringle{1.03})%\n-[:126]N-[:198]-[:270](-[:342]\phantom{N})-[:210](=[:270]O)-[:150]N(%\n-[:210,,,2]H_3C)-[:90](=[:150]O)-[:30]N(-[:330])-[:90,,,1]CH_3}\n\n\bigskip\n\n\chemfig{CH_3-[:108,,1]N-[:54](-[:180,0.85,,,draw=none]\mcfcringle{1.03})%\n-[:126]N-[:198]-[:270](-[:342]\phantom{N})-[:210](=[:270]O)-[:150]N(%\n-[:210,,,2]H_3C)-[:90](=[:150]O)-[:30]N(-[:330])-[:90,,,1]CH_3}"}
postman
拷贝出来放在浏览器就可以直接访问了,这个是a6纸张的渲染效果,可以根据图的大小动态的传入纸张规格
再来个大的
{"paper":"a3paper","chemfig":"\chemfig{CH_3-[:108,,1]N-[:54](-[:180,0.85,,,draw=none]\mcfcringle{1.03})%\n-[:126]N-[:198]-[:270](-[:342]\phantom{N})-[:210](=[:270]O)-[:150]N(%\n-[:210,,,2]H_3C)-[:90](=[:150]O)-[:30]N(-[:330])-[:90,,,1]CH_3}\n\n\bigskip\n\n\chemfig{\nO%5\n=[:270]%3\n(\n-[:210]%2\n(\n<[:150]%4\n-[:90.4,2.094]%115\n-[:18]%109\n-[:330]%110\n-[:30,,,,dlh]%111\n-[:90]%112\n-[:150,,,,dlh]%107\n-[:210]%108\n(\n-[:162]\mcfabove{N}{H}%113\n-[:234]%114\n-[:306,,,,dbl={73}{73}]%->115\n)\n-[:270,,,,dlh]%->109\n)\n-[:270,,,2]HN%1\n-[:330,,2]%93\n(\n-[:270]%95\n-[:210]%96\n-[:270]%97\n-[:330]%98\n-[:30]%99\n-[:330]%100\n-[:270]%101\n-[:210]%102\n-[:270]%103\n)\n=[:30]O%94\n)\n-[:330]\mcfbelow{N}{H}%6\n-[:30]%7\n(\n<:[:90]%9\n-[:30]%10\n(\n-[:330,,,1]NH_2%12\n)\n=[:90]O%11\n)\n-[:330]%8\n(\n=[:270]O%15\n)\n-[:30]\mcfabove{N}{H}%13\n-[:330]%14\n(\n<:[:270]%16\n-[:330]%19\n(\n=[:270]O%21\n)\n-[:30,,,1]OH%20\n)\n-[:30]%17\n(\n=[:90]O%22\n)\n-[:330]\mcfbelow{N}{H}%18\n-[:30]%23\n<:[:90]%24\n(\n=[:150]O%26\n)\n-[:30,,,1]NH%25\n-[:90,,1]%27\n-[:30]%28\n(\n=[:90]O%29\n)\n-[:330]\mcfbelow{N}{H}%30\n-[:30]%31\n(\n-[:90]%33\n-[:30]%34\n-[:90]%35\n-[:30,,,1]NH_2%36\n)\n-[:330]%32\n(\n=[:270]O%37\n)\n-[:30]\mcfabove{N}{H}%38\n-[:330]%39\n(\n<:[:270]%43\n-[:330]%44\n(\n-[:30,,,1]OH%46\n)\n=[:270]O%45\n)\n-[:30]%40\n(\n=[:90]O%42\n)\n-[:330]\mcfbelow{N}{H}%41\n-[:30]%47\n(\n<:[:90]%49\n)\n-[:330]%48\n(\n=[:30]O%51\n)\n-[:270,,,2]HN%50\n-[:330,,2]%52\n(\n<[:30]%54\n-[:330]%55\n(\n-[:270,,,1]OH%57\n)\n=[:30]O%56\n)\n-[:270]%53\n(\n=[:330]O%58\n)\n-[:210,,,2]HN%59\n-[:270,,2]%60\n-[:210]%61\n(\n=[:270]O%62\n)\n-[:150]\mcfabove{N}{H}%63\n-[:210]%64\n(\n<:[:270]%104\n-[:330,,,1]OH%105\n)\n-[:180,1.732]%91\n(\n-[:150,,,,dlhs]O%92\n)\n-[:270,,,1]NH%90\n-[:210,,1]%82\n(\n<[:270]%84\n(\n-[:330]%86\n-[:270]%87\n(\n-[:210,,,2]HO%89\n)\n=[:330]O%88\n)\n-[:210]%85\n)\n-[:150]%81\n(\n=[:90]O%83\n)\n-[:210]\mcfbelow{N}{H}%71\n-[:150]%69\n(\n-[:90]%68\n(\n=[:30]O%70\n)\n-[:150]O%67\n-[:90]%65\n(\n<[:30]%66\n)\n-[:150]%->23\n)\n<[:210]%72\n-[:270]%73\n(\n=[:330]O%75\n)\n-[:210]%74\n-[:270,,,,drh]%80\n(\n-[:330,,,1]NH_2%106\n)\n-[:210]%79\n-[:150,,,,drh]%78\n-[:90]%77\n-[:30,,,,drh]%76\n(\n-[:330]%->74\n)\n}\n"}
PS:LaTeX是一种基于ΤΕΧ的排版系统,不光是化学方程式,其他latex语法都可以通过本镜像渲染,template.tex是模板文件,对latex排版有要求的可以自行定制
参考链接chemfig化学式转换为pdf:https://www.cnblogs.com/xiaoqi/p/chemfig.html
mol2chemfig:http://chimpsky.uwaterloo.ca/mol2chemfig/index
Chemfig中文手册:https://chemfig.man.huzheyang.cn/index.html
用latex绘制有机化学分子式:http://static.latexstudio.net/wp-content/uploads/2016/09/chemfig.pdf
以上是内存溢出为你收集整理的基于texlive定制chemfig化学式转换Python服务镜像全部内容,希望文章能够帮你解决基于texlive定制chemfig化学式转换Python服务镜像所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)