Математические формулы ТеX в SVG

Июнь 26, 2013, 18:30

Ока­зы­ва­ет­ся во­все не обя­за­тель­но встав­лять -ов­скую ма­те­ма­ти­ку в вебе та­к­же как это де­ла­лось в 1999 году — в виде ги­фов с про­зрач­ным фо­ном. Бу­ду­щее уже дав­но на­сту­пи­ло, те­перь мож­но ис­поль­зо­вать век­тор­ный SVG.

Это я вот к чему. Недав­но, об­за­ве­дясь Мак­бу­ком с Reti­na-дис­пле­ем про­бле­ма раст­ро­вой гра­фи­ки в вебе у меня всплы­ла в пол­ный рост: если рань­ше, ко­гда часть ка­кой-ни­будь стра­нич­ки была от­ри­со­ва­на, ска­жем, фо­то­шо­пом, а часть сред­ства­ми CSS, то про­сто глаз слег­ка спо­ты­кал­ся на этой раз­ни­це, но тер­пи­мо было. А на ре­тине раз­ни­ца ста­но­вит­ся уже жут­кой — раст­ро­вые ча­сти сай­тов вы­гля­дят как на­бор боль­ших пик­се­лей.

И если на дру­гих сай­тах это про­бле­мы их со­зда­те­лей, то на моем соб­ствен­ном бло­ге (да, да, пишу я в него реже чем ко­вы­ряю его дви­жок и ди­зайн) меня та­кая раз­ни­ца не устра­и­ва­ла со­вер­шен­но, и боль­ше все­го у меня она вид­на как раз на встав­лен­ных ма­те­ма­ти­че­ских фор­му­лах.

По­лез раз­би­рать­ся как бы ма­те­ма­ти­ку в SVG рен­де­рить, ока­за­лось что че­ло­ве­че­ство эту про­бле­му дав­но ре­ши­ло, и есть ути­лит­ка dvisvgm ров­но для это­го и пред­на­зна­чен­ная. Я вы­зы­ваю ее так:

latex some.tex
dvisvgm --no-fonts some.dvi

Все, на вы­хо­де some.svg за­ме­ча­тель­но вы­гля­дя­щий на ре­тине.

На­гляд­ная раз­ни­ца меж­ду рас­тром и век­то­ром для ма­те­ма­ти­ки (при­вет всем вла­дель­цам ре­ти­на-дис­пле­ев). Растр:

Век­тор:

Кста­ти, чтоб два раза не вста­вать, сэко­ном­лю кому-ни­будь пару ча­сов на раз­би­ра­тель­ство. У всей ма­те­ма­ти­ки у меня в бло­ге вот та­кой шаб­лон:

1
2
3
4
5
6
7
8
9
\documentclass[12pt]{article}
\pagestyle{empty}
\usepackage{amsmath}
\usepackage{sfmath}
\begin{document}

$E=mc^2$

\end{document}

Аттрактор Лоренца

Ноябрь 29, 2012, 12:00

Раз­вле­ка­юсь с ани­ма­ци­ей на HTML5 can­vas. На­пи­сал вот та­кую чу­дес­ную ви­зу­а­ли­за­цию ат­трак­то­ра Ло­рен­ца:

От­крыть в но­вом окне

При от­кры­ва­нии в но­вом окне, не за­будь­те что бра­у­зер мож­но пе­ре­ве­сти в пол­но­экран­ный ре­жим, на­жав F11. Так смот­рит­ся ещё луч­ше.

То что вы тут ви­ди­те, пред­став­ля­ет со­бой ани­ма­цию ре­ше­ния си­сте­мы сле­ду­ю­щих диф­фе­рен­ци­аль­ных урав­не­ний:

Где , , — те­ку­щее со­сто­я­ние си­сте­мы, — вре­мя, , , — па­ра­мет­ры си­сте­мы.

В моём при­ме­ре:

