LINUX.ORG.RU

Создание иллюстраций в MetaPost


0

0

По согласованию редакцией LF выложил первую часть из цикла статей <<Создание иллюстраций в MetaPost>> в открытый доступ. Первая часть является просто введением в эту ТеХнологию.

Там же доступны иходники картинок к уже опубликованным частям. Сборка картинок производится по команде make pics. В качестве базового дистрибутива использовался TeX Live. В случае проблем, вопросов и пожеланий координаты в README.

>>> Подробности

★★★★★

Проверено: Pi ()

Евгений, а вот у меня вопрос, который меня посещает, когда натыкаюсь на какой-нибудь бумажный журнал по Linux. Неужели "бумагу" сейчас покупают и читают? Особенно по Linux, информация по которому в полном объеме есть в интернете.

Zubok ★★★★★
()
Ответ на: комментарий от Zubok

Изредка, когда компа нету, или глаза устают от экрана

Atlant ★★★★★
()
Ответ на: комментарий от Zubok

Ответ да. Интернет не заменяет бумагу. Кроме того на бумаге могут быть оргинальные статьи, которых в интернете нет. Я, например, с удоольствием читал Известия, пока их не перекупили - сейчас общую информацию беру только из интернета - надо сказать гораздо менее удобно и затратно по времени.

Ну а по Linux: с каждым LF идёт DVD с чем-нибудь. Один DVD мне даже очень пригодился.

Evgueni ★★★★★
() автор топика
Ответ на: комментарий от Zubok

> Неужели "бумагу" сейчас покупают и читают? Особенно по Linux, информация по которому в полном объеме есть в интернете.

Ещё как покупают. :) А всю сеть не охватить. Приятно, когда порой рассказывают что-то забавное из смежных и далёких областей. Сам такое искать не пойдёшь.

atrus ★★★★★
()

Статья выглядит интересной и познавательной. Будет время - внимательно прочитаю.

blaster999 ★★
()

Жаль, что журнал об открытой операционной системе продаётся за деньги. Слишком много несознательных граждан, которые хотят делать деньги на чужом труде. Куда катится этот мир?

anonymous
()
Ответ на: комментарий от anonymous

> Жаль, что журнал об открытой операционной системе продаётся за деньги. Слишком много несознательных граждан, которые хотят делать деньги на чужом труде. Куда катится этот мир?

Разве этого жаль? Не бесплатно же печатную продукцию должны раздавать. А вот что действительно жаль - отсутствие онлайновой версии, и запрет выкладывать свою же статью каким-бы то ни было способом в течении полугода после публикации в журнале. Это действительно подло с их стороны. Ладно бы запрет публиковать в другом журнале за деньги или еще как, а то нельзя просто предоставить другим людям доступ к информации - за это я их сильно не уважаю и покупать принципиально не буду. Хоть пару раз интересно было купить, но нужно же рублем голосовать, раз такая варварская политика.

anonymous
()
Ответ на: комментарий от anonymous

Именно это я имел в виду, им надо брать пример с "Системного администратора". Несколько скомканно описАл, прошу простить, пятница, вечер. :)

anonymous
()
Ответ на: комментарий от anonymous

free это free as speech (свобода слова), а не free as beer (халявная выпивка)

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

Evgueni ★★★★★
() автор топика
Ответ на: комментарий от MiracleMan

Очень. Читаю его с бумаги. Вот и диск с TeX Live в руках.

Lumi ★★★★★
()

Очень интересно, спасибо!

Только на 13й странице hbox выехал за пределы страницы (на "$a+-+b=...").

McGray ★★
()
Ответ на: комментарий от McGray

А там в этой строчке хорошего решения нет. Операцию разрывать нельзя, а при переносе всего выражения проблема возникнет на следующей строчке. Разве что текст переписать.

Evgueni ★★★★★
() автор топика
Ответ на: комментарий от Evgueni

>А там в этой строчке хорошего решения нет. Операцию разрывать нельзя, а при переносе всего выражения проблема возникнет на следующей строчке. Разве что текст переписать.

А ты слоппи ставишь? Мне вот почему-то никогда не удется без слоппи нормальную правую границу получить.

