سلام. یه راه رسم شکلهای ریاضی توی لاتک استفاده از تابع matlab2tikz نرم افزار متلب (MATLAB) هستش. تا جایی که من میدونم این تابع هنگام نصب متلب، همراهش نیست و باید اونو از اینجا دانلود کنید (لینک مربوطه برای سایت mathworks بوده و بدلیل تحریم، با فیلترشکن باید باز بشه). استفاده ازش خیلی راحته، فقط کافیه توی mfile متلب، بعد از plot دستور زیر رو قرار بدین:
matlab2tikz('myfile.tex');
توجه داشته باشید که myfile نام دلخواه است. یا
matlab2tikz('myfile.tikz');
خروجی، یک فایل با فرمت tex یا tikz میشه. این فایل رو به شکل زیر توی لاتک فراخوانی کنید:
\input{myfile.tex}
یا
\input{myfile.tikz}
چون این فایل tex. یا tikz. هستش، میتونید با ویرایشگر لاتک بازش کنید و هر تغییری لازمه روش انجام بدید. مثلا title و label ها رو فارسی کنید؛ چون توی متلب نمیشه فارسی نوشت، یا ابعاد شکل رو تغییر بدید. شکل کاملتر دستور متلب بصورت زیر هستش که ابعاد شکل رو به ورودی لاتک وابسته میکنه:
matlab2tikz('myfigure.tikz', 'height', '\figureheight', 'width', '\figurewidth');
در اینصورت باید توی لاتک کدی به فرمت زیر بنویسید:
\setlength\figureheight{10cm}
\setlength\figurewidth{14cm}
\input{myfigure.tikz}
10cm و 14cm دو مقدار دلخواه است.
اگر بخواهید از محیط شناور استفاده کنید، به صورت زیر:
\begin{figure}
\centering
\setlength\figureheight{10cm}
\setlength\figurewidth{14cm}
\input{figure.tikz}
\end{figure}
توجه داشته باشید که باید \figureheight
و \figurewidth
رو تعریف کنید.
مثال (کد متلب):
clc;
clear;
close all;
%%
x = [6.108,6.520,6.361,5.781,5.230];
explode = [0,1,0,0,1];
pie(x, explode);
matlab2tikz('myfigure.tikz', 'height', '\figureheight', 'width', '\figurewidth');
خروجی متلب:
کد لاتک:
\documentclass{article}
\usepackage{pgfplots}
\pgfplotsset{compat=newest} % this command isn't necessary
\newlength\figureheight % necessary for matlab2tikz command
\newlength\figurewidth % necessary for matlab2tikz command
\usepackage{xepersian}
\settextfont[Scale=1]{XB Niloofar}
\begin{document}
\begin{figure}
\centering
\setlength\figureheight{10cm}
\setlength\figurewidth{14cm}
\input{myfigure.tikz}
\end{figure}
\end{document}
خروجی لاتک:
همونطور که ملاحظه میکنید، بدلیل استفاده از بسته xepersian، اعداد شکل فارسی شد.
حالا یه مثال پیچیده تر
کد متلب:
clc;
clear;
close all;
%%
x1=-10:.1:10;
y1=pdf('normal',x1,0,1);
n=0.001;
for i=1:12
y(i)=0;
end
for i=1:1000
x(i)=sqrt(-2*log(rand))*cos(2*pi*rand);
q(i)=.001;
end
for j=1:12
a=-3.5+.5*j;
b=-3+.5*j;
for i=1:1000
if x(i)<=b
if x(i)>=a
y(j)=y(j)+n;
else
end
else
end
end
end
y=2.*y;
u=0;
for i=1:12
u=u+y(i);
end
u=u/2;
w=-4:.01:4;
z=0;
for i=1:12
z=y(i)*(heaviside(w+3.5-.5*i)-heaviside(w+3-.5*i))+z;
end
f=figure;
subplot(1,2,1)
p=plot(x,q,'bo');
axis([-4.1 4.1 0 .0011])
p.MarkerFaceColor='b';
xlabel('$\lambda$','interpreter','latex','fontsize',15)
title('$\rm pmf$','fontsize',20,'interpreter','latex')
x=x';
X=x(:,ones(1,3))';
X=X(:);
hold on
Y=[zeros(1000,1) .001*ones(1000,1) nan*ones(1000,1)]';
Y=Y(:);
plot(X, Y, 'b');
subplot(1,2,2)
plot(w,z,'black',x1,y1,'--')
axis([-4.1 4.1 0 .6])
xlabel('$\lambda$','interpreter','latex','fontsize',15)
title('$\rm Adjusted \, pdf$','fontsize',20,'interpreter','latex')
l=legend('$\scriptstyle{\rm Adjusted \, pdf}$','$\scriptstyle{N(0,1)}$');
set(l,'interpreter','latex','box','off')
matlab2tikz('figure.tikz');
خروجی متلب:
کد لاتک:
\documentclass{standalone}
\usepackage{pgfplots,amsmath}
\pgfplotsset{compat=newest}
\usepgfplotslibrary{groupplots}
\begin{document}
\input{figure.tikz}
\end{document}
خروجی لاتک با کمی تغییراتی که دستی توی فایل figure.tikz اعمال کردم:
لازم به ذکره که رسم همچین شکلی مستقیما با لاتک نیازمند صدها خط کد میباشد. ولی با کمتر از ۶۰ خط کد متلب، که بیشتر اون دستورات اختیاری قابل حذف هستند این کار انجام شده. به خصوص اینکه متلب به عنوان نرم افزار ریاضی، تولباکس ها و توابع آماده داره، اما تمام اونها باید توی لاتک تعریف بشه.
نکته آخر اینکه این روش فقط برای رسم شکل های ریاضیاتی قابل رسم با متلب کاربرد داره. برای رسم بلوک دیاگرام ها و دیگر اشکال، بهتره از بسته tikz استفاده کنید.