使用LaTeX的复古科学论文
摘要
这是一个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 本身是矢量且可搜索的。
| 01 | 02 | 03 | 04 | |
| 01 早期现代页面 | 02 雕版光学图版 | 03 胡克仪器装置 | 04 装饰性篇首 | |
| 05 | 06 | 07 | 08 | |
| 05 维多利亚式报纸 | 06 自然史目录 | 07 透镜光线 | 08 阿特伍德机 | |
| 09 | 10 | 11 | 12 | |
| 09 阴影图谱 | 10 对数表 | 11 恒星极区星图 | 12 雪晶显微照片 | |
| 13 | 14 | 15 | 16 | |
| 13 冷却曲线坐标纸 | 14 专利图纸页 | 15 斜面 | 16 望远镜图版 | |
| 17 | 18 | 19 | 20 | |
| 17 地球仪 | 18 力学入门 | 19 绳结图版 | 20 月相 |
示例说明
01-early-modern-page.tex– OpenType 旧式数字和历史连字,显式的长 s,温暖的纸张和墨水颜色,不对称页边距,首字下沉,间距小大写字母,旁注和印刷边线。02-engraved-optics-plate.tex– TikZ 中确定性不规则笔触和线条阴线,标签保留为真实可搜索文本。03-fiziko-hooke-apparatus.mp– 使用外部 fiziko (https://github.com/jemmybutton/fiziko) MetaPost 库绘制的紧凑胡克装置:阴线支撑、模拟弹簧、悬挂重物和测量延伸量。04-ornamented-incipit.tex– 一个 A5 早期科学书籍标题页,包含一个方框三行首字母和一个由普通 TikZ 路径制作的小型矢量装饰。05-victorian-newspaper.tex– 一份紧凑方形大报,包含报头、平衡分栏、栏间分隔线、拉引语、文章标题和气象记录。06-natural-history-catalogue.tex– 博物馆目录页,使用悬垂条目、点状引线、显式排版角色和旧式数字数据。07-fiziko-lens-rays.mp– 一个玻璃透镜,其光路由 fiziko 的折射宏计算得出,而非绘制到预定的焦点。08-fiziko-atwood-machine.mp– 一个由阴线支撑、阴影滑轮、弯曲绳索、悬挂重物和加速度箭头组成的阿特伍德机。09-fiziko-shading-atlas.mp– 线条阴影、点彩和可变宽度阴影管的并列比较。10-lua-table-of-logarithms.tex– 一个五位对数表,其每一位数字都在编译时由 Lua 函数计算得出,使用十九世纪表格的衬线规则和直列数字。11-circumpolar-star-chart.tex– 一个极坐标星图:一个宏将三十四颗编录恒星的赤经和赤纬转换为星图坐标,时圈用罗马数字标记,并有按星等分级的圆点。12-snow-crystal-micrographs.tex– 四个圆形显微镜视野;晶体由 TikZ 林登迈耶系统文法生成,一个分支的六个旋转副本提供了六重对称性。13-cooling-curve-graph-paper.tex– 一个绘制在褐色坐标纸上的 pgfplots 图表,带有向内刻度、空心圆形绘图符号、手工拟合曲线和斜体旁注。14-patent-drawing-sheet.tex– 一张离心调速器的专利局图纸:编号指引线、四十五度阴线截面、雕版球体,以及证人和发明人签名栏。15-fiziko-inclined-plane.tex– 一个论文页面,其插图由 fiziko 在 LuaLaTeX 内绘制:一个木楔、一个阴影球体,以及沿斜面和垂直于斜面分解的重力,标签使用页面自身的文本和数学字体设置。16-fiziko-telescope-plate.tex– 一个开普勒望远镜,其中每条光线都由 fiziko 的追踪宏折射;焦点和出瞳(眼睛放置的位置)位于计算光线与轴线相交处。17-fiziko-terrestrial-globe.tex– 使用 fiziko 内置海岸线的地球仪从三个观测站展示地球,另有一排按等角度旋转的小型地球仪边饰。18-fiziko-mechanics-primer.tex– 一个双栏章节,包含一辆装载的推车、一个平衡的杠杆和一个摆,每个都在其所在栏内就位绘制。19-fiziko-knots-plate.tex– 三叶、五叶和七叶绳结,每个由一个公式得出,fiziko 负责找出交叉点并为绳索添加阴影。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,calc和shapes.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-math和garamond-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 环境,放置在文本中应有的位置。写在 btex 和 etex 之间的标签由文档本身排版,这就是为什么它们出现在 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:用于科学文档的视觉闭环排版优化
本文介绍了 PaperFit,这是一种视觉闭环智能体,能够迭代诊断并修复 LaTeX 文档中的布局缺陷,以生成可用于出版的 PDF。此外,本文还提出了一个新基准 PaperFit-Bench,用于评估视觉排版优化的性能。
@tom_doerr: 将非结构化研究转化为可直接提交的LaTeX论文 https://github.com/Ar9av/PaperOrchestra…
PaperOrchestra 是一个面向编码智能体的可插拔技能包,能够通过五智能体流水线将非结构化研究材料转化为完整的LaTeX论文,在PaperWritingBench基准测试中均优于基线方法。
@GithubProjects:具有超能力的Markdown。一个语法搞定论文、演示、网站和书籍。
一款增强Markdown的工具,能用单一语法处理论文、演示、网站和书籍。
@GitHub_Daily: 写论文的时候,画模型架构图、做汇报 PPT、整理实验数据图表,每个环节都要切换不同工具,反复折腾格式,的确耗时间。 最近看到 Paper2Any 这个开源项目,直接把论文丢进去,就能一键生成各种学术素材。 上传论文 PDF、截图或文字,A…
Paper2Any 是一个开源项目,可自动从论文 PDF、截图或文字中生成模型架构图、PPT 演示文稿、实验图表等学术素材,支持编辑、Docker 一键部署。
PDFMathTranslate: 保留版式的科学文档翻译工具
本文介绍PDFMathTranslate,一款基于大语言模型和精准版式检测技术的开源科学文档翻译工具,可在翻译过程中保留原文档的版式。