Zubok ★★★★★
()
Ответ на: комментарий от Zubok

нет. А как оно вообще может помогать? По описанию на сколько я понимаю \sloppy делает \TeX более терпимым к плохим строкам.

Evgueni ★★★★★
() автор топика
Ответ на: комментарий от Evgueni

>нет. А как оно вообще может помогать? По описанию на сколько я понимаю \sloppy делает \TeX более терпимым к плохим строкам.

Ну вот у меня плохих строк слишком много получается. Постоянные превышения hbox. Я, например, вижу часто, что проблема легко решается немного большим интервалом между словами, а TeX раздвигать слова без \sloppy не хочет. Вот в заголовке всегда его и ставлю. Нельзя же над каждой плохой строкой сидеть и передумывать текст. А чаще всего так же и бывает, как у тебя -- исправишь одну строку, а поползет следующая.

Zubok ★★★★★
()
Ответ на: комментарий от Zubok

Странно всё это. Та, единственная "плохая" строка связана с тем, что в обзаце были формулы, которые \LaTeXу переносить запрещалось. Обычно, для текста на A4 это не проблема.

Над кажой строкой сидеть конечно не надо - надо один раз перед последней вёрсткой текст просмотреть. Это займёт малый по сравнению со всем остальным процент времени.

Кнут, кстати, указывал, что не реально всё решить автоматом - очень сложно бить абзацы на строки. Всегда что-то да остаётся. Решение, только в ручной доводке.

Evgueni ★★★★★
() автор топика
Ответ на: комментарий от Evgueni

>Странно всё это.

Вот и я думаю, что странно. Но пока понять, не могу. Но это случается. Вполне возможно, что я что-то не то делаю. Не исключаю такого варианта. Со временем пойму. :)

>Над кажой строкой сидеть конечно не надо - надо один раз перед последней вёрсткой текст просмотреть. Это займёт малый по сравнению со всем остальным процент времени.

Не скажи. Если это статья, то да. А если уже небольшая книжка, то пропустить неправильное форматирование можно легко. Особенно если чуть-чуть вылезло и с первого взгляда не бросилось в глаза (а если уже страницу тридцатую проверяешь, то глаз замыливается). За помощью, конечно, можно обратиться к логам TeX, чтобы не пропустить ничего.

Zubok ★★★★★
()

Евгений, спасибо за статью. В конце введения есть фраза "Многие _правильные&#1111; программы, работающие с векторной графикой, такие как gnuplot и xfig, умеют импортировать в MetaPost."

Может быть её нужно исправить: не "импортировать в", а "импортировать из" или "экспортировать в"?

anonymous
()
Ответ на: комментарий от anonymous

Прошу прощения это во "Введении в Metapost"

anonymous
()
Ответ на: комментарий от Zubok

> пропустить неправильное форматирование можно легко. Особенно если чуть-чуть вылезло и с первого взгляда не бросилось в глаза

Чтобы было сложнее пропускать переполненные боксы, следует указать опцию draft в \documentclass.

anonymous
()

Как в метапосте сделать вот такую штуку?

Что-то вроде команды grid в tk/tcl - раскидывает pictures по ячейкам нерегулярной таблицы.

def grid (expr spacex,spacey) text b =...

Вызывается примерно вот таким образом:

fr:=grid (0.4cm,0.4cm)
"x", k , k , k , k ,"n",
k , k ,"^", k ,"^","n",
k ,"x", k , k ,"-" ,"n";

Т.е. вместо параметра b подставляется последовательность из команд разметки ("x","-","^","n") и pictures. В результате выдается картинка состоящая из входных картинок, но определенным образом сдвинутых. Но мне хотелось бы, чтобы переменные k (т.е. входные параметры)в результате указывали на трансформированные картинки. Вроде бы это можно сделать из функции grid, но для этого параметр b нужно объявить как suffix. А suffix ругается на ту смесь из picture и string, которая у меня подается на вход.

geekkoo
()

Мне очень интересно, с использованием какого софта подготавливают журнал LXF?

anonymous
()

