Florilegium: گلهای رویه ای در لاتک
آدرس مقاله: https://github.com/kevinraymond/florilegium آدرس نظرات: https://news.ycombinator.com/item?id=50305637 امتیاز: 288 # نظرات: 47
در پست ردیت پرسیده شد که چگونه می توان چنین گل هایی را در لاتک درست کرد. من نمی دانم اصل آن چگونه ساخته شده است. این پروژه یکی از راههای ممکن است، و روشی که من انجام دادم از ابتداییهای دستنویس با پارامترهای تصادفی استفاده میکند، که در Lua نقاشی شدهاند و با یک طرحبندی رویهای قرار گرفتهاند که بخش «فضای استفادهنشده را پر کنید» ایدهای در سال 1998 از ادبیات تزئینی وام گرفته است. ظاهری مشابه دارد، اما من به صراحت سعی کردم نسخه اصلی را تکرار نکنم.
این پروژه با کمک هوش مصنوعی (کلود) ساخته شده است و من روندی را که برای زنده کردن آن استفاده کردم به اشتراک می گذارم.
حاشیههای صفحه گلدار آبی دلفت برای LaTeX بهصورت رویهای ایجاد شده است. بدون تصویر، بدون مسیرهای وارداتی، بدون دارایی خارجی: هر گلبرگ، برگ و ساقه یک منحنی پارامتریک است که در Lua محاسبه میشود، در حالی که صفحه نوشته میشود، مانند آبرنگ نقاشی میشود و مستقیما در PDF نوشته میشود. هر صفحه باغ مخصوص به خود را دارد.
شش دانه از ترکیب رشد یافته. همان کد، دانه متفاوت - و باغ هر فضایی را که متن آزاد می گذارد پر می کند.
دو سند یک بسته را به اشتراک می گذارند و دو سند دیگر ( showcase.tex ، spread.tex ) نشان می دهد که چه کارهای دیگری انجام می دهد:
هر دو پیدیاف خود توصیفی هستند: متن اصلی نحوه ترسیم حاشیه است.
آخرین صفحه سند رشد یافته: متن زود به پایان می رسد، بنابراین به فضای زیر منشعب می شود.
برش 300 نقطه در اینچ. شستشوی خالدار با رگههای سفید بیرون زده، برگهای لوبدار با رگبرگهای سفید، گیلاسهای فراموششده، گل ارواح رنگ پریده پشت ساقهها.
Seed 6، از یک حاشیه خالی تا صفحه تمام شده. ساقهها ابتدا بالا میآیند، با عبور نوکها از گرههای خود برگها باز میشوند و هر ساقه به گل ختم میشود. سپس حلقه حریص کار را به دست می گیرد: در سمت راست، هر دایره نقطه چین بزرگترین دیسک آزاد است که درست قبل از اینکه شاخه ای به سمت آن رشد کند. سوراخ های بزرگ اول و به آرامی ایجاد می شوند، سوراخ های کوچک آخرین و سریع. پروانهها و زنبورها پرواز میکنند، پرنده روی شاخههایش میلغزد و حلزون تا آخرین قاب ساقهاش میخزد، که دقیقا همان صفحهای است که این دانه همیشه میدهد.
رشد یک بار ثبت می شود، در حالی که صفحه گذاشته می شود: هر ساقه نیز به عنوان پیشوندهای افزایش طول و هر موتیف در چند مقیاس کوچکتر ترسیم می شود و همان ترسیم های تصادفی را دوباره پخش می کند. سپس یک قاب قطعاتی را که زمان آن فرا رسیده است، به ترتیب نقاشی اولیهشان مینویسد. make grow-6 یک دانه را به این ترتیب رندر می کند (build/grow-6.gif و .mp4، حدود 45 ثانیه). EXPLAIN=1 را برای دایره های چین اضافه کنید.
showcase.tex، "یک سال در حاشیه": بهار در صفحه اول، تابستان، پاییز در آخرین صفحه. هر بخش ویژگی هایی را که نشان می دهد توضیح می دهد.
حاشیه رشد یافته می تواند به سند اطراف خود پاسخ دهد:
یک دانه در بهار، اوایل تابستان، اواخر تابستان و پاییز. فصل ها چیزی را که رشد می کند تغییر می دهند، نه مکان را.
بیشتر صفحات بازدیدکننده دارند: یک یا دو پروانه و زنبورها در فضاهای باز، یک حلزون که یکی از ساقه های اصلی را می خزد، و در حدود یک صفحه از هر پنج صفحه، پرنده ای که روی شاخه ای از خود نشسته است. آنها از یک جریان تصادفی خودشان می آیند، بنابراین یک صفحه بدون آنها دقیقا همان صفحه ای است که می شد. گزینه novisitors آنها را کنار گذاشته است.
کل پالت از یک رنگ می آید، جوهر: آبی دلفت، قهوه ای، سبز، زرشکی، بنفش، سبز. سطح شیب دار از تیره ترین ضربه تا کم رنگ ترین شستشو از آن رنگ در OKLCH محاسبه می شود، بنابراین انتهای روشن هرگز خاکستری نمی شود.
دانه 6 سه بار: همانطور که همیشه رشد کرد، با موضوع = هندسی، و با موضوع = ریاضی.
حلقه رشد هرگز نمی دانست چه چیزی ترسیم می کند. جدولی از نقوش را میخواند (اندازه دیسکی که هر دیسک میگیرد، وزن، تابعی که آن را ترسیم میکند) و هر اولیه را با نام فرا میخواند. تم یک فایل Lua است، theme-<name>.lua، که جایگزین برخی از آن موارد اولیه میشود و ممکن است ردیفهایی را به جدول اضافه کند یا ترکیبی از خود بیاورد.
theme=geometric همان گیاهی است که از اشکال صاف بریده شده است (theme-geometric.lua). دقیقا مانند گلها رشد می کند و فقط نقشه تغییر می کند: ساقه ها مستقیما بین گره های خود قرار می گیرند، برگ ها بادبادک ها و چند ضلعی های دندانه دار هستند که به صورت یک وجه روشن و تیره با رگه های سفید صاف تا شده اند، گل ها رزت هایی از لوزی یا چند ضلعی های ستاره ای لایه ای، پیچک ها به شکل مارپیچ مربعی، پرنده و پروانه کم ارتفاع هستند. رنگ ها رنگ های صاف جوهر هستند، بدون شستشو. کریستال ها (مواد جامد افلاطونی، با سایه صاف مانند سنگ های بریده) در میان گل ها رشد می کنند.
اندازه یک صفحه تقریبا یک دهم صفحه فلور است.
theme=ریاضی اصلا گیاهی نیست (theme-math.lua، ترسیم از شکلها.lua): ریاضیات که از حاشیه و در پایین صفحه به صورت آبشاری میآیند، کمی روی هم قرار میگیرند تا با هم ترکیب شوند. یک شکل بزرگ در گوشه ای که ستون به پایین می رسد (یک واشر آپولونی، یک دانه برف عمیق کوچ، دیسک ووگل، یک چند وجهی) نشسته است.
در پایین ستون یک یا دو خانواده اجرا میشوند، شکلهایی که در طول حرکت تغییر میکنند، که با فلشهای کوچک مسی به هم میپیوندند: دانهی برف کوخ یک سطح بهدست میآورد، چندضلعی که در مسیر خود به دایره میرسد، مکعبی که به هشت ضلعی کوتاه میشود، آکوردهای k → mk mod n تبدیل شدن از یک کاردیوید به یک دیسک ژل طلایی، حتی یک دیسکی طلایی.
معادلات (e^{iπ} + 1 = 0، V − E + F = 2، ...) در امتداد پایین و زیر متن صفحه آخر اجرا می شوند، و هر چیز دیگری، بزرگترین سوراخ اول، ارقام است (جامدات افلاطونی، گره ها، منحنی های هیلبرت، منحنی های لیساژوس، هیپوتروکوئیدها، رزهای مورر، رزهای ماورر، تعداد زیادی از حروف ته و نمادهای پیترسن). اندازه ها و یک شیب جزئی و نقاط. هر فضایی را که صفحه باقی می گذارد، مانند باغ، پر می کند. چگالی تعیین می کند که چقدر وجود دارد.
یک سند بدون طرح زمینه مانند قبل از وجود تم ها، بایت به بایت منتشر می شود.
بذر 6 در تراکم 1، 0.5، 0.2 و 0.05 و در شدت 0.5=.
یک باغ کامل در کنار یک معادله چیز زیادی است. دو گزینه با هر موضوعی آن را رد میکند:
در پیش فرض های ( 1 و 1 ) هر صفحه دقیقا همان صفحه ای است که قبلا بوده است.
یا اصلا حاشیه وجود ندارد: \florilegiumornament{leaf} یک اولیه را در خط، در کادری به اندازه یک حرف قرار میدهد، برای مثال برای باز کردن یک پاراگراف. هر زیور در یک سند شکل خاص خود را پیدا می کند و آن را از یک ساخت به ساخت بعدی حفظ می کند. seed=random هر بار که PDF ساخته می شود، یک مورد جدید می کشد و seed=7 یک مورد ثابت.
هر گونه آثار ابتدایی (برگ، برگه، گل، شکوفه، غنچه، زنگ، زنبق، سینه، چتر، پروانه، زنبور عسل، پرنده، هدرا، درخشش، ...) و همچنین تم فعلی (کریستال با هندسی، گره، گره، ...)
spread.tex، صفحات 2 و 3: یک سند دو طرفه با حاشیه بیرونی وسیع. باغ در سمت چپ صفحه سمت چپ و به شکل آینه ای در سمت راست صفحه سمت راست رشد می کند. صفحه آخر نیز به موضوع هندسی تغییر می کند.
باغ در هر حاشیه ای که پهن تر باشد رشد می کند، بنابراین چیزی برای تنظیم وجود ندارد. در یک سند دو طرفه (دو طرف با حاشیه بیرونی وسیع) طرف با صفحه تغییر می کند. یک سند یک طرفه با حاشیه راست گسترده آن را در سمت راست هر صفحه قرار می دهد. یک صفحه آینه شده به گونه ای طراحی می شود که گویی در آینه دیده می شود، سپس از طریق یک بازتاب کشیده می شود: آخرین تبدیلی که هر نقطه قبلا از آن عبور می کند. دقیقا بازتاب باغی است که همان دانه در سمت چپ رشد می کند.
postscript/florilegium.ps: حاشیه افزایش یافته در PostScript خالص، یک فایل مستقل. Ghostscript یا یک چاپگر، هر گلبرگ را هنگام تفسیر صفحه محاسبه می کند و دو صفحه متن توضیح می دهد که چگونه.
هسته ترسیم، هر اولیه و حلقه رشد از ink.lua، flora.lua و grow.lua، رویه رویه منتقل میشوند. به TeX و فایل دیگری نیاز ندارد:
-dSeed=N باغ را برمی دارد. بدون آن ساعت یکی را انتخاب می کند، بنابراین هر چاپ جدید است. -dAge=0 تا 1 فصل را تعیین می کند و -dNoVisitors پروانه ها، زنبورها، حلزون و پرنده را کنار می گذارد. دو صفحه حدود 2.5 ثانیه طول می کشد. بیشتر نقشههای Lua مستقیما: ماتریس تبدیل خود پست اسکریپت هر یک از موارد ابتدایی را قرار میدهد (ترجمه، چرخش، مقیاس)، مسیرها و منحنیهای Bézier بومی هستند، و رویههای ساخته شده در زمان اجرا برای بستههای Lua قرار میگیرند (نیمه عرض گلبرگ روشی است که به سازنده طرح داده میشود). چهار چیز ترسیم نمی شود:
این فایل دو بار به یک جوهرافشان اپسون با lp postscript/florilegium.ps ارسال شد، بدون اینکه دانه ای داده شود. سیستم چاپ کامپیوتر دوباره برنامه را برای هر کار اجرا می کند، بنابراین هر چاپ دانه خود را از ساعت می گیرد و باغ متفاوتی ایجاد می کند. چاپگر نسخه مات را دریافت می کند، زیرا هیچ شفافیتی ندارد.
LuaLaTeX، یک پاس، حدود یک ثانیه در صفحه (دو پاس برای showcase.tex، که فصول آن به تعداد صفحات نیاز دارند).
TeX نصب نیست؟ یک بار تصویر را بسازید و همه چیز را در آن اجرا کنید:
یا florilegium.sty، نه فایل .lua و یکی از فایل های .tex را در یک پروژه Overleaf قرار دهید و کامپایلر را روی LuaLaTeX تنظیم کنید.
یک دانه ثابت به جای شماره صفحه: lualatex "\def\florilegiumseed{7}\input{florilegium-grow.tex}" .
هر بدوی را می توان به تنهایی در داخل یک تصویر TikZ، تحت تغییر، چرخش و مقیاس دامنه فعلی ترسیم کرد:
با یک موضوع، موارد اولیه آن را نیز می توان با نام ترسیم کرد: \florilegiumdraw{crystal}{1.0} در زیر theme=geometric (نگاه کنید به specimen-geometric.tex)، \florilegiumdraw{knot}{1.2} تحت theme=math .
طراحی (ink.lua). تمام هندسه در Lua محاسبه شده و به عنوان عملگرهای مسیر PDF در یک گره تحت اللفظی در هر صفحه نوشته می شود. TeX هیچ محاسبه ای انجام نمی دهد. اولیه ها در یک قاب محلی تحت یک تبدیل افین ترسیم می شوند، که وقتی یک اولیه در داخل یک محدوده فراخوانی می شود، از TikZ خوانده می شود. رنگها از یک سطح شیبدار برگرفته از جوهر رنگی یک سند میآیند: آبی تا مهآلود در رنگ جوهر، در OKLCH درونیابی میشود تا انتهای روشن به جای خاکستری شدن، آبی باقی بماند. سکته های مخروطی دو بزیر افست هستند، نه نوارهای نمونه برداری شده.
اولیه (flora.lua). به ترتیبی که یک آبرنگ رنگ میکشد: یک شستشوی صاف، لکههای تیرهتر روی آن تکثیر شده، رنگدانهها در لبهها جمع میشوند، رگههایی که به رنگ سفید بلند میشوند، چند رگه ظریف و تقریبا بدون طرح. گلبرگها و گلهای پهن، نیلوفرهای ستارهای که در حالت کج دیده میشوند، شکوفهها و گلها، جوانهها و گلهای زنگوله. برگهای لوبدار و کامل؛ ساقه های فراموش کننده که مانند دم عقرب پیچ می خورند، شاخه های منشعب، چتر، پیچک ها، سر دانه ها. پروانه ها، زنبورها، حلزون ها و یک پرنده؛ درخشش های مس، گل سرخ و فلورون برگ پیچک که ساقه آن به قانون سر تبدیل می شود.
هر یک از آنها را می توان به عنوان یک روح رنگ پریده نقاشی کرد.
تالیف تالیف ( authored.lua ). یک گیاه از یک ریشه در گوشه سمت چپ پایین رشد می کند: سه ساقه از طریق نقاط کنترل دست چین شده، یک ساقه چهارم در امتداد پایین صفحه به عنوان پاورقی، برگ در بخش های انتخابی ساقه ها، و هر موتیف دیگر روی شاخه ای که ساقه خود را به صورت مماس ترک می کند و در امتداد محور نقش می رسد - بنابراین هر گل را می توان تا پشت سر آن ردیابی کرد.
ترکیب رشد یافته (grow.lua)، به روح ونگ، زونگکر و سالسین، تزئینات گلی تولید شده توسط کامپیوتر (SIGGRAPH 1998). ساقه ها به عنوان صدای صاف ارتفاع خود به سمت بالا حرکت می کنند. برگ ها را در گره های خود که جا وجود دارد آویزان می کنند. سپس، به طور مکرر: بزرگترین دیسک آزاد را در دسترس یک ساقه بردارید، موتیفی را انتخاب کنید که متناسب با آن باشد، و شاخه ای را از نزدیکترین نقطه ساقه به آن رشد دهید. شاخه به نوبه خود تبدیل به ساقه می شود. ابتدا سوراخهای بزرگ ایجاد میشود، بنابراین گلها و نیلوفرها زود فرود میآیند، اسپریها و برگها وسط آن را پر میکنند و حلقه با جمع کردن برگچهها، جوانهها و گلچهها روی ساقهها به پایان میرسد.
انتهای متن با \pagetotal در همان پاس اندازهگیری میشود، بنابراین یک صفحه آخر کوتاه با یک کامپایل شاخههایی را در فضای زیر آن رشد میدهد.
خواندن صفحه (florilegium.lua). عنوان یا \florilegiumbloom یک گره نشانگر نامرئی در متن باقی می گذارد. هنگامی که صفحه به بیرون ارسال می شود، جعبه آن گره به گره راه می رود، ارتفاع، عمق و چسب را همانطور که تنظیم شده است جمع می کند تا ارتفاع هر نشانگر را در صفحه پیدا کند. سپس باغ قبل از آویزان شدن هر برگ، به آن خطوط گل می دهد. یک عصر نقوش را دوباره وزن میکند: جوانهها و پاشیدن جوانهها در بهار، سر بذرها در پاییز، زمانی که برخی از برگها بهجای جوهر با رمپ ساخته شده از لهجه نقاشی میشوند.
حروف اول (initial.lua). طرح کلی نامه از خواننده OpenType luaotfload به عنوان بخش های Bézier آمده است. به صورت چند ضلعی مسطح شده، یک تست درونی زوج و فرد می دهد و شبکه ای از فواصل تا حرف و قاب بزرگترین شکاف ها را برای گل ها پیدا می کند. تاک یک منحنی Catmull-Rom در سراسر کاشی است. در جایی که از حرف عبور می کند، به نوبه خود زیر و رو می شود، و رشته هایی که روی آن می روند، دوباره با هاله کاغذی نازک روی حرف بریده می شوند.
رویه ای ≠ تصادفی. دانه از شماره صفحه مشتق شده است، بنابراین صفحه n همیشه باغ n می شود. تکرارپذیری چیزی است که سند را به اندازه کافی برای حروفچینی پایدار می کند.
CLAUDE.md را برای یک نقشه به سبک دستی از کد، تنظیمپذیرها و ایدههایی که هنوز انجام نشدهاند، ببینید.
MIT، مجوز را ببینید. حق چاپ (ج) 2026 کوین ریموند.
متن اصلی (انگلیسی)
Florilegium: Procedural Flowers in LaTeX
Article URL: https://github.com/kevinraymond/florilegium Comments URL: https://news.ycombinator.com/item?id=50305637 Points: 288 # Comments: 47