Для каж­дой ли­нии (пред­став­ля­ю­щей со­бой от­дель­ное ре­ше­ния урав­не­ния) я вы­би­раю на­чаль­ное зна­че­ние с до­бав­ле­ни­ем неболь­шо­го слу­чай­но­го чис­ла. Та­ким об­ра­зом очень хо­ро­шо за­ме­тен «эф­фект ба­боч­ки»: незна­чи­тель­ное воз­му­ще­ние си­сте­мы («взмах кры­ла ба­боч­ки») при­во­дят к очень боль­шим из­ме­не­ни­ям в даль­ней­шем, ли­нии «вы­ле­та­ю­щие» из очень близ­ких то­чек вско­ре на­чи­на­ют де­мон­стри­ро­вать со­вер­шен­но раз­ное по­ве­де­ние.

Новый движок моего блога

Ноябрь 26, 2012, 19:00

В оче­ред­ной раз пе­ре­де­лал дви­жок сво­е­го бло­га. Те­перь у меня чи­сто ста­ти­че­ский блог, ле­жа­щий в Ama­zon S3. Преды­ду­щая вер­сия бла­го­по­луч­но и без еди­но­го на­ре­ка­ния от­ра­бо­та­ла свои год и 9 ме­ся­цев. Те­перь на­ста­ло вре­мя пе­ре­мен.

Мне ка­жет­ся, что сум­мар­ное вре­мя, ко­то­рое я тра­чу на про­грам­ми­ро­ва­ние движ­ков сво­е­го бло­га, уже пре­вы­ша­ет вре­мя на то что­бы что-то сюда пи­сать. И уж во вся­ком слу­чае это явно срав­ни­мые ве­ли­чи­ны.

Окон­ча­тель­ным толч­ком к пе­ре­хо­ду на чи­сто ста­ти­че­ский блог по­слу­жи­ло недав­нее по­яв­ле­ние у Ama­zon S3 функ­ции ре­ди­рек­тов, без ре­ди­рек­тов всё-таки слож­но обой­тись. Та­к­же, для та­ко­го про­сто­го сай­та как лич­ный блог, дер­жать це­лый сер­вер, базу дан­ных, как-то всё это ад­ми­ни­стри­ро­вать — яв­ное пе­ре­услож­не­ние. В по­след­нее вре­мя я боль­ше скло­ня­юсь к про­стым ре­ше­ни­ям.

Для ин­те­ре­су­ю­щих­ся неко­то­рые тех­ни­че­ские по­дроб­но­сти:

Ге­не­ра­тор

Тут для меня без ва­ри­ан­тов — Haskell. Са­мый глав­ный дей­ству­ю­щий пер­со­наж тоже по­ня­тен — Has­tache, не зря же я его пи­сал.

Ор­га­ни­за­ция

Тех­ни­че­ски каж­дая за­пись в бло­ге вы­гля­дит так: от­дель­ная ди­рек­то­рия с име­нем типа «2011-02-28 16:03 new en­gine», внут­ри ле­жит файл def.json с за­го­лов­ком и те­га­ми этой за­пи­си, файл text.html с тек­стом, и ка­кие-ни­будь до­пол­ни­тель­ные фай­лы (если они в этой за­пи­си нуж­ны). Та­кие вот ра­кет­ные тех­но­ло­гии бло­го­стро­е­ния. Text.html — это не про­сто чи­стый html, это ещё и кое-ка­кая до­пол­ни­тель­ная раз­мет­ка, на­при­мер для встав­ки ма­те­ма­ти­че­ских фор­мул ( ру­лит) или ис­ход­но­го кода с под­свет­кой син­так­си­са (high­light­ing-kate). До­пол­ни­тель­ная раз­мет­ка боль­шей ча­стью пред­став­ле­на сек­ци­я­ми Has­tache.

Ти­по­гра­фи­ка

Ммм, это пря­мо моя пре­лесть. Не по­ни­маю чего ни­кто пе­ре­но­сов в вебе не де­ла­ет, на­мно­го ведь при­ят­ней вы­гля­дит, осо­бен­но если текст рас­тя­нут по ши­рине. Тех­ни­че­ски сами пе­ре­но­сы уже сто лет как до­ступ­ны во всех бра­у­зе­рах. У меня те­перь всё с пе­ре­но­са­ми, кра­со­та да и толь­ко. Пе­ре­но­сы рас­став­ля­ет са­мо­пи­сан­ная биб­лио­те­ка (ра­бо­та­ет по ал­го­рит­му Ляна-Кну­та), я её на­пи­сал для qr­ma­nia.ru, и вот опять при­го­ди­лась. Надо бы вы­ло­жить в Hack­age, но пока QA-от­дел в моей го­ло­ве это­го не поз­во­ля­ет.

Ра­бо­та с S3

Сна­ча­ла ду­мал обой­дусь s3cmd, но в ито­ге на­пи­сал соб­ствен­ный син­хро­ни­за­тор для S3, бла­го для Haskell есть биб­лио­те­ка aws. Кста­ти, я в неё за­ком­ми­тил ра­бо­ту с ре­ди­рек­та­ми S3, но эта вер­сия в на­сто­я­щий мо­мент ещё не вы­ло­же­на в Hack­age, кому сроч­но надо бе­ри­те пря­мо с GitHub.

Libqrencode-js: генерация QR-кодов на JavaScript

Ноябрь 14, 2011, 11:00

А вот ка­кую офи­ген­скую шту­ку я вы­ло­жил!

Это ге­не­ра­тор QR-ко­дов на чи­стом как хру­сталь JavaScript, ни­ка­ких сер­вер­ных ком­по­нен­тов, всё пря­мо в бра­у­зе­ре. Вот сра­зу де­мон­страш­ка для по­ба­ло­вать­ся.

При­чем это не абы что, это порт про­дви­ну­той C-шной биб­лио­те­ки libqren­code, ко­то­рая ра­бо­та­ет в сер­вер­ной ча­сти на по­дав­ля­ю­щем боль­шин­стве сай­тов для ге­не­ра­ции QR-ко­дов, и име­ет бин­дин­ги ко все­му на све­те. Для JavaScript уже есть ге­не­ра­то­ры QR-ко­дов, но все очень сы­рые, в от­ли­чии от libqren­code ко­то­рый уже несколь­ко лет пи­шет­ся и, как я уже го­во­рил, мно­го где ис­поль­зу­ет­ся.

Про­цесс пор­ти­ро­ва­ния C-шной биб­лио­те­ки на JavaScript, это, ска­жу я вам, про­сто пес­ня. Есть со­вер­шен­но за­ме­ча­тель­ный про­ект em­scripten — ком­пи­ля­тор LLVM в JavaScript. Вот с по­мо­щью него вол­шеб­ство и про­изо­шло. Я на­пи­сал неболь­шую C-шную оберт­ку над libqren­code, ском­пи­ли­ро­вал всё вме­сте в LLVM-код с по­мо­щью Clang, пе­ре­дал в em­scripten и на­пи­сал JavaScript оберт­ку над ре­зуль­та­том его ра­бо­ты. По­лу­чи­лось хо­ро­шо.

Ли­цен­зия LGPL (ви­ру­сом от libqren­code). Поль­зуй­тесь!

Новый движок моего блога (на Haskell)

Февраль 28, 2011, 16:03

Пе­ре­пи­сал свой блог — те­перь это Haskell! За­хо­ди­те вы ко мне на сайт, по­чи­тать это со­об­ще­ние, а в это вре­мя, на да­ле­ком сер­ве­ре, лямб­да функ­ции за­мы­ка­ют­ся и ре­ду­ци­ру­ют­ся, мо­на­ды одна в дру­гую транс­фор­ми­ру­ют­ся, сан­ки фор­сят­ся и про­ис­хо­дит раз­ная дру­гая ма­гия.

Пока немно­го те­зис­но что, как и по­че­му, часть тем буду в бу­ду­щем раз­во­ра­чи­вать:

(далее...)

Сергей Лымарь © 2005-2014, Все права защищены.