%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% \chapter{تولید شکل‌های ریاضی} \label{chap:graphics} \begin{intro} بسیاری از افراد از لاتک برای حروف‌چینی متن استفاده می‌کنند. اما از آنجا که رهیافت ساختار یافته بسیار مناسب است، لاتک همچنین توانایی تولید تصاویر از فرمان‌های متنی را دارد. به علاوه، چندین گسترش از لاتک امکان انجام این کار را به بهترین شکل فراهم می‌کنند. در این فصل چند نوع از این گسترش‌ها را مطالعه می‌کنیم. \end{intro} \section{مرور} محیط \ei{picture} امکان برنامه‌نویسی برای تولید شکل در لاتک را فراهم می‌کند. توضیح کامل را در \manual ببینید. از یک طرف، چندین محدودیت وجود دارد که از آن جمله محدودیت شیب خط‌ها و شعاع دایره‌ها است. از طرف دیگر، محیط \ei{picture} از لاتک به همراه فرمان \ci{qbezier} همراه است، \lr{``\texttt{q}''} به معنای \lr{``quadratic''}\footnote{مترجم: به معنای خم درجه دوم است.} است. بسیاری از خم‌ها مانند دایره‌، بیضی، یا ترکیبی از این خم‌ها را می‌توان با تقریب خم‌های درجهٔ دوم بزیه رسم کرد، هرچند که این کار نیازمند محاسبات ریاضی است. به علاوه، اگر یک زبان برنامه‌نویسی مانند جاوا برای تولید بلوک‌های \ci{qbezier} مورد استفاده قرار گیرد، محیط \ei{picture} بسیار قدرتمند خواهد شد. با وجود این که نوشتن کد تصاویر در لاتک بسیار محدود کننده و زمان‌بر است، کار با آن هنوز خواستگاه دارد زیرا نوشتار‌‌ را بسیار کوچک می‌کند و به هیچ فایل تصویری احتیاج ندارد. بسته‌هایی مانند \pai{epic} و \pai{eepic} (که به عنوان مثال در \companion توضیح داده شده اند)، یا \pai{pstricks} وجود دارند که محدودیت‌های محیط \ei{picture} را ندارند و توان گرافیکی لاتک را به مقدار زیادی قدرت می‌بخشند. درحالی که دو بستهٔ اولیه تنها محیط \ei{picture} را قدرت می‌بخشند، بستهٔ \pai{pstricks} دارای محیط منحصر به فرد \ei{pspicture} است. قدرت سیستم \pai{pstricks} در این است که این بسته از قابلیت‌های \PSi استفاده می‌کند. به علاوه بسته‌های مختلفی برای کارهای ویژه نوشته شده است. یکی از این بسته‌ها \lr{\texorpdfstring{\Xy}{Xy}-pic} است که در آخر این فصل توضیح داده شده است. توضیح مفصل‌تری بر این بسته در \graphicscompanion ارائه شده است (با \companion اشتباه نشود). شاید مهمترین ابزار گرافیکی مربوط به لاتک، متاپست است که به همراه متافونت دوقلوهای دونالد کنوث نام دارند. بر خلاف متافونت، که بیتمپ تولید می‌کند، متاپست فایل‌های \PSi تولید می‌کند که می‌توان آنها را به لاتک انتقال داد. برای مقدمه‌ای بر این موضوع به \hobby، یا راهنمای \cite{ursoswald} مراجعه کنید. بحث کاملی از استراتژی‌های لاتک و تک برای گرافیک (و قلم‌ها) را می‌توانید در \hoenig ببینید. \section{محیط تصویر} %\secby{Urs Oswald}{osurs@bluewin.ch} \subsection{فرمان‌های ابتدایی} یک محیط \ei{picture} \footnote{قبول داشته باشید یا نه، محیط تصویر به‌طور هوشمندانه کار می‌کند، با لاتک استاندارد هیچ بسته‌ای لازم نیست.} را می‌توان با دو فرمان زیر بوجود آورد \begin{lscommand} \ci{begin}\verb|{picture}(|$x,y$\verb|)|\ldots\ci{end}\verb|{picture}| \end{lscommand} \noindent یا \begin{lscommand} \ci{begin}\verb|{picture}(|$x,y$\verb|)(|$x_0,y_0$\verb|)|\ldots\ci{end}\verb|{picture}| \end{lscommand} اعداد $x,\,y,\,x_0,\,y_0$ به \ci{unitlength} اشاره می‌کنند که می‌توان آنها را با فرمانی به شکل زیر دوباره بارگذاری کرد (ولی این کار را نمی‌توان با محیط \ei{picture} انجام داد) \begin{lscommand} \ci{setlength}\verb|{|\ci{unitlength}\verb|}{1.2cm}| \end{lscommand} مقدار پیش‌فرض \ci{unitlength} برابر \lr{\texttt{1pt}} است. زوج $(x,y)$ اندازهٔ چهارچوب دور تصویر را مشخص می‌کند. زوج اختیاری $(x_0,y_0)$ مکان گوشهٔ پایین سمت چپ چهارچوب رزرو شده را تعیین می‌کند. بیشتر فرمان‌ها به یکی از دو شکل زیر است \begin{lscommand} \ci{put}\verb|(|$x,y$\verb|){|\emph{object}\verb|}| \end{lscommand} \noindent یا \begin{lscommand} \ci{multiput}\verb|(|$x,y$\verb|)(|$\Delta x,\Delta y$\verb|){|$n$\verb|}{|\emph{object}\verb|}| \end{lscommand} خم‌های بزیه از این قاعده مستثنی است. این خم‌ها را می‌توان با فرمان زیر رسم کرد \begin{lscommand} \ci{qbezier}\verb|(|$x_1,y_1$\verb|)(|$x_2,y_2$\verb|)(|$x_3,y_3$\verb|)| \end{lscommand} \newpage \subsection{پاره‌خط‌} \begin{example} \setlength{\unitlength}{5cm} \begin{picture}(1,1) \put(0,0){\line(0,1){1}} \put(0,0){\line(1,0){1}} \put(0,0){\line(1,1){1}} \put(0,0){\line(1,2){.5}} \put(0,0){\line(1,3){.3333}} \put(0,0){\line(1,4){.25}} \put(0,0){\line(1,5){.2}} \put(0,0){\line(1,6){.1667}} \put(0,0){\line(2,1){1}} \put(0,0){\line(2,3){.6667}} \put(0,0){\line(2,5){.4}} \put(0,0){\line(3,1){1}} \put(0,0){\line(3,2){1}} \put(0,0){\line(3,4){.75}} \put(0,0){\line(3,5){.6}} \put(0,0){\line(4,1){1}} \put(0,0){\line(4,3){1}} \put(0,0){\line(4,5){.8}} \put(0,0){\line(5,1){1}} \put(0,0){\line(5,2){1}} \put(0,0){\line(5,3){1}} \put(0,0){\line(5,4){1}} \put(0,0){\line(5,6){.8333}} \put(0,0){\line(6,1){1}} \put(0,0){\line(6,5){1}} \end{picture} \end{example} پاره‌خط‌ها را می‌توان با فرمان زیر رسم کرد \begin{lscommand} \ci{put}\verb|(|$x,y$\verb|){|\ci{line}\verb|(|$x_1,y_1$\verb|){|$length$\verb|}}| \end{lscommand} فرمان \ci{line} دارای دو آرگومان است: \begin{enumerate} \item یک بردار جهت‌دار، \item یک طول. \end{enumerate} مؤلفه‌های بردار جهت‌دار به چند عدد محدود می‌شود \[ -6,\,-5,\,\ldots,\,5,\,6, \] و باید نسبت به هم اول باشند (یعنی دارای بزرگترین مقسوم علیه ۱ باشند). در شکل تمام ۲۵ شیب ممکن در یک‌چهارم اول نمایش داده شده است. طول بستگی به \ci{unitlength} دارد. آرگومان طول همان مؤلفهٔ افقی است و تنها در حالتی که پاره‌خط عمودی باشد، این آرگومان همان مؤلفهٔ عمودی است. \subsection{پیکان‌ها} \begin{example} \setlength{\unitlength}{0.75mm} \begin{picture}(60,40) \put(30,20){\vector(1,0){30}} \put(30,20){\vector(4,1){20}} \put(30,20){\vector(3,1){25}} \put(30,20){\vector(2,1){30}} \put(30,20){\vector(1,2){10}} \thicklines \put(30,20){\vector(-4,1){30}} \put(30,20){\vector(-1,4){5}} \thinlines \put(30,20){\vector(-1,-1){5}} \put(30,20){\vector(-1,-4){5}} \end{picture} \end{example} پیکان‌ها با فرمان زیر رسم می‌شوند \begin{lscommand} \ci{put}\verb|(|$x,y$\verb|){|\ci{vector}\verb|(|$x_1,y_1$\verb|){|$length$\verb|}}| \end{lscommand} برای پیکان‌ها، مؤلفه‌های بردارهای جهت‌دار حتی بیشتر از این محدود هستند و تنها به چند عدد محدود هستند \[ -4,\,-3,\,\ldots,\,3,\,4. \] این اعداد نیز باید نسبت به هم اول باشند. به تأثیر فرمان \ci{thicklines} روی دو بردار به سمت چپ توجه داشته باشید. \subsection{دایره} \begin{example} \setlength{\unitlength}{1mm} \begin{picture}(60, 40) \put(20,30){\circle{1}} \put(20,30){\circle{2}} \put(20,30){\circle{4}} \put(20,30){\circle{8}} \put(20,30){\circle{16}} \put(20,30){\circle{32}} \put(40,30){\circle{1}} \put(40,30){\circle{2}} \put(40,30){\circle{3}} \put(40,30){\circle{4}} \put(40,30){\circle{5}} \put(40,30){\circle{6}} \put(40,30){\circle{7}} \put(40,30){\circle{8}} \put(40,30){\circle{9}} \put(40,30){\circle{10}} \put(40,30){\circle{11}} \put(40,30){\circle{12}} \put(40,30){\circle{13}} \put(40,30){\circle{14}} \put(15,10){\circle*{1}} \put(20,10){\circle*{2}} \put(25,10){\circle*{3}} \put(30,10){\circle*{4}} \put(35,10){\circle*{5}} \end{picture} \end{example} فرمان \begin{lscommand} \ci{put}\verb|(|$x,y$\verb|){|\ci{circle}\verb|{|\emph{diameter}\verb|}}| \end{lscommand} \noindent یک دایره به مرکز $(x,y)$ و قطر (نه شعاع) \emph{diameter} را رسم می‌کند. محیط \ei{picture} تنها قطرهای تا حداکثر ۱۴ میلیمتر را می‌پذیرد. فرمان \ci{circle*} قرص‌ها را تولید می‌کند (دایره‌های توپر). همانند پاره‌خط‌ها، باید از بسته‌های دیگری نیز استفاده کرد، مانند \pai{eepic} یا \pai{pstricks}. برای راهنمایی کامل در مورد این بسته‌ها به \graphicscompanion مراجعه کنید. حالت دیگری نیز در محیط \ei{picture} وجود دارد. اگر از انجام محاسبات ریاضی نمی‌ترسید، دایره‌ها و بیضی‌های دلخواه را می‌توان با خم‌های بزیه به هم چسباند. برای مثال‌هایی از کدهای جاوا به \graphicsinlatex مراجعه کنید. \subsection{متن و فرمول} \begin{example} \setlength{\unitlength}{0.8cm} \begin{picture}(6,5) \thicklines \put(1,0.5){\line(2,1){3}} \put(4,2){\line(-2,1){2}} \put(2,3){\line(-2,-5){1}} \put(0.7,0.3){$A$} \put(4.05,1.9){$B$} \put(1.7,2.95){$C$} \put(3.1,2.5){$a$} \put(1.3,1.7){$b$} \put(2.5,1.05){$c$} \put(0.3,4){$F= \sqrt{s(s-a)(s-b)(s-c)}$} \put(3.5,0.4){$\displaystyle s:=\frac{a+b+c}{2}$} \end{picture} \end{example} همان‌طور که این مثال نشان می‌دهد، متن و فرمول را می‌توان در محیط \ei{picture} با فرمان \ci{put} به طریق عادی درج کرد. %\subsection{\texorpdfstring{\lr{$\backslash$multiput}\rl{\, و } \lr{$\backslash$linethikness}}{فرمان‌های $\backslash$multiput و $\backslash$linethikness}} \subsection{\texorpdfstring{\ci{multiput} و \ci{linethikness}}{فرمان‌های multiput و linethikness}} \begin{example} \setlength{\unitlength}{2mm} \begin{picture}(30,20) \linethickness{0.075mm} \multiput(0,0)(1,0){26}% {\line(0,1){20}} \multiput(0,0)(0,1){21}% {\line(1,0){25}} \linethickness{0.15mm} \multiput(0,0)(5,0){6}% {\line(0,1){20}} \multiput(0,0)(0,5){5}% {\line(1,0){25}} \linethickness{0.3mm} \multiput(5,0)(10,0){2}% {\line(0,1){20}} \multiput(0,5)(0,10){2}% {\line(1,0){25}} \end{picture} \end{example} فرمان \begin{lscommand} \ci{multiput}\verb|(|$x,y$\verb|)(|$\Delta x,\Delta y$\verb|){|$n$\verb|}{|\emph{object}\verb|}| \end{lscommand} \noindent دارای چهار آرگومان است: نقطهٔ شروع، نقطهٔ پایان، بردار انتقال از یک شیئ به شیئ بعدی، تعداد اشیاء، وشیئ که باید رسم شود. فرمان \ci{linethickness} به پاره‌خط‌های افقی و عمودی تأثیر دارد ولی روی خط‌های اریب و دایره‌ها بی‌تأثیر است. این فرمان مسلماً روی خم‌های بزیه تأثیر دارد! \subsection{بیضی} \begin{example} \setlength{\unitlength}{0.75cm} \begin{picture}(6,4) \linethickness{0.075mm} \multiput(0,0)(1,0){7}% {\line(0,1){4}} \multiput(0,0)(0,1){5}% {\line(1,0){6}} \thicklines \put(2,3){\oval(3,1.8)} \thinlines \put(3,2){\oval(3,1.8)} \thicklines \put(2,1){\oval(3,1.8)[tl]} \put(4,1){\oval(3,1.8)[b]} \put(4,3){\oval(3,1.8)[r]} \put(3,1.5){\oval(1.8,0.4)} \end{picture} \end{example} فرمان \begin{lscommand} \ci{put}\verb|(|$x,y$\verb|){|\ci{oval}\verb|(|$w,h$\verb|)}| \end{lscommand} \noindent یا \begin{lscommand} \ci{put}\verb|(|$x,y$\verb|){|\ci{oval}\verb|(|$w,h$\verb|)[|\emph{position}\verb|]}| \end{lscommand} \noindent یک بیضی به مرکز $(x,y)$ و به عرض $w$ و ارتفاع $h$ تولید می‌کند. آرگومان‌های مکان \emph{position} که عبارتند از \lr{\texttt{b}}، \lr{\texttt{t}}، \lr{\texttt{l}}، \lr{\texttt{r}} به \lr{``top''}(بالا)، \lr{``bottom''}(پایین)، \lr{``left''}(چپ)، و \lr{``right''}(راست) اشاره دارند و می‌توانند همانند مثال با هم ترکیب شوند. ضخامت خط را می‌توان با دو نوع فرمان کنترل کرد: \LRE{\ci{linethickness}\verb|{|\emph{length}\verb|}|} از یک طرف، و \ci{thinlines} و \ci{thicklines} از طرف دیگر \LRE{\ci{linethickness}\verb|{|\emph{length}\verb|}|} فقط به خط‌های افقی و عمودی (و خم‌های درجه دوم بزیه) تأثیر دارد، در حالی که \ci{thinlines} و \ci{thicklines} بر خط‌های اریب و دایره‌ها و بیضی‌ها نیز تأثیر دارند. \subsection{استفاده چند‌باره از جعبه‌های تصویر پیش‌ساخته} \begin{example} \setlength{\unitlength}{0.5mm} \begin{picture}(120,168) \newsavebox{\foldera} \savebox{\foldera} (40,32)[bl]{% definition \multiput(0,0)(0,28){2} {\line(1,0){40}} \multiput(0,0)(40,0){2} {\line(0,1){28}} \put(1,28){\oval(2,2)[tl]} \put(1,29){\line(1,0){5}} \put(9,29){\oval(6,6)[tl]} \put(9,32){\line(1,0){8}} \put(17,29){\oval(6,6)[tr]} \put(20,29){\line(1,0){19}} \put(39,28){\oval(2,2)[tr]} } \newsavebox{\folderb} \savebox{\folderb} (40,32)[l]{% definition \put(0,14){\line(1,0){8}} \put(8,0){\usebox{\foldera}} } \put(34,26){\line(0,1){102}} \put(14,128){\usebox{\foldera}} \multiput(34,86)(0,-37){3} {\usebox{\folderb}} \end{picture} \end{example} یک جعبهٔ تصویر را می‌توان با فرمان \begin{lscommand} \ci{newsavebox}\verb|{|\emph{name}\verb|}| \end{lscommand} \noindent معرفی، و با فرمان \begin{lscommand} \ci{savebox}\verb|{|\emph{name}\verb|}(|\emph{width,height}\verb|)[|\emph{position}\verb|]{|\emph{content}\verb|}| \end{lscommand} \noindent تعریف، و نهایتاً با فرمان \begin{lscommand} \ci{put}\verb|(|$x,y$\verb|)|\ci{usebox}\verb|{|\emph{name}\verb|}| \end{lscommand} رسم کرد. پارامتر اختیاری \emph{position} نقش لنگر را برای جعبه بازی می‌کند. در مثال این پارامتر برابر \lr{\texttt{bl}} تعریف شده است که لنگر را در گوشهٔ چپ پایین صفحه قرار می‌دهد. گزینه‌های دیگر \lr{\texttt{t}} (بالا) و \lr{\texttt{r}} (راست) هستند. آرگومان \emph{name} به یک جعبه در لاتک ارجاع می‌کند و بنابراین طبیعت فرمان دارد. تصاویر درون جعبه‌ها می‌توانند تودرتو باشند: در این مثال \ci{foldera} درون \ci{folderb} تعریف شده است. فرمان \ci{oval} که باید همانند \ci{line} استفاده شود به پاره‌خط‌های کمتر از ۳ میلیمتر بی‌تأثیر است. \subsection{خم‌های درجهٔ دوم بزیه} \begin{example} \setlength{\unitlength}{0.8cm} \begin{picture}(6,4) \linethickness{0.075mm} \multiput(0,0)(1,0){7} {\line(0,1){4}} \multiput(0,0)(0,1){5} {\line(1,0){6}} \thicklines \put(0.5,0.5){\line(1,5){0.5}} \put(1,3){\line(4,1){2}} \qbezier(0.5,0.5)(1,3)(3,3.5) \thinlines \put(2.5,2){\line(2,-1){3}} \put(5.5,0.5){\line(-1,5){0.5}} \linethickness{1mm} \qbezier(2.5,2)(5.5,0.5)(5,3) \thinlines \qbezier(4,2)(4,3)(3,3) \qbezier(3,3)(2,3)(2,2) \qbezier(2,2)(2,1)(3,1) \qbezier(3,1)(4,1)(4,2) \end{picture} \end{example} همان‌طور که این مثال نشان می‌دهد، تقسیم یک دایره به چهار خم بزیه مطلوب نیست. حداقل ۸ قسمت مورد نیاز است. شکل، دوباره اثر فرمان \ci{linethickness} را روی خط‌های افقی و عمودی، و اثر \ci{thinlines} و \ci{thicklines} را روی خط‌های مورب نشان می‌دهد. این مثال همچنین نشان می‌دهد که همهٔ این فرمان‌ها روی خم‌های بزیه مؤثر هستند و اثر فرمان‌های قبلی را از بین می‌برند. فرض کنید $P_1=(x_1,\,y_1),\,P_2=(x_2,\,y_2)$ نقاط انتهایی باشند، و $m_1,\,m_2$ به ترتیب شیب‌های خم‌های بزیه باشند. نقطهٔ کنترل کنندهٔ میانی $S=(x,\,y)$ با رابطهٔ \begin{equation} \label{zwischenpunkt} \left\{ \begin{array}{rcl} x & = & \displaystyle \frac{m_2 x_2-m_1x_1-(y_2-y_1)}{m_2-m_1}, \\ y & = & y_i+m_i(x-x_i)\qquad (i=1,\,2). \end{array} \right. \end{equation} \noindent داده شده است. \graphicsinlatex را برای دیدن یک برنامهٔ جاوا که خط‌فرمان لازم برای فرمان‌های \ci{qbezier} را ارائه می‌دهد ببینید. \subsection{تسبیح} \begin{example} \setlength{\unitlength}{1cm} \begin{picture}(4.3,3.6)(-2.5,-0.25) \put(-2,0){\vector(1,0){4.4}} \put(2.45,-.05){$x$} \put(0,0){\vector(0,1){3.2}} \put(0,3.35){\makebox(0,0){$y$}} \qbezier(0.0,0.0)(1.2384,0.0) (2.0,2.7622) \qbezier(0.0,0.0)(-1.2384,0.0) (-2.0,2.7622) \linethickness{.075mm} \multiput(-2,0)(1,0){5} {\line(0,1){3}} \multiput(-2,0)(0,1){4} {\line(1,0){4}} \linethickness{.2mm} \put( .3,.12763){\line(1,0){.4}} \put(.5,-.07237){\line(0,1){.4}} \put(-.7,.12763){\line(1,0){.4}} \put(-.5,-.07237){\line(0,1){.4}} \put(.8,.54308){\line(1,0){.4}} \put(1,.34308){\line(0,1){.4}} \put(-1.2,.54308){\line(1,0){.4}} \put(-1,.34308){\line(0,1){.4}} \put(1.3,1.35241){\line(1,0){.4}} \put(1.5,1.15241){\line(0,1){.4}} \put(-1.7,1.35241){\line(1,0){.4}} \put(-1.5,1.15241){\line(0,1){.4}} \put(-2.5,-0.25){\circle*{0.2}} \end{picture} \end{example} در این شکل، هر نیمهٔ متقارن از تسبیح $y=\cosh x -1$ با یک خم بزیه تقریب زده شده است. نیمهٔ سمت راست در نقطهٔ \((2,\,2.7622)\) به پایان می‌رسد، که شیب خط در این نقطه \(m=3.6269\) است. با استفادهٔ دوباره از رابطهٔ ( \ref{zwischenpunkt})، می‌توانیم نقاط میانی کنترلی را بدست آوریم. این نقاط برابرند با $(1.2384,\,0)$ و $(-1.2384,\,0)$. علامت‌های صلیب نقاط تسبیح را نشان می‌دهند. خطا قابل چشم‌پوشی است و کمتر از یک درصد است. این مثال استفاده از آرگومان اختیاری فرمان \verb|\begin{picture}| را نشان می‌دهد. تصویر به صورت مناسب مولفه‌های ریاضی تعریف شده است، با این وجود با فرمان \begin{lscommand} \ci{begin}\verb|{picture}(4.3,3.6)(-2.5,-0.25)| \end{lscommand} \noindent گوشهٔ سمت چپ پایین (که با قرص سیاه مشخص شده است) با مختصات $(-2.5,-0.25)$ تعریف شده است. \subsection{سرعت در نظریه نسبیت عام} \begin{example} \setlength{\unitlength}{0.8cm} \begin{picture}(6,4)(-3,-2) \put(-2.5,0){\vector(1,0){5}} \put(2.7,-0.1){$\chi$} \put(0,-1.5){\vector(0,1){3}} \multiput(-2.5,1)(0.4,0){13} {\line(1,0){0.2}} \multiput(-2.5,-1)(0.4,0){13} {\line(1,0){0.2}} \put(0.2,1.4) {$\beta=v/c=\tanh\chi$} \qbezier(0,0)(0.8853,0.8853) (2,0.9640) \qbezier(0,0)(-0.8853,-0.8853) (-2,-0.9640) \put(-3,-2){\circle*{0.2}} \end{picture} \end{example} نقاط کنترلی خم‌های بزیه با فرمول‌های \eqref{zwischenpunkt} محاسبه شده‌اند. شاخهٔ مثبت با $P_1=(0,\,0)$، $\,m_1=1$، $P_2=(2,\,\tanh 2)$، و $\,m_2=1/\cosh^2 2$ تعریف می‌شود. دوباره، تصویر به شکل مختصات مناسب مؤلفه‌ای ریاضی تعریف شده است و گوشهٔ سمت چپ پایین با مختصات $(-3,-2)$ تعریف شده است (دیسک سیاه). \section{بستهٔ گرافیک \lr{TikZ \& PGF}} امروزه هر سیستم تولید خروجی \lr{\LaTeX{}} توانایی تولید تصاویر بُرداری زیبا را دارد، تنها ابزار انجام این کار ممکن است تغییر کند. بستهٔ \lr{PGF} یک لایهٔ رویی برای انجام این کار را در اختیار شما قرار می‌دهد و اجازه می‌دهد که این کار را با استفاده از فرمان‌های ساده به راحتی انجام دهید و تصاویر برداری پیچیده را دقیقاً از داخل نوشتار تولید کنید. بستهٔ \lr{PGF} دارای راهنمای +۵۰۰ صفحه‌ای است\cite{pgfplots}. بنابراین در این بخش کوتاه قصد داریم تنها جرعه‌ای از این چشمهٔ بی‌کران را به شما بچشانیم. برای دسترسی سطح بالا به توابع \lr{PGF} باید بستهٔ \pai{tikz} را فراخوانی کنید. با استفاده از بستهٔ \lr{tikz} می‌توانید فرمان‌های بسیار مؤثری را برای رسم تصاویر از داخل نوشتار خود استفاده کنید. از محیط \ei{tikzpicture} برای این کار استفاده کنید. \begin{example} \begin{tikzpicture}[scale=3] \clip (-0.1,-0.2) rectangle (1.8,1.2); \draw[step=.25cm,gray,very thin] (-1.4,-1.4) grid (3.4,3.4); \draw (-1.5,0) -- (2.5,0); \draw (0,-1.5) -- (0,1.5); \draw (0,0) circle (1cm); \filldraw[fill=green!20!white, draw=green!50!black] (0,0) -- (3mm,0mm) arc (0:30:3mm) -- cycle; \end{tikzpicture} \end{example} اگر به زبان‌های دیگر برنامه‌نویسی آشنا هستید، ممکن است به فرمان آشنای نیم‌نقطه (\lr{\texttt{;}}) توجه کرده باشید که برای جداسازی فرمان‌های مختلف مورد استفاده قرار می‌گیرد. با استفاده از فرمان \ci{usetikzlibrary} در سرآغاز نوشتار خود می‌توانید امکانات بیشتری را برای رسم اشکال ویژه فعال کنید، مانند جعبه‌هایی که کمی خم شده‌اند. \begin{example} \usetikzlibrary{% decorations.pathmorphing} \begin{tikzpicture}[ decoration={bent,aspect=.3}] \draw [decorate,fill=lightgray] (0,0) rectangle (5.5,2); \node[circle,draw] (A) at (.5,.5) {A}; \node[circle,draw] (B) at (5,1.5) {B}; \draw[->,decorate] (A) -- (B); \draw[->,decorate] (B) -- (A); \end{tikzpicture} \end{example} همچنین می‌توانید دیاگرام‌هایی را رسم کنید که مانند این است که دقیقاً از یک کتاب برنامه نویسی پاسکال برداشته شده است. کد این کار کمی پیچیده‌تر از مثال بالا است، بنابراین تنها اثر آن را نمایش می‌دهم. اگر به راهنمای بستهٔ \lr{PGF} نگاهی بیندازید، می‌توانید راهنمای مفصل رسم این دیاگرام‌ها را ببینید. \setLR \begin{center} \begin{tikzpicture}[point/.style={coordinate},thick,draw=black!50,>=stealth', tip/.style={->,shorten >=1pt},every join/.style={rounded corners}, skip loop/.style={to path={-- ++(0,#1) -| (\tikztotarget)}}, hv path/.style={to path={-| (\tikztotarget)}}, vh path/.style={to path={|- (\tikztotarget)}}, terminal/.style={ rounded rectangle, minimum size=6mm, thick,draw=black!50, top color=white,bottom color=black!20, font=\ttfamily\tiny}, nonterminal/.style={ rectangle, minimum size=6mm, thick, draw=red!50!black!50, % 50% red and 50% black, top color=white, % a shading that is white at the top... bottom color=red!50!black!20, % and something else at the bottom font=\itshape\tiny}] \matrix[column sep=4mm] { % First row: & & & & & & & & & & & \node (plus) [terminal] {+};\\ % Second row: \node (p1) [point] {}; & \node (ui1) [nonterminal] {\rl{عدد بدون‌علامت}}; & \node (p2) [point] {}; & \node (dot) [terminal] {.}; & \node (p3) [point] {}; & \node (digit) [terminal] {\rl{رقم}}; & \node (p4) [point] {}; & \node (p5) [point] {}; & \node (p6) [point] {}; & \node (e) [terminal] {E}; & \node (p7) [point] {}; & & \node (p8) [point] {}; & \node (ui2) [nonterminal] {\rl{عدد بدون‌علامت}}; & \node (p9) [point] {}; & \node (p10) [point] {};\\ % Third row: & & & & & & & & & & & \node (minus)[terminal] {-};\\ }; { [start chain] \chainin (p1); \chainin (ui1) [join=by tip]; \chainin (p2) [join]; \chainin (dot) [join=by tip]; \chainin (p3) [join]; \chainin (digit) [join=by tip]; \chainin (p4) [join]; { [start branch=digit loop] \chainin (p3) [join=by {skip loop=-6mm,tip}]; } \chainin (p5) [join,join=with p2 by {skip loop=6mm,tip}]; \chainin (p6) [join]; \chainin (e) [join=by tip]; \chainin (p7) [join]; { [start branch=plus] \chainin (plus) [join=by {vh path,tip}]; \chainin (p8) [join=by {hv path,tip}]; } { [start branch=minus] \chainin (minus) [join=by {vh path,tip}]; \chainin (p8) [join=by {hv path,tip}]; } \chainin (p8) [join]; \chainin (ui2) [join=by tip]; \chainin (p9) [join,join=with p6 by {skip loop=-11mm,tip}]; \chainin (p10) [join=by tip]; } \end{tikzpicture} \end{center} \setRL \pagebreak چیزهای بیشتری وجود دارد؛ اگر می‌خواهید نمودار داده‌های عددی را رسم کنید، باید نگاه دقیق‌تری به راهنمای بستهٔ \pai{pgfplot} بیندازید. این راهنما شامل هر چیزی است که برای رسم این نمودارها لازم دارید. حتی می‌توانید فرمان \lr{\texttt{gnuplot}} را استفاده کنید تا مقدار دقیق توابع مورد نظر خود را بدست آورید. \section{\lr{\Xy-pic}} %\secby{Alberto Manuel Brand\~ao Sim\~oes}{albie@alfarrabio.di.uminho.pt} \pai{xy} یک بسته برای طراحی دیاگرام‌هاست. برای استفاده از آن، فرمان زیر را در سرآغاز نوشتار‌ خود قرار دهید: \begin{lscommand} \verb|\usepackage[|\emph{options}\verb|]{xy}| \end{lscommand} \emph{options} لیستی از توابع \lr{\Xy-pic} است که می‌خواهید فراخوانی کنید. این گزینه‌ها برای غلط‌\-گیری بسیار مؤثر هستند. توصیه می‌کنم تمام گزینه‌ها را با گزینهٔ \verb!all! فعال کنید تا لاتک تمام فرمان‌های \lr{\Xy} را فراخوانی کند. دیاگرام‌های \lr{\Xy-pic} روی یک طرح ماتریسی نمایش داده می‌شوند، که هر دیاگرام در یک خانهٔ ماتریس قرار می‌گیرد: \begin{example} \begin{displaymath} \xymatrix{A & B \\ C & D } \end{displaymath} \end{example} فرمان \ci{xymatrix} باید در محیط ریاضی مورد استفاده قرار بگیرد. در اینجا دو سطر و دو ستون مشخص کرده‌ایم. برای این که این ماتریس را به یک دیاگرام تبدیل کنیم باید جهت پیکان‌ها را با فرمان \ci{ar} مشخص کنیم. \begin{example} \begin{displaymath} \xymatrix{ A \ar[r] & B \ar[d] \\ D \ar[u] & C \ar[l] } \end{displaymath} \end{example} فرمان پیکان در سلول اصلی پیکان قرار داده می‌شود. آرگومان‌ها جهت پیکان هستند و باید به \lr{\texttt{u}p}،\lr{\texttt{d}own}، \lr{\texttt{r}ight}، یا \lr{\texttt{l}eft} اشاره کنند. \begin{example} \begin{displaymath} \xymatrix{ A \ar[d] \ar[dr] \ar[r] & B \\ D & C } \end{displaymath} \end{example} برای رسم قطر‌ها، فقط کافی است جهت را معرفی کنیم. در حقیقت، می‌توانید جهت را تکرار کنید تا پیکان‌ها بزرگتر شوند. \begin{example} \begin{displaymath} \xymatrix{ A \ar[d] \ar[dr] \ar[drr] & & \\ B & C & D } \end{displaymath} \end{example} می‌توانیم حتی دیاگرام‌های جالب با افزودن برچسب به پیکان‌ها طراحی کنیم. برای این کار، از فرمان‌های زیرنویس و بالانویس استفاده می‌کنیم. \begin{example} \begin{displaymath} \xymatrix{ A \ar[r]^f \ar[d]_g & B \ar[d]^{g'} \\ D \ar[r]_{f'} & C } \end{displaymath} \end{example} همان‌طور که نشان داده شد، این کارها را همانند سبک ریاضی می‌توان انجام داد. تنها تفاوت در این است که بالانویس به معنای بالای پیکان و پایین‌نویس پایین پیکان است. عملگر سومی نیز وجود دارد : \verb+|+ این فرمان باعث می‌شود متنی در درون یک پیکان ظاهر شود. \begin{example} \begin{displaymath} \xymatrix{ A \ar[r]|f \ar[d]|g & B \ar[d]|{g'} \\ D \ar[r]|{f'} & C } \end{displaymath} \end{example} برای رسم یک پیکان با یک حفره درون آن از \verb!\ar[...]|\hole! استفاده کنید. در بعضی حالات، مهم است که تفاوت بین انواع پیکانها را بدانیم. این کار را می‌توان با قرار دادن برچسبی بر آنها یا تغییر ظاهر آنها انجام داد. \begin{example} \begin{displaymath} \xymatrix{ \bullet\ar@{->}[rr] && \bullet\\ \bullet\ar@{.<}[rr] && \bullet\\ \bullet\ar@{~)}[rr] && \bullet\\ \bullet\ar@{=(}[rr] && \bullet\\ \bullet\ar@{~/}[rr] && \bullet\\ \bullet\ar@{^{(}->}[rr] && \bullet\\ \bullet\ar@2{->}[rr] && \bullet\\ \bullet\ar@3{->}[rr] && \bullet\\ \bullet\ar@{=+}[rr] && \bullet } \end{displaymath} \end{example} به تفاوت بین دو دیاگرام توجه کنید: \begin{example} \begin{displaymath} \xymatrix{ \bullet \ar[r] \ar@{.>}[r] & \bullet } \end{displaymath} \end{example} \begin{example} \begin{displaymath} \xymatrix{ \bullet \ar@/^/[r] \ar@/_/@{.>}[r] & \bullet } \end{displaymath} \end{example} تنظیم‌کننده‌های بین دو اسلش روش رسم خم‌ها را مشخص می‌کنند. \lr{\Xy-pic} روش‌های بسیاری را برای تغییر سبک رسم خم‌ها ارائه می‌کند: برای اطلاع بیشتر به راهنمای \lr{\Xy-pic} مراجعه کنید. %%% Local Variables: %%% TeX-master: "lshort.tex" %%% mode: flyspell %%% TeX-PDF-mode: t %%% End: