在我看来,所有(静态)博客框架,例如杰基尔和雨果使用 Markdown 作为博客文章的格式。但根据
哈特尔排版第十条规则
任何足够复杂的排版系统都包含一半 LATEX 的临时、非正式指定、充满错误、缓慢的实现。(http://manual.softcover.io/book/softcover_markdown)
与 LaTeX 相比,Markdown(以及它的众多扩展)并不是一个好的格式(尤其是在长期稳定性方面)。那么有没有使用 LaTeX 作为博客文章格式的静态博客框架?或者有没有可以与常见静态博客框架结合使用的 LaTeX 到 markdown 转换器?
答案1
您可以利用 Markdown 也支持 HTML 的事实,因此要在静态站点生成器中支持 LaTeX,您只需将 LaTeX 转换为 HTML。然后只需提取元素的内容<body>
并添加 YAML 标头,就像在 Markdown 文件中一样。make4ht
可以自动执行此操作。
在我计划的博客中,我有以下目录结构:
texposts/
.make4ht
first_post/
hello.tex
second_post
world.tex
build/
www/
有三个顶级目录,texposts
一个用于 LaTeX 文档,build
一个用于保存要处理的 HTML 文件www
,以及一个由静态站点生成器填充的目录。
该.make4ht
文件是用于以下用途的特殊配置文件make4ht
:
local outdir = os.getenv "kodymirus_root" or "out"
local domfilter = require "make4ht-domfilter"
-- remove the \maketitle environment from the HTML file, title will be inserted in the template
local domprocess = domfilter{function(dom)
local maketitles = dom:query_selector(".maketitle")
for _, el in ipairs(maketitles) do
print "removing maketitle"
el:remove_node()
end
return dom
end}
filter_settings "staticsite" {
site_root = outdir,
map = {
[".css$"] = "css/"
},
header = {
layout="post",
date = function(parameters)
return os.date("!%Y-%m-%d %T", parameters.time)
end
}
}
Make:enable_extension "common_domfilters"
if mode=="draft" then
Make:htlatex {}
elseif mode=="publish" then
-- Make:htlatex {}
Make:match("html$", domprocess)
Make:enable_extension "tidy"
Make:enable_extension "staticsite"
Make:htlatex {}
else
Make:htlatex {}
Make:htlatex {}
Make:htlatex {}
end
它是一个 Lua 脚本,用于驱动从 LaTeX 到 HTML 的转换。有几件有趣的事情:
local outdir = os.getenv "kodymirus_root" or "out"
.bashrc
这将读取我的包含目录路径的环境变量集build
。
filter_settings "staticsite" {}
这包含staticsite
扩展的设置:
site_root = outdir,
设置输出目录
map = {
[".css$"] = "css/"
},
将与正则表达式匹配的生成文件移动到指定目录。此示例将 CSS 文件移动到css
构建目录中的子目录中。
header = {}
我们header
可以为 YAML 标头设置附加字段。
elseif mode=="publish" then
-- Make:htlatex {}
Make:match("html$", domprocess)
Make:enable_extension "tidy"
Make:enable_extension "staticsite"
Make:htlatex {}
make4ht
支持所谓的modes
。可以使用选项在命令行上选择这些模式-m
。默认情况下,此配置文件将创建一个独立的 HTML 文件。只有当发布完成后,您才能执行该publish
模式,这将启用staticsite
扩展并将文档发布到目录build
。
要发布文档,请在texposts/first
目录中执行以下命令:
make4ht -um publish hello.tex
关于数学,tex4ht
支持多种转换方法。默认情况下,它使用普通 HTML 文本 + 图像来处理更复杂的情况,例如显示数学等。默认图像格式为 PNG。要请求 SVG 图像,可以将特殊选项传递给tex4ht
:
make4ht -um publish hello.tex "svg"
数学图像并不是一个真正好的解决方案,默认情况下使用它主要是为了兼容性。更好的解决方案是使用"mathml"
选项的 MathML 或原始 LaTeX 代码并使用 MathJax 进行渲染。可以使用选项请求原始 LaTeX "mathjax"
。请注意,MathJax 本身必须包含在静态站点模板中。
以下是 TeX 文件的示例:
\documentclass{article}
\title{Blogging with \LaTeX}
\author{Michal}
\begin{document}
\maketitle
\tableofcontents
\section{Introduction}
\textit{příliš žluťoučký}
\printbibliography
\end{document}
这是生成的文档:
---
layout: 'post'
updated: 1524600200
styles:
- '2018-04-18-blogging-with-latex.css'
meta:
- content: 'HTML Tidy for HTML5 for Linux version 5.4.0'
name: 'generator'
- charset: 'utf-8'
- content: 'TeX4ht (http://www.tug.org/tex4ht/)'
name: 'generator'
- content: 'width=device-width,initial-scale=1'
name: 'viewport'
- content: '2018-04-18-blogging-with-latex.tex'
name: 'src'
title: 'Blogging with LaTeX'
date: '2018-04-18 20:31:14'
time: 1524083474
---
<h3 class='likesectionHead'><a id='x1-1000'></a>Contents</h3>
<div class='tableofcontents'><span class='sectionToc'>1 <a id='QQ2-1-2' href='#x1-20001'>Introduction</a></span></div>
<!-- l. 17 -->
<p class='noindent'></p>
<h3 class='sectionHead'><span class='titlemark'>1</span> <a id='x1-20001'></a>Introduction</h3>
<!-- l. 19 -->
<p class='noindent'><span class='rm-lmri-10'>příliš žluťoučký</span></p>
答案2
从抽象角度来看,你想要做的事情完全没有问题,但你需要一些背景知识来了解生态系统,这样你才能搜索并选择正确的工具。
背景
市面上有各种各样的静态网站生成工具。任何静态网站生成器的核心都是读取文件,然后将其复制到保存生成网站的输出目录,或者以某种方式处理它们以在输出目录中生成新文件。
在这个基本框架的基础上构建了附加功能,例如使用不同类型的转换工具(例如,Markdown 到 HTML、LaTeX 到 HTML、图像调整大小等)组合来自多个来源的信息(例如,YAML 标头和源文件的标记内容),并生成多个输出文件(例如,博客“首页”,其中包含多篇博客文章的标题和第一段,每个帖子都来自该帖子的单独文件)。
上述任何操作都可以集成到核心代码中,也可以作为“插件”添加,您可以将其作为选项添加到基本系统中。即使是集成到核心代码中的功能,如果它们比较复杂(例如 Markdown 到 HTML 的渲染或图像大小调整),通常也不会由静态站点生成器的作者编写代码来完成,而是由他调用的其他人编写的库来完成。
你需要什么
因此,您需要一个支持两件事的静态站点生成工具,该工具要么内置,要么带有插件:
适用于博客网站的便捷设施,例如能够设置博客文章的标题、作者、日期和标签,能够生成首页、按日期索引等(以及博客文章页面本身),以及可能支持评论或您感兴趣的其他功能。
读取 LaTeX 并从中渲染 HTML 的渲染引擎。
对于后者,两个明显的选择是使用潘多克,如果这将处理您正在编写的 LaTeX 代码,或者如果有必要的话实际上使用 TeX 本身进行渲染。
许多静态站点生成器都提供对 Pandoc 的支持,尽管它们通常设计为使用 Markdown 中嵌入的 LaTeX 语法数学,并且可能需要一些说服力才能呈现整个 LaTeX 文件。
大多数静态站点生成器可能都可以被说服(可能只需少量编程)运行外部程序(例如 TeX),并使用它们生成的输出。(毕竟,这已经是他们正在使用的处理链:读取文件,在其上或其中的一部分上运行一些代码,然后将结果输出写入某处。)
不幸的是,我对流行的 JS/Ruby/等静态站点生成器的名字并不熟悉(我使用哈基尔我自己的网站使用过很多类似的方法),所以我无法指出最接近您需要的方法。但我希望这些背景信息能为您提供所需的信息,帮助您成功找到适合您的方法。
答案3
有一个博客平台叫函子网络专为数学内容精心打造。您可以使用 LaTeX 作为此平台上博客文章的格式。以下是屏幕截图: