MetaPost 관련
수학이나 물리학 논문들을 보면 위와 같이 흑백으로 그렸지만 멋이 철철 넘치는 그림들이 있다. 나도 그려보고 싶어서 이리저리 찾기 시작했다. 원했던 것은 다음과 같다.
1. 결과물이 멋있을 것
2. 좌표를 정확히 지정 가능할 것
3. 벡터 이미지로 저장이 가능할 것
이 3가지를 모두 만족하는 것으로 metapost라는게 있었다. 몇십 년의 역사를 자랑하며, TeX안에 패키지로 포함되는 것 같다. TikZ라는것도 있다는 것 같은데, TeX는 익숙치가 않아서...
하여간 내용은 방대한데 정리할 시간이 없어서 대충 링크들을 남긴다.
Metapost라는게 있다는 글. 나는 LaTeX 안쓸거라 standalone으로 깔고싶었는데 무조건 TeX 패키지에 포함이다. ㅠㅠ
https://physics.stackexchange.com/a/2213
생물학 논문에는 biorender를 많이 쓴다는 글. 나도 박사학위 프로포절때 biorender를 써서 그림을 그린 슬라이드가 있다. 근데 이건 생물이나 의학쪽에 관한거지 물리쪽 그림처럼 고전적인 위엄이 느껴지지는 않는다.
www.nature.com/articles/d41586-020-01404-7
이 글 처음에 넣었던 그림을 그린 사람. metapost로 주로 그리고, 가끔 postscript를 직접(!) 코딩해서 그림을 그리는 것 같다.
kahrstrom.com/mathematics/illustrations.php
metapost 튜토리얼. 코드와 미리보기를 같이 제공한다.
www.ursoswald.ch/metapost/tutorial.html
metapost 위키 페이지 (예시도 있음)
en.wikipedia.org/wiki/MetaPost
metapost 관련 링크들
metapost에서 그린 것을 svg로 출력하는 방법
tug.org/metapost/runningmp.html
metapost example 모음. 다양한 결과물들을 한눈에 훑어볼 수 있다.
tex.loria.fr/prod-graph/zoonekynd/metapost/metapost.html
TeXLive 설치 (metapost는 texlive같은거 안에 포함되어있는 형태로만 받을 수 있다. 참고로 풀설치하면 시간이 1시간 반 정도 걸린다.)
TeXstudio 설치 페이지. 다른 프로그래밍 언어들의 IDE에 해당한다고 보면 될 것 같다. TeXLive를 설치하였기에 깔진 않았다.
metapost에서 label에 variable 사용. 예시가 변수를 $같은걸 써놔서 헷갈리게 되어있다.
tex.stackexchange.com/questions/34455/metapost-label-based-on-variable-value
metapost 코드를 인터넷상에서 돌려서 프리뷰 svg 이미지를 볼 수 있게 해주는 툴
맨 처음 올렸던 이미지에서 외곽선 R을 구현하려고 했는데 넣을 수 없어서 찾았던 자료
tex.stackexchange.com/questions/556790/mathbb-in-txfonts
그런데 나머지 글자들이 times new roman이 아니었고, 이럭저럭 하다가 최종적으로는 이렇게 구현했다.
TEXPRE("%&latex" & char(10) & "\documentclass{article}\usepackage{amsmath}\usepackage{newtxmath,newtxtext}\DeclareMathAlphabet{\mathbb}{U}{msb}{m}{n}\begin{document}");
input TEX
label(TEX("\( \mathbb{R}^m \) ") scaled defaultscale,1.2(0,xmax) scaled scalefactor);
관련페이지:
tex.stackexchange.com/questions/317554/change-font-to-times-new-roman-in-pdflatex
metapost와 유사한 그림그리는 툴인 TikZ와 PGF 결과물 갤러리
texample.net/tikz/examples/all/?page=1
PGF github page
다양한 그림그리는 툴 예시. matplotlib은 matlab만도 못한 퀄이 나오며, 여기서manim이란걸 처음으로 발견했다.
math.stackexchange.com/a/3938216
Metapost 연습해본 것들
prologues:=3;
outputtemplate :="%j-%c.svg";
outputformat:="svg";
defaultfont:="ptmr8r";
defaultscale := 12pt/fontsize defaultfont;
beginfig (1);
pair A, B, C;
A:=(0,0); B:=(1cm,0); C:=(0,1cm);
draw A..B..C--cycle;
endfig;
beginfig (2);
z0=(0,0);
z1=(60,40);
z2 =(40,90);
z3 =(10,70);
z4 =(30,50);
draw z0..z1..z2..z3--z4--cycle;
endfig;
beginfig (3);
z0=(0,0);
z1=(60,40);
z2 =(40,90);
z3 =(10,70);
z4 =(30,50);
draw z0{down}..z1{up}..z2{left}..z3..z4;
endfig;
beginfig(4);
for k=0 upto 9:
draw (0,0){dir 45}..{dir 10k}(6cm,0);
endfor
endfig;
beginfig(5);
z1=-z2=(2cm,0);
x3=-x6=3cm;
x3+y3=x6+y6=11cm;
z4=1/3[z3,z6];
z5=1/3[z6,z3];
z20=whatever[z1,z3]=whatever[z2,z4];
z30=whatever[z1,z4]=whatever[z2,z5];
z40=whatever[z1,z5]=whatever[z2,z6];
draw z1--z20--z2--z30--z1--z40--z2;
pickup pencircle scaled 2pt;
draw z1--z2;
draw z3--z6;
show z20;
dotlabels.rt(1,2,3,4,5,6,20,30,40);
label.lrt(btex $\displaystyle y={2\over1+\cos x}$ etex scaled defaultscale, 1/2[z1,z20]);
endfig;
beginfig (6);
uz = 3cm;
path p,q,r,s;
p = (-uz,0)..(0,-uz)..(uz,0);
q = p{up}..(0,0){dir -120}..{up}cycle;
r = fullcircle scaled 0.5uz;
s = buildcycle(r,q);
fill s withcolor red; % no overlap with bottom half
%fill q withcolor blue;
draw r;
draw q;
%fill s;
dotlabel.rt("p1", q intersectionpoint r);
show length r;
endfig;
input tex;
beginfig (7);
numeric a, #, t[];
3.2a = 5cm;
path fun;
# = 0.5; % don't know what this is;
fun = ( (0,-1#)..(1,.5#){right}..(1.9,0.2#){right}..{curl 0.1}(3.2,2#)) yscaled(1/#) scaled a;
x1 = 2.5a;
n:=5;
for i=1 upto n:
(t[i],whatever) = fun intersectiontimes ((x[i], -infinity)--(x[i],infinity));
z[i] = point t[i] of fun;
z[i]-(x[i+1],0) = whatever*direction t[i] of fun;
% draw (x[i],0)--z[i]--(x[i+1],0);
draw (x[i],0)--z[i] dashed evenly;
draw z[i]--(x[i+1],0);
fill fullcircle scaled 3bp shifted z[i]; % make dots
% label.ulft( TEX( "$f_{"&decimal(i)&"}$" ) scaled defaultscale, z[i]);
label.ulft( TEX( "$f_{"&decimal(i)&"}$" ), z[i]);
endfor
for i=1 upto (n+1): % https://stackoverflow.com/questions/15930810/metapost-using-loop-variables-in-labels
label.bot( TEX( "$x_{"&decimal(i)&"}$" ), (x[i],0));
endfor
draw (0,0)--(3.2a,0);
pickup pencircle scaled 1pt;
draw fun;
endfig;
end.
prologues:=3;
outputtemplate :="%j-%c.svg";
outputformat:="svg";
% https://tex.stackexchange.com/questions/317554/change-font-to-times-new-roman-in-pdflatex
input TEX;
TEXPRE("%&latex" & char(10) & "\documentclass{article}\usepackage{amsmath}\usepackage{newtxmath,newtxtext}\DeclareMathAlphabet{\mathbb}{U}{msb}{m}{n}\begin{document}");
TEXPOST("\end{document}");
beginfig (1);
defaultfont:="ptmr8r";
%defaultfont := "ptmbi8r";
defaultscale := 24pt/fontsize defaultfont;
scalefactor := 1cm;
path boundaries;
path v[], h[], maskpath;
xmax:=6;
boundaries = (xmax,xmax)--(-xmax,xmax)--(-xmax,-xmax)--(xmax,-xmax)--cycle;
for k = -xmax upto xmax:
v[k] = (k,-xmax)--(k,xmax);
h[k] = (-xmax,k)--(xmax,k);
if k = 0:
pickup pencircle scaled 1pt;
else:
pickup pencircle scaled 0.5pt;
fi;
draw v[k] scaled scalefactor;
draw h[k] scaled scalefactor;
endfor
pickup pencircle scaled 2pt; % https://tex.stackexchange.com/questions/8260/what-are-the-various-units-ex-em-in-pt-bp-dd-pc-expressed-in-mm
draw boundaries scaled scalefactor;
pickup pencircle scaled 1pt;
z1= (xmax,0); z2= (0,0.85*xmax); z3 = (-xmax*0.5,xmax*2/3); z4 = (-xmax,0);
maskpath = ( 0.9z1{up}..tension 1.7..z2..z3..tension 1.2..{down}4/5z4 ) scaled scalefactor;
draw maskpath dashed evenly;
draw (maskpath yscaled -1) dashed evenly;
% ======= Lables =====
label.llft(TEX("\( x_{" & decimal(3) & "} \)") scaled defaultscale,(-xmax,xmax) scaled scalefactor);
label.lft(TEX("\( x(U) \)") scaled defaultscale, 1/3[z1,-z2] scaled scalefactor);
label(TEX("\( \mathbb{R}^m \) ") scaled defaultscale,1.2(0,xmax) scaled scalefactor);
endfig;
beginfig(100)
%% Definitions
path boundaries;
path v[], h[], maskpath;
xmax:=3cm;
z0 = (0,0); z1 = (xmax,xmax);
z2 = z1 xscaled -1; z3 = z1 rotatedaround(z0,180); z4=z1 yscaled -1;
%% main calc
boundaries = z1--z2--z3--z4--cycle;
%% Draw
draw boundaries yscaled 0.1;
% labels
last := 10;
for i := 0 upto last:
label(TEX("\( x_{" & decimal(i) & "} \)"), (5mm*(i-last/2),0));
endfor
endfig;
end.
Manim 관련
manim 커뮤니티 버전. 2020년부터 시작했다고 한다. 원래는 3b1b가 만든게 맞고, 그걸 개선시키기 위한 프로젝트이다.
github.com/ManimCommunity/manim/
manim documentation. 기본 예시를 볼 수 있다.
docs.manim.community/en/latest/tutorials/quickstart.html
내가 원했던 것처럼 그림을 그리는 것에 대한 책. raw postscript에서 그림 어떻게 그리는지에 대해 써있는데 따라하려니까 너무 오래걸릴것같아서 일단 킵.
www.math.ubc.ca/~cass/graphics/manual/
이 그림을 그려보려고 했는데 transfomation이 간단하진 않아서 일단 여기서 멈춤.
위 그림 관련해서 찾아본 matlab에서의 transformation 함수
맨 처음 그림과 위의 책 그림을 위한 perspective transform에 관한 간단한 설명.
3b1b가 직접 작성한 설치 가이드. 그런데 커뮤니티버전이 앞으로 계속 더 업글될것이므로 deprecated될 가능성 높음
3b1b.github.io/manim/getting_started/installation.html
3b1b 버전의 manim을 설치하는 방법. 이걸 참고해서 커뮤니티 버전으로 따라해봤으나 sox는 설치가 불가능했고, pip를 쓰기 때문에 여러모로 불안한 방법. 어쨌거나 ffmpeg 패키지만 있어도 quickstart 예제는 구현이 가능했다.
talkingphysics.wordpress.com/2020/07/06/clean-install-of-manim/
---- 2021-12-16 추가 ----
후속 글이 완성되었다. 궁금한 사람은 참고하기 바란다.
https://projecteli.tistory.com/197
---------------------------