使用LaTeX的复古科学论文

Hacker News Top 工具

摘要

这是一个GitHub仓库,提供20个独立的LaTeX示例,用于创建复古科学论文的美学效果,其中整合了MetaPost和LuaTeX进行图形和排版。

暂无内容
查看原文
查看缓存全文

缓存时间: 2026/09/13 02:34

Foadsf/vintage-latex 来源:https://github.com/Foadsf/vintage-latex

使用 LaTeX 还原复古科学论文

二十个小示例展示了营造逼真旧式科学论文美感背后的独立机制。每个文件都刻意独立:复制一份,编译它,并逐一移除效果以观察其贡献。示例分为三组:纯 LaTeX 页面(1、2、4、5、6、10 至 14)、独立的 fiziko (https://github.com/jemmybutton/fiziko) MetaPost 图(3、7、8、9),以及包含由 LuaTeX 内置 MetaPost 绘制的 fiziko 图的 LaTeX 页面(15 至 20)。

图集

编译输出结果的低分辨率预览;PDF 本身是矢量且可搜索的。

01020304
01 早期现代页面02 雕版光学图版03 胡克仪器装置04 装饰性篇首
05060708
05 维多利亚式报纸06 自然史目录07 透镜光线08 阿特伍德机
09101112
09 阴影图谱10 对数表11 恒星极区星图12 雪晶显微照片
13141516
13 冷却曲线坐标纸14 专利图纸页15 斜面16 望远镜图版
17181920
17 地球仪18 力学入门19 绳结图版20 月相

示例说明

  1. 01-early-modern-page.tex – OpenType 旧式数字和历史连字,显式的长 s,温暖的纸张和墨水颜色,不对称页边距,首字下沉,间距小大写字母,旁注和印刷边线。
  2. 02-engraved-optics-plate.tex – TikZ 中确定性不规则笔触和线条阴线,标签保留为真实可搜索文本。
  3. 03-fiziko-hooke-apparatus.mp – 使用外部 fiziko (https://github.com/jemmybutton/fiziko) MetaPost 库绘制的紧凑胡克装置:阴线支撑、模拟弹簧、悬挂重物和测量延伸量。
  4. 04-ornamented-incipit.tex – 一个 A5 早期科学书籍标题页,包含一个方框三行首字母和一个由普通 TikZ 路径制作的小型矢量装饰。
  5. 05-victorian-newspaper.tex – 一份紧凑方形大报,包含报头、平衡分栏、栏间分隔线、拉引语、文章标题和气象记录。
  6. 06-natural-history-catalogue.tex – 博物馆目录页,使用悬垂条目、点状引线、显式排版角色和旧式数字数据。
  7. 07-fiziko-lens-rays.mp – 一个玻璃透镜,其光路由 fiziko 的折射宏计算得出,而非绘制到预定的焦点。
  8. 08-fiziko-atwood-machine.mp – 一个由阴线支撑、阴影滑轮、弯曲绳索、悬挂重物和加速度箭头组成的阿特伍德机。
  9. 09-fiziko-shading-atlas.mp – 线条阴影、点彩和可变宽度阴影管的并列比较。
  10. 10-lua-table-of-logarithms.tex – 一个五位对数表,其每一位数字都在编译时由 Lua 函数计算得出,使用十九世纪表格的衬线规则和直列数字。
  11. 11-circumpolar-star-chart.tex – 一个极坐标星图:一个宏将三十四颗编录恒星的赤经和赤纬转换为星图坐标,时圈用罗马数字标记,并有按星等分级的圆点。
  12. 12-snow-crystal-micrographs.tex – 四个圆形显微镜视野;晶体由 TikZ 林登迈耶系统文法生成,一个分支的六个旋转副本提供了六重对称性。
  13. 13-cooling-curve-graph-paper.tex – 一个绘制在褐色坐标纸上的 pgfplots 图表,带有向内刻度、空心圆形绘图符号、手工拟合曲线和斜体旁注。
  14. 14-patent-drawing-sheet.tex – 一张离心调速器的专利局图纸:编号指引线、四十五度阴线截面、雕版球体,以及证人和发明人签名栏。
  15. 15-fiziko-inclined-plane.tex – 一个论文页面,其插图由 fiziko 在 LuaLaTeX 内绘制:一个木楔、一个阴影球体,以及沿斜面和垂直于斜面分解的重力,标签使用页面自身的文本和数学字体设置。
  16. 16-fiziko-telescope-plate.tex – 一个开普勒望远镜,其中每条光线都由 fiziko 的追踪宏折射;焦点和出瞳(眼睛放置的位置)位于计算光线与轴线相交处。
  17. 17-fiziko-terrestrial-globe.tex – 使用 fiziko 内置海岸线的地球仪从三个观测站展示地球,另有一排按等角度旋转的小型地球仪边饰。
  18. 18-fiziko-mechanics-primer.tex – 一个双栏章节,包含一辆装载的推车、一个平衡的杠杆和一个摆,每个都在其所在栏内就位绘制。
  19. 19-fiziko-knots-plate.tex – 三叶、五叶和七叶绳结,每个由一个公式得出,fiziko 负责找出交叉点并为绳索添加阴影。
  20. 20-fiziko-phases-of-the-moon.tex – 在一个固定光源下的八个月球轨道位置,以及通过围绕固定球体旋转光源从地球上看到的相同八个月相。

.tex 文件可使用 LuaLaTeX 独立编译。.mp 文件是独立的 MetaPost 源文件,fiziko 作为显式外部依赖。示例 15 至 20 需要两者:它们是 LuaLaTeX 文档,通过 luamplib 加载 fiziko。

构建

最快的方法是使用针对您 shell 的脚本,从仓库根目录运行。两者都将每个示例编译到 build/ 目录,并在未提供 fiziko 签出时跳过 fiziko 示例:

.\build.ps1 -Fiziko ..\fiziko  # PowerShell 7
./build.sh ../fiziko  # POSIX shell

在末尾追加示例名称以仅构建这些示例。下面的章节详细说明了手动执行相同命令的步骤。

要求:

  • LuaLaTeX (TeX Live 或 MiKTeX);
  • LaTeX 包 fontspec, geometry, microtype, multicol, xcolor, tikz(及其 lindenmayersystems, patterns.meta, calcshapes.geometric 库),pgfplots, luacode, 和 array
  • EB Garamond(TeX Live 和 MiKTeX 中的 ebgaramond 包)。

从仓库根目录开始,创建输出目录并编译所有纯 LaTeX 示例:

# PowerShell 7 on Windows
New-Item -ItemType Directory -Force build | Out-Null
$names = @(
  '01-early-modern-page',
  '02-engraved-optics-plate',
  '04-ornamented-incipit',
  '05-victorian-newspaper',
  '06-natural-history-catalogue',
  '10-lua-table-of-logarithms',
  '11-circumpolar-star-chart',
  '12-snow-crystal-micrographs',
  '13-cooling-curve-graph-paper',
  '14-patent-drawing-sheet'
)
foreach ($name in $names) {
  lualatex -interaction=nonstopmode -halt-on-error `
    -output-directory=build "examples/$name.tex"
}
# POSIX shell on Linux or macOS
mkdir -p build
for name in \
  01-early-modern-page \
  02-engraved-optics-plate \
  04-ornamented-incipit \
  05-victorian-newspaper \
  06-natural-history-catalogue \
  10-lua-table-of-logarithms \
  11-circumpolar-star-chart \
  12-snow-crystal-micrographs \
  13-cooling-curve-graph-paper \
  14-patent-drawing-sheet
do
  lualatex -interaction=nonstopmode -halt-on-error \
    -output-directory=build "examples/$name.tex"
done

源文件故意拒绝 pdfLaTeX。该引擎无法提供此处演示的 OpenType 控制。

构建 fiziko 示例

单独克隆 fiziko;它未在此仓库中提供或重新授权:

git clone https://github.com/jemmybutton/fiziko.git ../fiziko

MetaPost 通过 MPINPUTS 查找 fiziko.mp。保留尾部路径分隔符,以便正常的 MetaPost 搜索路径保持可用。

# PowerShell 7 on Windows
$env:MPINPUTS = "$((Resolve-Path ../fiziko).Path);"
New-Item -ItemType Directory -Force build | Out-Null
$names = @(
  '03-fiziko-hooke-apparatus',
  '07-fiziko-lens-rays',
  '08-fiziko-atwood-machine',
  '09-fiziko-shading-atlas'
)
foreach ($name in $names) {
  # -job-name 是 MiKTeX 的 mpost 所需的;在 TeX Live 上可省略(见下文)。
  mpost -interaction=nonstopmode -halt-on-error `
    -job-name=$name -output-directory=build "examples/$name.mp"
}
# POSIX shell on Linux or macOS
export MPINPUTS="$(cd ../fiziko && pwd):"
mkdir -p build
for name in \
  03-fiziko-hooke-apparatus \
  07-fiziko-lens-rays \
  08-fiziko-atwood-machine \
  09-fiziko-shading-atlas
do
  # 从 build/ 内部运行:当使用 -output-directory 时,TeX Live 的 mpost 无法读取其 btex 步骤写入的 mpx 文件。
  (cd build && mpost -interaction=nonstopmode -halt-on-error \
    "../examples/$name.mp")
done

每个结果命名为 build/-1.eps。两个发行版对 job-name 标志的处理不同:MiKTeX 的 mpost (3.00, 2026年9月检查) 在第一个 btex 标签处崩溃并出现访问违规,除非给出 -job-name=,而 TeX Live 的 mpost 拒绝该拼写,并且根本不需要标志,因为作业名默认为文件的基名。build.ps1 检测 MiKTeX 并添加标志;build.sh 则从不这样做。

使用 Ghostscript 将 EPS 文件转换为 PDF 或 PNG;不要直接从 MetaPost 请求 PDF,除非检查了文件签名。每个源文件都使用 prologues := 3,因此标签是嵌入的,并且输出带有 EPSF 头部。

构建内嵌 fiziko 的 LaTeX 页面

示例 15 至 20 另外需要:

  • luamplib 包,它在 LuaTeX 内运行 MetaPost;
  • unicode-mathgaramond-math 包,以便图表上的数学标签与 EB Garamond 匹配。

luamplib 通过与上文相同的 MPINPUTS 变量查找 fiziko.mp,因此在运行 LuaLaTeX 之前设置它:

# PowerShell 7 on Windows
$env:MPINPUTS = "$((Resolve-Path ../fiziko).Path);"
New-Item -ItemType Directory -Force build | Out-Null
$names = @(
  '15-fiziko-inclined-plane',
  '16-fiziko-telescope-plate',
  '17-fiziko-terrestrial-globe',
  '18-fiziko-mechanics-primer',
  '19-fiziko-knots-plate',
  '20-fiziko-phases-of-the-moon'
)
foreach ($name in $names) {
  lualatex -interaction=nonstopmode -halt-on-error `
    -output-directory=build "examples/$name.tex"
}
# POSIX shell on Linux or macOS
export MPINPUTS="$(cd ../fiziko && pwd):"
mkdir -p build
for name in \
  15-fiziko-inclined-plane \
  16-fiziko-telescope-plate \
  17-fiziko-terrestrial-globe \
  18-fiziko-mechanics-primer \
  19-fiziko-knots-plate \
  20-fiziko-phases-of-the-moon
do
  lualatex -interaction=nonstopmode -halt-on-error \
    -output-directory=build "examples/$name.tex"
done

这些页面遵循一个模式。\everymplib 输入 fiziko.mp,固定随机种子,设置线宽和光照方向,并通过 drawoptions 用页面的墨色为所有笔触添加色调;然后每个图形就是一个普通的 mplibcode 环境,放置在文本中应有的位置。写在 btexetex 之间的标签由文档本身排版,这就是为什么它们出现在 EB Garamond 和 Garamond Math 中,而不是 Computer Modern。

编写它们时遇到的两个陷阱:

  • MetaPost 的默认 scaled 算术拒绝 4096 或更大的 randomseed 值,因此这些文件中的种子较小。
  • 不要将 MetaPost 变量命名为 floor:它会遮蔽 floor 函数,fiziko 的木质纹理随后会因“孤立表达式”错误而失败。

MiKTeX 注意事项: MiKTeX 包 luamplib (2.42.8, 2026年9月检查) 包含 luamplib.sty 但不包含其所需的 luamplib.lua 模块,因此 \usepackage{luamplib} 会因“未找到模块 ‘luamplib’”而失败。解决方法是从 CTAN 的 luamplib.dtx 中使用 luatex luamplib.dtx 提取这两个文件,并将它们一起放置在 TEXMF 根目录中,然后刷新文件名数据库。TeX Live 不受影响。

从设计讨论中纠正了什么

这些示例是从项目所有者提供的 Gemini 设计讨论中开发出来的。有用的想法保留了下来,但其示例并未原样复制:

  • Style=Historic 未用作通用开关。历史连字通过 Ligatures=Historic 显式请求。
  • s 是一个正字法字符,本身不是连字。源文件在 observed 中显式包含 s;EB Garamond 的 Historic 特性也会在某些其他上下文中替换长 s 形式。
  • \pagecolor 已经来自 xcolor;对于此用途,单独的 pagecolor 依赖项是不必要的。
  • 讨论中使用了 \caption* 但没有加载定义它的包。示例 MWE 使用了普通的居中文本行代替。
  • TikZ 的随机步骤装饰有种子,因此重新编译不会改变图版的绘制。

设计说明

这是一种受时代启发的视觉处理,而非历史精确的复制品。真正的十七世纪、十九世纪和二十世纪初的出版物在印刷机、日期、语言、纸张和复制工艺上都有很大差异。

  • 当目标出版物需要时,将 EB Garamond 替换为另一个特定时期的 OpenType 字体,如 IM FELL English 或 Old Standard。重新检查替换字体的 OpenType 特性,而不是假设支持相同的设置。
  • 旧式数字是一种设计选择,而非普遍的历史规则。
  • 温暖的页面颜色和柔和的墨水模拟扫描或老化副本;崭新的原件不一定有这些颜色。
  • 线条抖动暗示手工制作的印版,而阴线反映了单色复制的真实图形限制。两者本身都不能复制特定的雕版工艺。
  • 每个 fiziko 示例都设置了固定的 randomseed,因为该库的几种纹理使用随机采样,否则在重新构建时会发生变化。
  • 示例 11 中的恒星位置是四舍五入的 J2000.0 坐标;示例 13 中的冷却读数是带有确定性波纹的公式,而非测量值;示例 16 中的透镜半径是为了图版清晰可读而选择的,并非复制自仪器;示例 10 中的对数表是计算得出的,因此其精度与印刷精度一致。
  • fiziko 中的绳结例程被其作者记录为不特别稳定。示例 19 使用了交叉点良好分离的绳索;新绳结可能需要调整其采样步长或绳索宽度。

为了获得无障碍的输出,保持正文高对比度,保留所有图表标签为文本,并且不要将最终 PDF 光栅化。

许可证

源代码、文章和生成的示例在 CC BY-SA 4.0 (https://creativecommons.org/licenses/by-sa/4.0/) 许可下。改编项目时,请注明出处,链接回仓库,注明您的更改,并对改编作品使用相同的许可证。

fiziko 本身不包含在此仓库中。它仍然是一个单独的 GPL-3.0 依赖项。

相似文章

PaperFit:用于科学文档的视觉闭环排版优化

Hugging Face Daily Papers

本文介绍了 PaperFit,这是一种视觉闭环智能体,能够迭代诊断并修复 LaTeX 文档中的布局缺陷,以生成可用于出版的 PDF。此外,本文还提出了一个新基准 PaperFit-Bench,用于评估视觉排版优化的性能。

@GitHub_Daily: 写论文的时候,画模型架构图、做汇报 PPT、整理实验数据图表,每个环节都要切换不同工具,反复折腾格式,的确耗时间。 最近看到 Paper2Any 这个开源项目,直接把论文丢进去,就能一键生成各种学术素材。 上传论文 PDF、截图或文字,A…

X AI KOLs Timeline

Paper2Any 是一个开源项目,可自动从论文 PDF、截图或文字中生成模型架构图、PPT 演示文稿、实验图表等学术素材,支持编辑、Docker 一键部署。