راهکار مناسب آن است که دستورات موردنیاز برای تولید گراف مربوطه در لاتک را تولید کنیم، این دستورات را داخل فایلی متنی قرار داده و سپس به صورت مناسب فراخوانی نماییم. با مطالعه کد متلب و لاتکی که در ادامه آمده است، چگونگی انجام کار را متوجه خواهید شد.
مزیت این روش آن است که:
۱- خروجی کیفیت بهتری دارد.
۲- با تغییر برنامه متلب، خروجی به صورت خودکار در سند ما قرار میگیرد.
کدهای متلب و لاتک زیر نحوهی کار را نشان میدهند:
کد متلب (tourGen.m):
% Producing graphs and random tours for TSP problem and using them in XePersian
% Mahmood Amintoosi, HSU, 2014
%% Producing N points on a circle as graph vertices
% locations is the coordinates of these points
clear
N = 5;
locations = zeros(N,2);
r = 10;
for i = 1:N
teta = 2*pi/N * (i-1);
locations(i,1) = r*cos(teta);
locations(i,2) = r*sin(teta);
end
%% Given the list of city locations, we can calculate the distance matrix for all the cities.
distances = zeros(N);
for count1=1:N,
for count2=1:count1,
x1 = locations(count1,1);
y1 = locations(count1,2);
x2 = locations(count2,1);
y2 = locations(count2,2);
distances(count1,count2)=round(sqrt((x1-x2)^2+(y1-y2)^2));
distances(count2,count1)=distances(count1,count2);
end;
end;
%% Tour Generation
% suppose that each random permutations of 1..N is a random tour
x = randperm(N);
% Show the result with MARLAB
figure(1);
tour = x;
tour(end+1) = tour(1); % For displaying with plot
plot(locations(tour,1),locations(tour,2),'bo-');
title('A Random Tour'); drawnow
% Saving the result as a picture
print(gcf,'-dpng','tour.png')
% Saving The result as a txt file containing TikZ Commands
fid = fopen('tour.txt','w');
fprintf(fid,'\\def\\n{%d}',numel(x));
fprintf(fid,'\n\\def\\tour{{');
fprintf(fid,'%d,',x);
fprintf(fid,'%d}}',x(1));
fprintf(fid,'\n\\def\\distances{{');
for i=1:numel(x)-1
fprintf(fid,'%d,',distances(x(i),x(i+1)));
end
fprintf(fid,'%d}}',distances(x(end),x(1)));
fclose(fid);
% Run xelatex on your paper
system('xelatex -interaction=batchmode TSPpaper');
سند لاتک (TSPPaper.tex):
% !TEX TS-program = XeLaTeX
% TSP Tour with MATLAB and TikZ
% Author : M.Amintoosi
% نکات:
% ۱- دقت داشته باشید که در اجرای این سند خطا خواهید گرفت، مگر اینکه حداقل یک بار برنامه tourGen.m را در متلب اجرا کرده باشید.
% ۲- برای تولید شمارهی ارجاعات به شکلها حداقل دو بار باید این سند پردازش شود.
\documentclass{article}
\usepackage{tikz}
\usepackage{tkz-graph}
\usepackage[margin=20mm]{geometry}
\usepackage{subcaption}
\usepackage{xepersian}
\begin{document}
\title{نمودار متلب در لاتک}
\author{محمود امینطوسی}
\maketitle
\begin{abstract}
در این نوشتار قدرت لاتک، در ترکیب با نرمافزاری مانند
\lr{MATLAB}
را ملاحظه میفرمایید.
\end{abstract}
\section{مقدمه}
فرض کنید برای مسئلهای مانند فروشنده دورهگرد، راهحلی در متلب نوشتهاید و مایلید گراف خروجی را در سند خود ( مثلا یک مقاله) داشته باشید. چه راهکاری دارید؟
راهکار اولیهای که به ذهن میرسد آن است که خروجی متلب را در قالب یک تصویر ذخیره نمایید و آنرا در داخل سند خود درج نمایید.
این کار به راحتی توسط دستور
\lr{print}
در متلب قابل انجام است. در فایل
\lr{tourGen.m}
یک گراف با پنج رأس تولید شده، یک تور تصادفی آن رسم و خروجی در فایل
\lr{tour.png}
ذخیره شده است. برای نمایش آن در این سند کافیست از محیط
\lr{figure}
استفاده کنیم. شکل
\ref{fig:TSP:MATLAB}
خروجی را نشان میدهد.
اما یک راهکار بهتر آن است که دستورات موردنیاز برای تولید گراف مربوطه در لاتک را تولید کنیم، این دستورات را داخل فایلی متنی قرار داده و سپس به صورت مناسب فراخوانی نماییم.
با مطالعه برنامه متلب و سورس این سند متوجه روش خواهید شد.
شکل
\ref{fig:TSP:tikz}
خروجی حاصل از این شیوه را نشان میدهد.
با اجرای برنامه متلب ، زیلاتک نیز روی این فایل اجرا شده و خروجی را خواهید داشت و نیازی به باز کردن سند لاتک در ویرایشگر نیست.
میتوانید تعداد رئوس گراف را در برنامه عوض کنید و برنامه را اجرا کنید، مقاله خود را با تصاویر جدید خواهید داشت.
گرچه که در متلب هم میتوان وزن لبهها را روی گراف نمایش داد ولی به منظور جلوگیری از طولانی شدن برنامه از این کار صرفنظر شده است.
\begin{figure}[h]
\centering
\begin{subfigure}[b]{0.5\textwidth}
\centering
\includegraphics[width=0.95\textwidth]{tour.png}
\caption{خروجی ذخیره شده متلب}
\label{fig:TSP:MATLAB}
\end{subfigure}%
\hfill
\begin{subfigure}[b]{0.5\textwidth}
\centering
\begin{tikzpicture}
\input{tour.txt}
\def \radius {3cm}
\def \margin {8} % margin in angles, depends on the radius
\foreach \s in {1,...,\n}
{
\node[draw, circle] (\s) at ({360/\n * (\s - 1)}:\radius) {$\s$};
}
\foreach \i in {1,...,\n}
{
\pgfmathtruncatemacro{\s}{\tour[\i-1]}
\pgfmathtruncatemacro{\t}{\tour[\i]}
\pgfmathtruncatemacro{\len}{\distances[\i-1]}
\Edge[label=\len](\s)(\t)
}
\end{tikzpicture}
\caption{خروجی با دستورات \lr{TikZ}}
\label{fig:TSP:tikz}
\end{subfigure}
\caption{یک تور تصادفی مسئله فروشندهی دورهگرد}
\label{fig:TSP}
\end{figure}
\end{document}
اگر مطابق این کدها، پردازش لازم صورت گیرد خروجی به صورت مناسب تولید خواهد شد. بخشی از یک نمونه خروجی در ادامه آمده است، کیفیت بسیار بهتر تصویر گراف سمت چپ - که حاصل دستورات TikZ بوده است - نسبت به تصویر سمت راست - که عکس خروجی متلب است - کاملا مشهود است.