我希望构建一个能够实现以下目标的解决方案:
- 客户端从服务器发送文件规范
- TeX 文件是根据这些规范从“TeX 片段池”组装而成的
- 组装好的 TeX 文件被编译为 pdf
- PDF 已提供给客户端
需要注意的是,客户端不允许在 TeX 级别编辑文件。就用户体验而言,用户只需下载 pdf 即可。
但是,由于我希望为由上述“TeX 片段池”的不同选择组成的文件“系列”提供服务,因此无法预编译 pdf。
有哪些可用的解决方案可以实现这一目标?
那这个呢?有人试过部署它吗?https://manuels.github.io/texlive.js/
答案1
我思考我知道你在问什么
这将是 stack overflow 风格的答案,但你可以设置一个调用 pdflatex 的服务器。有许多服务器提供商,例如https://www.digitalocean.com/和亚马逊网络服务。您需要设置一个 Linux 服务器并按照以下指南操作如何在 Ubuntu 上安装 LaTeX。然后,您可以编写一个小脚本,例如使用 Python、PHP、Ruby 或任何您想要的服务器语言。
为了让您了解如何在 python 中实现这一点,脚本可以是这样的(注意!未经测试。主要是针对 Slack-bot 的修改脚本)。
from string import Template
import os
import subprocess
import tempfile
from fpdf import FPDF
from flask import Flask, Response, request
import requests as py3reqs
app = Flask(__name__)
@app.route("/toTex/<theTex>", methods=['GET'])
def render_latex(theTex):
with tempfile.TemporaryDirectory() as work_dir:
try:
str2pdf(theTex, work_dir)
return send_from_directory(directory=work_dir,
filename="out.pdf",
mimetype='application/pdf')
except Exception as e:
print(e)
return "Invalid LaTeX?\n{}".format(request.form['text'])
def str2pdf(input_string, work_dir):
with open('template.tex','r') as f:
s = Template(f.read())
out_txt = s.substitute(my_text=input_string)
with open(os.path.join(work_dir, 'out.tex'),'w') as f:
f.write(out_txt)
subprocess.check_call(['pdflatex', '-pdf', '-halt-on-error', 'out.tex'], cwd=work_dir, stdout=None, stderr=None)
if __name__=="__main__":
port=80
app.run("0.0.0.0", port=int(port))
现在您可以连接到服务器并下载 TeX 文件。由于最终用户不应该更改 TeX,因此显然必须进行更改。