HN 日本語サマリー

← 一覧へ戻る
プログラミング

LaTeXによるビンテージ科学論文

Vintage Scientific Papers with LaTeX (github.com)

90 pointsby petalmind8 コメント

要約

このリポジトリは、LaTeXを使用して、説得力のある古い科学論文の美学を再現するための20の独立した例を提供します。各例は、純粋なLaTeXページ、MetaPost図、またはLuaLaTeXとMetaPostを組み合わせたもので、独立してコンパイルして効果を確認できます。

全文翻訳

LaTeXによるビンテージ科学論文

20の小さなサンプルが、説得力のあるビンテージ風科学論文の背後にある独立したメカニズムを示しています。各ファイルは意図的にスタンドアロンになっており、一つをコピーしてコンパイルし、個々の効果を削除することで、それが何に寄与するかを確認できます。

サンプルは3つのグループに分かれます:純粋なLaTeXページ(1、2、4、5、6、10~14)、スタンドアロンの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 月の満ち欠け
  1. 01-early-modern-page.tex -- OpenTypeオールドスタイル数字と歴史的合字、明示的な長体s(ſ)、暖色系の紙とインクの色、非対称な余白、ドロップキャップ、スペーシングされたスモールキャップ、余白注釈、および組版ルール。
  2. 02-engraved-optics-plate.tex -- TikZによる決定的で不規則なストロークと線ハッチング。ラベルは実際の検索可能なテキストとして保持されます。
  3. 03-fiziko-hooke-apparatus.mp -- 外部fiziko MetaPostライブラリで描画されたコンパクトなフーケの装置:ハッチングされた支持部、モデル化されたバネ、吊り下げられた重り、測定された伸び。
  4. 04-ornamented-incipit.tex -- A5サイズの初期科学論文のタイトルページ。ボックス化された3行の頭文字と、通常の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 -- 5桁の対数表。各桁はコンパイル時にLua関数によって計算され、19世紀の表の罫線で設定されたライニング表形式数字で表示されます。
  11. 11-circumpolar-star-chart.tex -- 極星図。一つのマクロが赤経と赤緯をチャート座標に変換し、34個のカタログ化された星、ローマ数字で書かれた時角円、等級で分けられた円盤を表示します。
  12. 12-snow-crystal-micrographs.tex -- 4つの円形の顕微鏡視野。結晶はTikZのLindenmayerシステム文法によって生成され、一つの腕の6つの回転コピーが六角形の対称性を供給します。
  13. 13-cooling-curve-graph-paper.tex -- セピア色のグラフ用紙上のpgfplotsチャート。内向きの目盛り、オープンサークルのプロットシンボル、手書き風の曲線、およびイタリック体の余白注釈が含まれます。
  14. 14-patent-drawing-sheet.tex -- 遠心ガバナーの特許庁プレート。番号付きのリーダー線、45度でハッチングされた断面、彫刻されたボール、証人および発明者の署名線が含まれます。
  15. 15-fiziko-inclined-plane.tex -- treatiseページ。その図はfizikoによってLuaLaTeX内で描画されます。木製のウェッジ、シェーディングされたボール、斜面に沿ったおよび法線方向の重力の分解、およびページ自身のテキストと数式フォントで設定されたラベルが含まれます。
  16. 16-fiziko-telescope-plate.tex -- ケプラー望遠鏡。全ての光線はfizikoのトレーシングマクロによって屈折されます。焦点と接眼レンズ(眼が置かれる場所)は、計算された光線が軸と交差する場所で見つけられます。
  17. 17-fiziko-terrestrial-globe.tex -- fizikoの地球儀と組み込みの海岸線を使用した3つの観測点からの地球。さらに、等間隔で回転された小さな地球儀の境界行が含まれます。
  18. 18-fiziko-mechanics-primer.tex -- 2段組の章。積載されたカート、バランスの取れたレバー、振り子が含まれ、それぞれがカラム内の適切な位置に描画されます。
  19. 19-fiziko-knots-plate.tex -- 各々一つの数式から生成されたトレフォイル、キンクフォイル、セプタフォイルのコード。fizikoが交差を見つけ、ロープをシェーディングします。
  20. 20-fiziko-phases-of-the-moon.tex -- 一つの固定された光源下での8つの軌道位置における月。そして、固定された球の周りの光源を回転させることによって地球から見た同じ8つの満ち欠け。

.tex ファイルは LuaLaTeX で独立してコンパイルできます。.mp ファイルは fiziko を明示的な外部依存関係として持つスタンドアロンの MetaPost ソースです。例15~20は両方を必要とします。これらは luamplib を介して fiziko をロードする LuaLaTeX ドキュメントです。

ビルド

最も簡単な方法は、リポジトリのルートから実行するシェルスクリプトです。どちらも 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/ の中で実行: TeX Live の mpost は -output-directory が使用されている場合、
  # btex ステップが書き込む mpx ファイルを読み込めません。
  (cd build && mpost -interaction=nonstopmode -halt-on-error \
    "../examples/$name.mp")
