使用 LaTeX 写博客

使用 LaTeX 写博客

在我看来,所有(静态)博客框架,例如杰基尔雨果使用 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 的渲染或图像大小调整),通常也不会由静态站点生成器的作者编写代码来完成,而是由他调用的其他人编写的库来完成。

你需要什么

因此,您需要一个支持两件事的静态站点生成工具,该工具要么内置,要么带有插件:

  1. 适用于博客网站的便捷设施,例如能够设置博客文章的标题、作者、日期和标签,能够生成首页、按日期索引等(以及博客文章页面本身),以及可能支持评论或您感兴趣的其他功能。

  2. 读取 LaTeX 并从中渲染 HTML 的渲染引擎。

对于后者,两个明显的选择是使用潘多克,如果这将处理您正在编写的 LaTeX 代码,或者如果有必要的话实际上使用 TeX 本身进行渲染。

许多静态站点生成器都提供对 Pandoc 的支持,尽管它们通常设计为使用 Markdown 中嵌入的 LaTeX 语法数学,并且可能需要一些说服力才能呈现整个 LaTeX 文件。

大多数静态站点生成器可能都可以被说服(可能只需少量编程)运行外部程序(例如 TeX),并使用它们生成的输出。(毕竟,这已经是他们正在使用的处理链:读取文件,在其上或其中的一部分上运行一些代码,然后将结果输出写入某处。)

不幸的是,我对流行的 JS/Ruby/等静态站点生成器的名字并不熟悉(我使用哈基尔我自己的网站使用过很多类似的方法),所以我无法指出最接近您需要的方法。但我希望这些背景信息能为您提供所需的信息,帮助您成功找到适合您的方法。

答案3

有一个博客平台叫函子网络专为数学内容精心打造。您可以使用 LaTeX 作为此平台上博客文章的格式。以下是屏幕截图: 在此处输入图片描述

相关内容