А Винсент Зонекин - это вообще терминатор какой-то. Мало того, что он сгенерил этот файл с 300 примерами для метапоста, причем сделал это, на мой взгляд, очень педагогически правильно - каждая картинка иллюстрирует ровно одну идею, так он же еще выложил книжку с огромным числом примеров для R, которые при этом еще сопровождаются какими-то вполне разумными рассказами про статистику и теорию вероятностей. Единственный ее недостаток, что написана она на очень кривом английском (французский вариант он забросил).

http://zoonek2.free.fr/UNIX/48_R/all.html

geekkoo
()
Ответ на: комментарий от Zubok

> Не скажи. Если это статья, то да. А если уже небольшая книжка, то пропустить неправильное форматирование можно легко. Особенно если чуть-чуть вылезло и с первого взгляда не бросилось в глаза (а если уже страницу тридцатую проверяешь, то глаз замыливается). За помощью, конечно, можно обратиться к логам TeX, чтобы не пропустить ничего.

Есть опция draft в классе документа \documentclass[draft]{article}. В этом случае \LaTeX метит "плохие" строки - но пропустишь.

Evgueni ★★★★★
() автор топика
Ответ на: комментарий от anonymous

>Может быть её нужно исправить: не "импортировать в", а "импортировать из" или "экспортировать в"?

поправил - заговорился при написании

Evgueni ★★★★★
() автор топика
Ответ на: комментарий от geekkoo

>fr:=grid (0.4cm,0.4cm)
>"x", k , k , k , k ,"n",
>k , k ,"^", k ,"^","n",
>k ,"x", k , k ,"-" ,"n";

Может быть всё сделать в виде картинок? Как рисовался треугольник
Паскаля: n[i][j] заполнялось цифрами, затем к picture z присваивалось

создавалась картинка:
z:=thelabel(format("%6g", n[i][j]),(0,0));

вычислялось местоположение, масштаб и помещалось в нужное место:

label(z scaled (1-ds*i),(x,y));

Можно вот так

z:=thelabel.lft(decimal(i)&":",(0,0));

btex текст etex является картинкой изначально. Для того чтобы
текст внутри окружения можно было менять динамически можно
воспользоваться макросом TEX

vardef TEX primary s =
write "verbatimtex" to "mptextmp.mp";
write "\input{preheader}" to "mptextmp.mp";
write "\begin{document}" to "mptextmp.mp";
write "etex" to "mptextmp.mp";
write "btex "&s&" etex" to "mptextmp.mp";
write EOF to "mptextmp.mp";
scantokens "input mptextmp"
enddef;

Должен существовать preheader.tex с минимальной кириллизацией,
если нужна кириллица.

Вызывать его можно как-то так:

label.lft(TEX("\("&decimal(i)&"\)"),(-10u,i*u));

Эта структура описывается в последней пятой части цикла статей.

Evgueni ★★★★★
() автор топика
Ответ на: комментарий от geekkoo

> Если кому интересно, то исходник вот здесь - ftp://194.67.79.2/deftest.mp

blockdraw.mp требуется для компиляции

Evgueni ★★★★★
() автор топика
Ответ на: комментарий от Evgueni

blockdraw в самой функции не используется, он нужен только для примера.
Ящики соединены стрелками, для рисования которых и используются функции vvconnect, hhconnect вот отсюда -
http://www.control.isy.liu.se/~tidefelt/projects/blockdraw/ (сам пакет лежит на CTANе).

За советы спасибо, но тут дело в том, что suffix не понимает списков состоящих из имен переменных и их значений. Т.Е. вы предлагаете вместо величин типа string подставлять переменные. Тут во-первых наглядность теряется, а во-вторых я не понял как я могу выяснить, что вот этот элемент является на самом деле командой разметки и рисовать его не нужно, а нужно вместо этого преобразовывать предыдущие элементы. Иными словами я не понимаю, как я его должен "пометить" в программе, чтобы было ясно, что это не простая картинка.

Можно ли передать значения как text, потом отфильтровать этот text, выбросив разметку, а потом прогнать forsuffix по уже отфильтрованному text'у? Можно ли хранить comma-separated список в переменной?

geekkoo
()
Ответ на: комментарий от geekkoo

> Винсент Зонекин - это вообще терминатор какой-то

Дааа, похоже у него дивиз: не месяца без написанной книги - это нечто: http://zoonek2.free.fr/UNIX/index.html

Evgueni ★★★★★
() автор топика
Ответ на: комментарий от geekkoo

> Тут во-первых наглядность теряется, а во-вторых я не понял как я могу выяснить, что вот этот элемент является на самом деле командой разметки и рисовать его не нужно, а нужно вместо этого преобразовывать предыдущие элементы. Иными словами я не понимаю, как я его должен "пометить" в программе, чтобы было ясно, что это не простая картинка.

Видимо я чего-то не понимаю. Проблеммы возникают, когда вызывается vvconnect, а само определение grid отрабатывает замечательно.

>Можно ли передать значения как text, потом отфильтровать этот text, выбросив разметку, а потом прогнать forsuffix по уже отфильтрованному text'у? Можно ли хранить comma-separated список в переменной?

может быть воспользоваться skantokens("input " & fname), а в файл до этого записать всё, что душе угодно. После выполнения этой команды код в указанном файле подставляется в текущий код.

Evgueni ★★★★★
() автор топика
Ответ на: комментарий от Evgueni

s/skantokens/scantokens/ - пример был выше в описании макроса TEX

Очень интересный пример - узнал много нового :) До MetaPost-хакерства я пока не добирался. Хватало обычных линий :)

Evgueni ★★★★★
() автор топика
Ответ на: комментарий от Evgueni

Нет там нужно присвоить результат хоть чему-нибудь:

path l;
l:=vvconnect

Ну и еще пара ошибок. Но mpost достаточно умный - если жать enter, то в итоге получается примерно то что и было задумано.

Выложил исправленный вариант.

geekkoo
()

Как человек пишуший математические тексты, могу вам сказать, что от скриптовых языков толку в создании иллюстраций мало. В Inkscape вы сделаете все тоже самое в 100 раз быстрее, и когда возникнет необходимость, легко сможете внести изменения. Разного рода диаграммы, графики и прочее, однозначно проще рисовать в математическом пакете: R project, octave, scilab.

anonymous
()
Ответ на: комментарий от anonymous

Ты не понял нишу, которую занимает Metapost (+ еще Asymptote)

Например, иллюстрации к геометрическим задачкам на построение или любая схема где важна геометрическая точность. От руки выдерживать прямые углы и поиск точек пересечения требует программных пакетов уровня CAD, а с помощью Metapost решается простым и коротким скриптом (если график несложный). Метапост - идеально подходит для решения задачек по начертательной геометрии.

geekkoo
()
Ответ на: комментарий от geekkoo

Или еще пример - электронные схемы:
http://www.ci.louisville.edu/tom/software/LaTeX/mpcirc/

Рисовать вручную точки в местах соединения проводов в электрических схемах - занятие не для белого человека. Если мне требуется перерисовать электронную схему от силы раз в год, то для меня нет смысла ставить и изучать специализированный CAD. Проще взять этот макропакет и написать скрипт. Больше 100 строк он все равно не займет.

geekkoo
()
Ответ на: комментарий от anonymous

>Как человек пишуший математические тексты, могу вам сказать, что от скриптовых языков толку в создании иллюстраций мало.

Кнут на TUG во Санкт-Питербург Флориде про metapost: "Это позор, что до недавнего времени ни водной книге по математическому анализу не было хорошего изображения кардиоиды. Вчера на экране мы увидели настаящую кардиоиду (Слайд сделанный в MetaPost Дени Жиру). Никто даже не знал, как выглядит кардиоида, потому что все рисунки были сделаны художниками, пытавшимися скопировать работы своих предшественников и никогда не видившими самого предмета"

Я ведь не спроста пришёл к MetaPost - мне пришлось делать очень много иллюстраций к задачам по физике. И векторные рисовалки меня не впечатлили. Кстати autocad я так же немного знаю (месяц рисования чертежей). Для меня подобный скриптовый язык был решением. Про графики, диаграммы и тому подобное я тоже понимаю, но опять же как совместить график и LaTeX? MetaPost подходит для этого идеально.

Evgueni ★★★★★
() автор топика
Ответ на: комментарий от geekkoo

to geekkoo: то в итоге получается примерно то что и было задумано

То есть проблема решилась?

Evgueni ★★★★★
() автор топика
Ответ на: комментарий от Evgueni

Опять же, кардиоида рисуется в любом математическом пакете за 5 секунд. Сохраняется как EPS, в LaTeX подключается пакет graphicx и EPS вставляется тегом \includegraphics.

anonymous
()
Ответ на: комментарий от Evgueni

Нет. 

Проблема выглядит вот так:

beginfig(-1)
  def gr text b=begingroup
      for a=b:
	if string a:
	  if a="+":
	    show a;
	  fi;	  
	elseif picture a:
	    a:=a shifted (-1cm,-1cm);
	fi;	
      endfor;      
    endgroup;
  enddef;
  
  picture p;
  p:=nullpicture; 
  addto p doublepath (1cm,1cm)..(2cm,2cm)..(3cm,1cm)..cycle;     
  draw p;
  gr "+",p,"+";
  draw p;
endfig;

Можно было бы ожидать, что будут нарисованы два круга смещенных 
друг относительно друга.
Но этот код неверный. 
Ошибка здесь

 a:=a shifted (-1cm,-1cm); 

потому что внутри for a=b: где b - text нельзя делать присваивания a.

Правильный код должен быть таким:

        elseif picture a:
            picture c;
	    c:=a shifted (-1cm,-1cm);
	fi;	

но при этом макрос не меняет значения внешней переменной p и в итоге 
будут нарисованы два _одинаковых_ круга.

Я не пойму как менять значения переменных из макроса с переменным 
числом параметров. Т.е. для таблицы известной длины можно было бы 
объявить 

def gr expr a, expr b , expr c

и всё было бы в порядке. А спеременной длиной приходиться объявлять 
один формальным параметр типа text и из-за этого начинаются проблемы.
 

geekkoo
()
Ответ на: комментарий от geekkoo

А что мешает сделать так?

beginfig(2)
  def gr text b=begingroup
      for a=b:
	if string a:
	  if a="+":
	    show a;
	  fi;	  
	elseif picture a:
	   picture c;
	   c:=a shifted (-1cm,-1cm);
%	    a:=a shifted (-1cm,-1cm);
	fi;	
      endfor;      
%результат картинка
    c
    endgroup;
  enddef;
  
  picture p;
  p:=nullpicture; 
  addto p doublepath (1cm,1cm)..(2cm,2cm)..(3cm,1cm)..cycle;     
  draw p;
%Не gr "+",p,"+"; а затем draw p, именно draw измененное  
  draw gr "+",p,"+";
endfig;


Evgueni ★★★★★
() автор топика
Ответ на: комментарий от anonymous

Не нужно воспринемать всё буквально. Эти слова Кнут сказал довольно давно - я их привёл, что бы было понятно для чего. Кнут, кстати, до сих пор использует этот инструмент - так он может делать иллюстрации сам без помощи других людей.

MetaPost это иллюстрации, а не графиков функций (хотя его можно использовать и для этого). Это инструмент не специализированный - в нём можно делать всё. За это приходится расплачиваться некоторыми ограничениями.

А по поводу includegraphics: я не совсем внятно вразился - не картинку в LaTeX, а LaTeX в картинку. Например так: http://www.inp.nsk.su/~baldin/pic/triangle.pdf Я не сомневаюсь, что подобное можно сделать и другими способами, но мне так удобней и рука у компьютера не дрожит - надо только объяснить ему что делать.

Примеры иллюстраций можно посмотреть здесь: http://www.inp.nsk.su/~baldin/textbook/index.html

Evgueni ★★★★★
() автор топика
Ответ на: комментарий от Evgueni

>>%результат картинка
c
endgroup;

Это хорошо если на входе всего одна picture, а если несколько? В метапосте нет же поддержки структур.

У меня кстати похоже сделано в grid, только там таким образом выдается общая картинка. Но потом, чтобы соединить компоненты стрелками, приходится рыться во внутренностях сгенерированной картинки с помощью макроса subpicture в поисках составных частей. А хотелось бы - если на вход grid подано имя переменной, то и результат записывать в ту же переменную.

geekkoo
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.