done

各結果は build/<example-name>-1.eps という名前になります。2つのディストリビューションは job-name フラグについて意見が異なります:MiKTeX の mpost (3.00、2026年9月確認) は、-job-name=<name> が指定されない限り、最初の btex ラベルでアクセス違反によりクラッシュしますが、TeX Live の mpost はそのスペルを拒否し、job name がファイル名からデフォルトで設定されるためフラグは不要です。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 の間に書かれたラベルはドキュメント自体によって組版されるため、Computer ModernではなくEB GaramondとGaramond Mathで表示されます。

それらを記述中に2つの落とし穴に遭遇しました:

  • MetaPostのデフォルトの scaled 算術は、4096以上の randomseed 値を拒否するため、これらのファイル内のシードは小さいです。
  • MetaPost変数に floor という名前を付けないでください。これは floor 関数をシャドウし、fizikoの木材テクスチャが「Isolated expression」エラーで失敗します。

MiKTeXに関する注意:MiKTeXパッケージ luamplib (2.42.8、2026年9月確認) は luamplib.sty を提供しますが、それに必要な luamplib.lua モジュールは提供しないため、\usepackage{luamplib} は「module 'luamplib' not found」で失敗します。修正するには、CTANの luamplib.dtx から両方のファイルを luatex luamplib.dtx で抽出し、それらをTEXMFルートに一緒に配置し、ファイル名データベースを更新します。TeX Liveは影響を受けません。

設計議論からの修正点

これらのサンプルは、プロジェクトオーナーから提供されたGemini設計議論から開発されました。有用なアイデアは残されましたが、そのサンプルはそのままコピーされたわけではありません:

  • Style=Historic は汎用スイッチとしては使用されません。歴史的合字は Ligatures=Historic で明示的に要求されます。
  • 長体s(ſ)は合字ではなく、正書法上の文字です。ソースには obſerved に ſ が明示的に含まれています。EB Garamondの Historic 機能も、他のいくつかのコンテキストで長体sの形式を置き換えます。
  • \pagecolor は既に xcolor から来ています。この使用法のために別の pagecolor 依存関係は不要です。
  • 議論では、それを定義するパッケージをロードせずに \caption* が使用されました。図のMWEでは、代わりに通常のセンタリングされたテキスト行を使用しています。
  • TikZのランダムステップ装飾はシードされているため、再コンパイルしてもプレートは異なって再描画されません。

設計ノート

これは時代にインスパイアされた視覚的処理であり、歴史的に正確なファクシミリではありません。実際の17世紀、19世紀、20世紀初頭の出版物は、印刷機、日付、言語、紙、複製プロセスによって大きく異なります。

  • 対象とする出版物がそれを要求する場合、EB GaramondをIM FELL EnglishやOld Standardのような他の時代固有のOpenTypeフォントと交換してください。同じ設定がサポートされていると仮定するのではなく、置換フォントのOpenType機能を再確認してください。
  • オールドスタイル数字はデザイン上の選択であり、普遍的な歴史的規則ではありません。
  • 暖色系のページカラーと柔らかいインクは、スキャンされたコピーや経年劣化したコピーをシミュレートします。新品のオリジナルが必ずしもそれらの色を持っているわけではありません。
  • 線のアジは手作りのプレートを示唆し、ハッチングはモノクロ複製における実際のグラフィック制約を反映しています。どちらも単独で特定の彫刻プロセスを再現するものではありません。
  • 各fizikoサンプルは固定された randomseed を設定します。なぜなら、ライブラリのテクスチャのいくつかはランダムサンプリングを使用しており、そうしないと再構築時に変更されるからです。
  • 例11の星の位置はエポック2000の座標を丸めたものです。例13の冷却測定値は決定論的なリップルを持つ数式であり、測定値ではありません。例16のレンズ半径は、楽器からコピーされたのではなく、読みやすいプレートのために選択されました。例10の対数表は計算されたものであり、印刷された精度で正確です。
  • fizikoの結び目ルーチンは、その作者によって特に安定していないと文書化されています。例19は、交差が十分に離れているコードを使用しています。新しい結び目はサンプリングステップまたはロープ幅の調整が必要になる場合があります。

アクセスしやすい出力のためには、本文のコントラストを高く保ち、全ての図のラベルをテキストとして保持し、最終的なPDFをラスター化しないでください。

ライセンス

ソース、文章、生成されたサンプルはCC BY-SA 4.0の下でライセンスされています。プロジェクトを適応させる際は、それをクレジットし、リポジトリにリンクを戻し、変更点を記録し、適応にも同じライセンスを使用してください。

fiziko自体はこのリポジトリに含まれていません。それは、アップストリームプロジェクトによって公開された条件の下で、独立したGPL-3.0依存関係のままです。