تبليغاتX
فارسی تک
فهرست مطالب وبلاگ
آخرین بهروز رسانی:
قبلاً با متغیرهای بُعد کاملاً آشنا شدیم و گفتیم که در LaTeX برخی از متغیرهای بعد از قبل تعریف شده‌اند. یکی از این متغیر‌های بُعد، textwidth\ می‌باشد که اندازه پهنای سند را تعیین می‌کند. اگر این متغیر قبل از دستور {begin{document\ تعیین شود، پهنای سند همان مقداری که برای این متغیر در نظر گرفته‌ایم خواهد بود. ولی اگر بعد از این دستور مقدار آنرا تغییر دهیم، هیچ تاثیری بر پهنای سند ندارد.

چون textwidth\ یک متغیر بعد است، و در مورد نحوه مقدار دهی آنها قبلاً به طور مفصل بحث شد، نیاز به ذکر دوباره نحوه این کار نیست.

در کدهای زیر، پهنای سند ، 100pt تعیین می‌شود.

>\documentstyle[farsi]{book}
>\textwidth 100pt
>\begin{document}
متن مورد نظر
>\end{document}

نکته: مقدار textwidth\ برای سند‌های مختلف، متفاوت است. به همین علت مقدار پیش‌فرض مشخصی نمی‌توان برای آن بیان کرد.

نکته‌ای دیگر که ذکر آن ضروری به نظر می‌رسد این است که مقدار textwidth\ در محیط minipage به طور خودبه‌خودی تغییر می‌کند و مقدار آن برابر با پهنای آن محیط می‌شود.
برای مثال دستور‌های زیر را در نظر بگیرید:

>\newdimen\ttextwidth
>\begin{minipage}{15000sp}\global\ttextwidth=\textwidth\end{minpage}
>\english
>\number \ttextwidth \\
>\number \textwidth
>\farsi

مشاهده می‌کنید که بعد از اجرای دستور‌های بالا در ابتدا عدد 15000 و سپس عددی متفاوت با عدد اولی چاپ می‌شود. در صورتی که مقدار ttextwidth\ را برابر مقدار textwidth\ در نظر گرفتیم. این به خاطر این است که این مقدار دهی در محیط minipage انجام گرفته است و مقدار textwidth\ در این محیط برابر با پهنای محیط می‌شود.

توجه داشته باشید که textwidth\ با linewidth\ فرق می‌کند. تفاوت آن در صفحه‌های چند ستونی و جعبه‌های تولید شده با دستور parbox\ مشخص می‌شود. اما در بیشتر موارد این دو با هم برابرند.

+ نوشته شده توسط SuB در چهارشنبه سی و یکم مرداد 1386 و ساعت 13:24 |
در این پست تنها یک نکته را می‌گویم. وقتی شما دستورهایی جدیدی را در فارسی تک تعریف می‌کنید، ممکن است کلیه این دستور‌ها را در یک خط بنویسید. ولی زمانی فرا می‌رسد که به دلیل حجم بالای کد یا برای خوانایی بیشتر، مجبور هستید کد‌های مربوط به یک دستور را در چندین خط بنویسید. در این صورت باید به یک نکته توجه داشته باشید و آن این است که وقتی شما از یک خط به خط دیگر می‌روید، این تغییر خط، یک فاصله محسوب می‌شود. در تاپپ کردن وقتی به پایان سطر در محیط ویرایشگر رسیده‌اید، وقتی بدون گذاشتن فاصله به خط بعد رفته‌اید، در پایان در خروجی مشاهده کرده‌اید که بین آخرین کلمه یک سطر و اولین کلمه سطر بعدی، یک فاصله قرار داده شده است. این در صورتی است که شما هیچ‌گونه فاصله‌ای نگذاشته‌اید. در کد‌های یک دستور هم همین قاعده وجود دارد. برای جلوگیری از این فاصله اضافی باید در پایان سطر علامت ٪ به معنی توضیحات را قرار دهید. در این صورت دیگر فاصله‌ای بین کد‌های یک آن سطر و سطر بعدی گذاشته نخواهد شد. توجه: اگر شما هم مثل من از ++NotePad برای تایپ کد‌ها استفاده می‌کنید، بعد از هر ٪ که در پایان سطر قرار می‌دهید، یک فاصله نیز بگذارید. این کار هیچ تاثیری بر خروجی ندارد و این کار را باید انجام دهید چون اگر این فاصله را نگذارید، این ویرایشگر سطر بعدی را جزء توضیحات محسوب می‌کند و این برای تایپ کردن دستورات در این محیط نا‌خوش‌آیند است.
+ نوشته شده توسط SuB در سه شنبه سی ام مرداد 1386 و ساعت 13:15 |

متغیرهای بُعد، نوعی از متغیرها در فارسی تک هستند که وظیفه نگهداری اندازه ها را بر عهده دارند. این متغیرها به غیر از اندازه،  واحد را هم نگهداری می کنند. این مقدمه ای است برای مطرح کردن مبحث متغیرهای بُعد در فارسی تک.


تعریف متغیرهای بُعد:

متغیرهای بُعد به صورت زیر تعریف می شوند:

\newdimen \dimname

که در آن dimname نام متغیر بُعدی است که قصد تعریف آنرا داریم. این نام نباید نام دستور یا متغیر بُعدی باشد که قبلاً تعریف شده است. توجه داشته باشید که باید در هنگام تعریف متغیر بُعد، حتماً علامت \ را بکار بریم. این نام همچنین نمی تواند همراه عدد باشد.


مقدار دهی به متغیرهای بُعد:

پس از تعریف متغیر بُعد، نوبت به مقدار دهی آن می رسد. مقدار دهی آن به صورت زیر انجام می گیرد:

>\dimname value

که dimname نام متغیر بُعدی است که قبلاً تعریف کرده اید. value نیز مقدار آن است. این مقدار می تواند هر عدد حقیقی ( و شاید مختلط) باشد ولی باید حتماً همراه با واحد اندازه گیری باشد. این واحدها، یکی از واحدهای شناخته شده در فارسی تک هستند. توجه داشته باشید که اگر می خواهید مقدار این متغیر را برابر صفر قرار دهید، با وجود اینکه برای عدد صفر، واحد معنی ندارد، باید حتماً واحد ذکر شوند. برای مثال دو دستور زیر ابتدا یک متغیر بُعد تعریف کرده و سپس مقدار آنرا برابر صفر قرار می دهد:

>\newdimen \mydim
>\mydim 0pt

توجه داشته باشید که می توانید در بین نام متغیر و مقدار آن علامت = را قرار دهید. این کار تنها باعث خوانایی می شود. یعنی دو دستور زیر با دو دستور بالا معادل هستند:

>\newdimen \mydim
>\mydim
= 0pt

وقتی شما مقداری به یک متغیر بُعد می دهید، آن مقدار تبدیل به واحد sp می شود و در متغیر ذخیره می شود.
قبلاً دستور number\ معرفی شد و گفتم که این دستور کمک شایانی در مورد متغیرهای بُعد می کند. مثلاً در همین جا برای اینکه نشان دهیم مقدار ذخیره شده در متغیرهای بُعد به واحد sp تبدیل می شود، از همین دستور استفاده می کنیم. کدهای زیر را در ویرایشگر فارسی تک تایپ و سپس آنرا اجرا کنید: (به تحلیل آن دقت کنید)

>\documentstyle[farsi]{report}
>\newdimen \mydim
>\begin{document}
>\english
>\mydim = 1pt
>\number \mydim\\
>\mydim = 1sp
>\number \mydim\\
>\mydim = 1pc
>\number \mydim
>\farsi
>\end{document}

خط اول که برای همه ما آشناست. خط دوم نیز طبق آنچه گفته شد، یک متغیر بُعد جدید تعریف می کند. دستور سوم نیز نیاز به توضیح ندارد. در خط چهارم از دستور english\ استفاده شده است چون دستور number\ با اعداد فارسی کمی مشکل دارد و آنها را به صورت وارونه چاپ می کند. دستور به کار رفته در این خط سبب می شود که اعداد به صورت انگلیسی به خروجی بروند و مشکلی در خواندن اعداد پیش نیاید. در خط پنجم مقدار متغیر تعریف شده را برابر 1pt قرار می دهیم. در خط ششم، مقدار آنرا چاپ می کنیم. توجه داشته باشید که mydim\ خود یک عدد است پس می تواند به عنوان آرگومان دستور number\ به کار رود. حال اگر به خروجی مراجعه کنید، مشاهده می کنید که در ابتدا عدد 65536 چاپ شده است. در صورتی که ما مقدار 1 و واحد pt را وارد کرده بودیم. این خروجی نشان می دهد که مقدار موجود در متغیر بر حسب pt نیست. اگر به جدول اندازه های فارسی تک مراجعه کنید، می بینید که 1pt معادل 65536sp است. که همین مقدار در خروجی چاپ شده است. در خط هفتم مقدار متغیر برابر 1sp قرار می گیرد و در خط بعدی، مقدار آن به خروجی می رود. که مشاهده می کنید که عدد 1 در خروجی چاپ شده است. دو خط بعدی نیز دارای خروجی 786432 هستند. اگر محاسبه کنیم، خواهیم دیده که 1pc برابر همین مقدار sp است. پس می توان نتیجه گرفت که اندازه های داده شده تبدیل به واحد sp شده و در متغیر ذخیره می شوند.

نکته: مقدار داده شده به متغیر‌های بُعد به صورت محلی عمل می‌کنند. یعنی اگر مقدار دهی به یک متغیر بُعد درون بلاک قرار گیرد، آنگاه مقدار داده شده برای آن بلاک معتبر است. برای مثال دستور‌های زیر را در نظر بگیرید:

>\newdimen\mydim
>{\mydim = 1sp}
>\number \mydim

انتظار می‌رود که خروجی یک باشد ولی خروجی صفر است. چون مقدار دهی به متغیر درون بلاک انجام گرفته و برای همان بلاک معتبر است. برای اینکه این مقدار برای تمام سند معتبر باشد، باید دستور global\ را قبل از مقدار دهی استفاده کنیم.
 با اجرای دستور‌های زیر، مقدار یک چاپ می‌شود.

>\newdimen\mydim
>{\global\mydim = 1sp}
>\number mydim


استفاده از متغیرهای بُعد:

حال نوبت به استفاده از متغیرهای بُعد می رسد.
این متغیرها را می توان در هر جایی از برنامه که نیاز به مقدار به همراه واحد دارد به کار برد. مثلاً در دستور vspace\ یا به عنوان آرگومان اندازه محیط minipage و یا ... .
همانطور که قبلاً گفته شد، متغیرهای بُعد، واحد را در خود ذخیره می کنند. به همین علت نیازی به ذکر واحد در هنگام قرار دادن آنها به عنوان آرگومان دستور یا محیط نیست. (به مثال مراجعه کنید.)

مثال : در این مثال قصد داریم محیط minipage جدیدی برای خودمان تعریف کنیم. این کار الزامی نیست و فقط برای آشنایی دوستان با متغیرهای بُعد، این کار را انجام می دهیم. کدهای آن عبارتند از:

>\documentstyle[farsi]{report}
>\newdimen \myminipagewidth
>\myminipagewidth = 0pt
>\newenvironment{myminipage}{\begin{minipage}[t]{\myminipagewidth}}{\end{minipage}}
>\begin{document}
>\myminipagewidth = 100pt
>\begin{myminipage}
متن مورد نظر
>\end{myminipage}
>\end{document}

این محیط جدید به گونه ای طراحی شده است که پهنای آن توسط متغیر بُعد myminipagewidth\ تعیین می شود. همانطور که مشاهده می کنید، در خط چهارم، خود متغیر به عنوان آرگومان محیط minipage به آن ارسال شده است و واحدی به همراه آن ذکر نشده است.


در پایان باید ذکر کنم که topmargin\ و  oddsidemargin\  و ... همگی متغیرهای بُعد محسوب می شوند که در فایل latex.tex (فایل اصلی LaTeX 2.09 ) تعریف شده اند.

نیاز به مثال اضافی احساس نمی شود. در صورت نیاز در قسمت نظرات مطرح فرمایید.

+ نوشته شده توسط SuB در پنجشنبه بیست و پنجم مرداد 1386 و ساعت 23:41 |

دستوری که در این پست قصد معرفی ان را دارم، دستوری برای چاپ اعداد به فرم فارسی یا انگلیسی در فارسی تک است. این دستور شاید به تنهایی کاربرد نداشته باشد ولی در یکی از پست های آینده که در مورد متغیرهای بٌعد در فارسی تک است بسیار کارآمد خواهد بود.

شکل کلی این دستور به صورت زیر است:

>\number num

که در این دستور num همان عددی است که می خواهید در خروجی چاپ شود. توجه کنید که این دستور از سری دستورهایی است که نیاز به آکولاد ندارد. یعنی باید به همین شکلی که در بالا نوشته شده است، تایپ شود.
توجه داشته باشید که num باید یک عدد باشد و نمی تواند شمارنده یا متغیر نوع یا هر چیز دیگری باشد.
اگر بخواهیم مقدار شمارنده mycounter را در خروجی چاپ کنیم، یکی از راههایی که پیش رو داریم، استفاده از دستور زیر است:

>\number \value{mycounter}

قبلاً گفتیم که mycounter یک عدد نیست ولی دستور value\ یک عدد تولید می کند. همچنین نمی توان از دستور arabic\ استفاده کرد. چون این دستور فقط مقدار را به خروجی می برد و عدد تولید نمی کند.

در پست مربوط به متغیرهای بُعد خواهید دید که این دستور چقدر کار را راحت می کند.

نکته: اینکه خروجی تولید شده در این دستور، یک عدد فارسی باشد یا انگلیسی، بستگی به محیط خط این دستور ندارد. اگر می خواهید خروجی به صورت اعداد انگلیسی باشد، باید از دستور english\ قبل از این دستور استفاده شود تا فونت جاری برای اعداد در فارسی تک، به فونت انگلیسی تغییر یابد و خروجی، اعداد انگلیسی باشند. در واقع این دستور اعداد را با همان فونتی که برای چاپ اعداد جاری در فارسی تک تعریف شده است، به خروجی می برد.

نیازی به مثال برای این پست احساس نمی شود. در صورت نیاز، در قسمت نظرات مطرح نمایید.

+ نوشته شده توسط SuB در چهارشنبه بیست و چهارم مرداد 1386 و ساعت 14:23 |
سلام. امروز با آموزش نحوه ی نصب FarsiTeX بر روی MiKTeX 2.5 و نکاتی از اون در خدمت شما هستیم.

 

نحوه ی نصب فارسی تک روی MiKTeX 2.5

مراحل زیر رو بپیمایید:

۱) ابتدا MiKTeX 2.5 رو از اینجا دانلود و بعدش اون رو نصب کنید.

۲) فایل FarsiTeX.zip رو از اینجا دانلود و بعد از دانلود به یه جای دلخواه unzip کنید.

۳) تو فایلی که unzip کردید، فایلها به شیوه ی شاخه بندی MiKTeX، شاخه بندی شدن. پس باید طبق ساختاری که می بینید، فایلهای unzip شده رو به دایرکتورهای مناسب MiKTeX کپی کنید. مثلا:

دایرکتوری مبداء فایلهای unzip شده

دایرکتوری مقصد در MiKTeX

FarsiTeX\MiKTeX 2.5\miktex\bin

MiKTeX 2.5\miktex\bin

FarsiTeX\MiKTeX 2.5\fonts\enc\dvips\farsitex

MiKTeX 2.5\fonts\enc\dvips\farsitex

 

۴)  بعد از اتمام این کارا، در منوی Run دستور mo رو اجرا کنین. به منوی General رفته و روی دکمه ی Refresh FNDB کلیک کنید و چند دقیقه صبر کنید تا MiKTeX به روز شه.

۵) بعد از اتمام این کار، به منوی Formats رفته و رو دکمه ی New کلیک کنید. تو پنجره ای که باز میشه، طبق جدول زیر جاهای خالی رو پر کنین:

FarsiTeX

Format Name:

pdfetex

Compiler:

farsitex.ini

Input File Name:

farsitex.efmt

Output File Name:

<این قسمت رو خالی بذارین>

Preloaded Format:

FarsiTeX

Description

 

۶) بعد از زدن OK تو این قسمت، تو لیست فرمتها رو FarsiTeX، تک کلیک کنین و دکمه ی Build رو فشار بدین.

۷) تو منوی Run، دستور cmd رو اجرا کنین و تو پنجره ی داسی که باز میشه دستور

initexmf --mkmaps رو اجرا کنین.

۸) فایل FarsiTeX.fon رو که تو فایلهای دانلود شده موجوده به دایرکتوری Windows\Fonts کپی کنید.

فارسی تک رو MiKTeX 2.5 نصب شده.

 

نکاتی درباره ی فارسی تک

۱) تو نام برخی از ماکروهای تغییراتی داده شده تا با اسم های نسخه های LaTeX2e هم اسمشون قاطی نشن. تو جدول زیر لیستشون کردم. این تغییرات رو باید لحاظ کنین(مثلا هنگام استفاده از دستور documentstyle\ )

نام قدیمی ماکرو

نام جدید ماکرو

article.sty

oldarticle.sty

report.sty

oldreport.sty

book.sty

oldbook.sty

slides.sty

oldslides.sty

epsf.tex

oldepsf.tex

 

۲) از این به بعد، بعد اجرای فارسی تک، فایل pdf خواهید داشت نه فایل dvi. بنابراین اگه رو شکلک View تو ویرایشگر فارسی تک کلیک کنین با پیغام خطا روبرو میشین.

۳) هر بار که تو فایل فارسی تک تون تغییری ایجاد می کنین، قبلش فایل خروجی تون رو ببندین، بعد کامپایل کنین.

۴) از این به بعد برای گذاشتن عکس، بعد از فراخوانی ماکروی fgraphix.sty (در دستور documentstyle\  و در درون []) طبق جدول زیر عمل کنین:

عکسهای به فرمت jpeg

عکسهای به فرمت pdf

{filename.jpg}includegraphics\

{filename}includeepspdf\

دقت کنین که در \includeepspdf، عبارت filename، بدون پسوند pdf است.

نسخه ی pdf راهنمای نصب رو از اینجا بارگیری کنین.

موفق باشید...

 

+ نوشته شده توسط وحید در سه شنبه بیست و سوم مرداد 1386 و ساعت 17:42 |

 شما در فارسی تک قادر هستید شرط‌‌های جدیدی برای خود بسازید. برای ساختن شرط جدید باید از دستور زیر استفاده کرد.

>\newif\ifname

در این دستور ما شرط جدیدی با نام name تعریف کرده‌ایم. معمولاً نام شرط جدید را با @ شروع می‌کنند. البته وجود یا عدم وجود علامت @ هیچ خطایی را دربر ندارد و تنها سبب خوانایی می‌شود. ما نیز از همین روش استفاده می‌کنیم.

شرط‌هایی که بدین طریق معرفی می‌شوند می‌تواند true یا false باشند. به طور پیش‌فرض، هر شرطی که تعریف شود، دارای false است. برای قرار دادن شرط name@ برابر true باید از دستور زیر استفاده کرد:

>\@nametrue

و برای قرار دادن مقدار شرط name@ برابر false باید از دستور زیر استفاده کرد:

>\@namefalse

توجه: نامی که برای شرط انتخاب می‌کنید، می‌تواند به false یا true ختم شود. با وجود اینکه این کار سبب هیچ مشکلی نمی‌شود، ولی برای خوانایی کدهای نوشته شده بهتر است از این کار پرهیز کنید.

برای استفاده از شرط‌های جدید تعریف شده توسط خودمان، به صورت زیر عمل می‌کنیم:

>\if@name
>True Case Commands
>\else
>False Case Commands
>\fi

name@ نام شرط مورد نظر است. True Case Commands دستوراتی هستند که در صورت true بودن name@ اجرا می‌شوند. False Case Commands نیز دستوراتی هستند که در صورت عدم برقراری شرط اجرا می‌شوند.

کاربرد شرط‌های جدید برای موقعی است که شما دستور یا دستورهایی دارید که فقط باید در یک محیط خاص اجرا شوند. برای جلوگیری از استفاده از این دستور در محیط‌های دیگر، می‌توانید شرط جدیدی تعریف کنید که به شروط محیط true شود و با پایان محیط مقدار آن false شود. و در دستور مورد نظر ابتدا بررسی شود که این شرط برقرار است یا نه. در صورت برقراری شرط، دستور اجرا شود و در غیر این صورت یا اجرا نشود و یا پیغام خطا داده شود.

برای آشنایی بیشتر مثالی می‌گذارم.

مثال:

قصد داریم محیط جدیدی به نام myitemize تعریف کنیم که در آن با دستور myitem، هر عضو این محیط مشخص شود. برای این کار دستورات زیر را به کار می‌بریم.

\newif\if@myitemize
\@myitemizefalse

\newenvironment{myitemize}{\@myitemizetrue}{\@myitemizefalse\par}

\def\myitem{
\if@myitemize
\par\noindent
\hspace{20pt}$*$\hspace{10pt}
\else
\@latexerr{`myitem' command must be used in `myitemize' environment}{}
\fi
}

در خط اول، شرط جدیدی برای نگهداری وضعیت قرار داشتن در محیط myitemize تعریف می‌کنیم. در خط دوم مقدار آنرا برابر false قرار می‌دهیم. درست است که مقدار پیش‌فرض این شرط false است ولی ممکن است در آینده کدهایی را استفاده کنیم، که مقدار پیش‌فرض شرط‌ها را تغییر دهد. در این صورت تا اولین به کار بردن محیط myitemize ، دستور myitem\ درست کار نمی کند. در خط بعدی محیط جدیدی را تعریف می‌کنیم که با شروع خود، مقدار ظرط را true می‌کند. و با پایان خود مقدار شرط را false می‌کند و با جدید کردن پاراگراف به کار خود خاتمه می‌هد.

در خط بعدی دستور myitem\ تعریف می‌شود. در ابتدای دستور بررسی می‌شود که شرط برقرار است یا نه. اگر شرط برقرا باشد، پاراگراف جدید می‌شود و به اندازه 20pt از اول سطر فاصله گذاشته می‌شود. سپس کاراکتر * که نشان دهنده عضو جدید محیط است، چاپ می‌شود. سپس 10pt فاصله گذاشته می‌شود. در صورت عدم برقراری شرط ، با دستور latexerr@\ پیغام خطا دهنده LaTeX (فارسی‌تک)، فراخوانی می‌شود. در اینجا این دستور مهم نیست و فقط قصد من وجود یک دستور برای حالتی که شرط برقرار نیست. (این دستور در پست‌های بعدی معرفی می‌شود)

شرط‌های جدید می‌توانند در موارد دیگر نیز به کار برده شوند. مثلاً شما دستوری دارید که یک در آن دستور دیگری مورد استفاده قرار می‌گیرد. این دستور مورد استفاده خود در فایل دیگری تعریف شده است که باید به سند وارد شود. برای راهنمایی بیشتر برای استفاده کننده‌گاه از این دستور، می‌توانید در دستور مورد استفاده ، شرط جدیدی که قبلاً تعریف کرده‌اید یا در همان فایل تعریف می‌کنید، مقدار دهی کنید تا وقتی دستور استفاده کننده از این دستور نوشته می‌شود بررسی کند که شرط برقرا است یا نه. در صورت عدم برقراری شرط، با پیغام خطا به کاربر اعلام کند که نیاز است فایل مورد نظر فراخوانی شود. در این صورت از پیغامهای حطای بعدی که در صورت عدم فراخوانی این فایل حاصل می‌شوند، جلوگیری به عمل آید.

توجه: مقدار دهی به شرط جدید، به صورت محلی عمل می‌کند. یعنی در هر بلاک به شرطی مقدار true یا false دهید، آن مقدار برای همان بلاک معتبر است و با بیرون آمدن از آن بلاک، مقدار شرط به مقدار قبل از بلاک برمی‌گردد. برای معتبر کردن مقدار دهی یک شرط در کل سند از دستور global\ در قبل از مقدار دهی استفاده کنید. برای مثال دستور را به صورت زیر به کار برید تا شرط name@ برابر true در کل سند گردد:

>\global\@nametrue

+ نوشته شده توسط SuB در دوشنبه بیست و دوم مرداد 1386 و ساعت 13:8 |
سلام
از همه دوستان درخواست دارم که توی نظرسنجی شرکت کنند و مشخص کنند که آیا دوست دارند جناب وحدی آموزش MetaPost از پایه رو توی این وبلاگ شروع کنند؟
چون ایشون اعتقاد دارند که توی ایران کسی دنبال MetaPost نیست.

حالا شما باید ثابت کنید که ایشون اشتباه فکر می‌کنند.
+ نوشته شده توسط SuB در شنبه بیستم مرداد 1386 و ساعت 22:42 |
 قبلاً گفتیم که در فارسی تک می‌توان با استفاده از دستور ifnextchar@\ ، دستور با آرگومان اختیاری تعریف کرد.

مثلاً شما می‌خواهید دستوری داشته باشید که دارای دو آرگومان است. آرگومان اول اجباری و آرگومان دوم اختیاری است. (مانند دستور newcounter\) این دستور را my\ در نظر می‌گیریم. تعریف کردن این دستور به [def\my#1[#2\ سبب می‌شود که مجبور شوید در هنگام به کار بردن دستور my\ علاوه بر ذکر آرگومان اول و آرگومان دوم، آرگومان دوم را درون یک جفت قلاب ([]) قرار دهید. پس با این کار دستور my\ یک دستور با دو آرگومان اجباری است.
برای رسیدن به این مقصود، ابتدا دستور
my\ را یک دستور یک آرگومانی تعریف می‌کنیم. سپس با استفاده از دستور ifnextchar@\ بررسی می‌کنیم که کاراکتر بعد از آرگومان اول my\ ، کاراکتر ] است یا نه. اگر کاراکتر بعد از آرگومان اول، علامت ] بود، آنگاه دستوری را فراخوانی می‌کنیم که به دو آرگومان اجباری نیاز دارد که آرگومان دوم آن باید درون یک جفت قلاب قرار گیرد.
درست است که این روش به نوعی گول زدن فارسی تک است ولی بدانید که در
LaTeX 2.09 از همین روش استفاده شده است. پس روش خوبی است.

برای فهم بیشتر مطالب به بیان چند مثال می‌پردازم:


مثال 1:
در این مثال دستوری را معرفی ‌می‌کنیم که یک فرمول را بگیرد و در پاراگراف جدید آنرا قرار دهد و شماره گذاری برای آن انجام دهد. اما هر وقت که ما می‌خواهیم، شماره‌ای که به دستور می‌دهیم را به عنوان شماره فرمول چاپ کند. ابتدا کدهای زیر را می‌نویسیم (چه در فایل سبک و چه در فایل سند)

\newcounter{formulacounter}

\def\printformula#1{
    \@ifnextchar [ {\@printformula{#1}}
    {\stepcounter{formulacounter}\@printformula{#1}[\arabic{formulacounter}]}
}

\def\@printformula#1[#2]{\par\noindent\beginL $#2\,)\ \ #1$\par}

حال در هر کجای سند که بخواهیم، با استفاده از دستور [printformula{formula}[number\ می‌توانیم فرمول formula را با شماره number که در سمت چپ کاغذ قرار می‌گیرد، چاپ کنیم.

اما دستوراتی که پیرامون تعریف دستور printformula\ به کار برده‌ایم. دستور printformula@\ به عنوان دستوری دو آرگومانی با دو آرگومان اجباری تعریف شده است که آرگومان دوم آن باید بین دو قلاب قرار گیرد. در خط اول شمارنده formulacounter را برای نگهداری شماره آخرین فرمول داده شده، تعریف می‌کنیم. در خط بعدی،  printformula\ را یک دستور با یک آرگومان اجباری تعریف می‌کنیم. در خط بعدی بررسی می‌شود که اولین کاراکتر بعد از آرگومان اول printformula\ ، کاراکتر ] که به معنی شروع آرگومان اختیاری است، می‌باشد یا خیر. اگر شرط برقرار باشد، دستور printformula@\ به صورت {printformula{#1@\ فراخوانی می‌کنیم. ( بهتر است این دستور به همین صورت فراخوانی شود. یعنی 1# بین دو آکولاد قرار گیرد) در این صورت خود دستور printformula@\ آرگومان دوم را برداشت می‌کند و آرگومان دوم دیگر در خروجی بدون اینکه ما بخواهیم، چاپ نمی‌شود. در خط بعدی، دستوراتی را تعیین می‌کنیم که در صورت عدم برقراری شرط باید اجرا شوند. در ابتدا یک واحد به مقدار شمارنده نگهدارنده شماره فرمول اضافه می‌کنیم. سپس دستور prinformula@\ را فراخوانی می‌کنیم ولی با این تفاوت که در این حالت، آرگومان دوم را خودمان تعیین می‌کنیم.


مثال 2:
این مثال همان مثال 1 است ولی با این تفاوت که در این مثال، آرگومان اول
printformula\، یک آرگومان اختیاری است و آرگومان دوم آن یک آرگومان اجباری. کدهایی که برای تعریف آن به کار میِ‌روند عبارتند از:

\newcounter{formulacounter}

\def\printformula{
    \@ifnextchar [ {\@printformula}
    {\stepcounter{formulacounter}\@printformula[\arabic{formulacounter}]}
}

\def\@printformula[#1]#2{\par\noindent\beginL $#1\,)\ \ #2$\par}

در هر کجای سند که بخواهیم فرمول را چاپ کنیم، باید از دستور {printformula[number]{formula\ استفاده کنیم. همانطور که مشاهده می‌کنید در هنگام فراخوانی دستور printformula\ از دو آرگومان استفاده کرده‌ایم ولی در هنگام تعریف، برای آن هیچ آرگومانی تعریف نکرده‌ایم! این بدین خاطر است که در تعریف دستور printformula\ ابتدا بررسی می‌شود که اولین کاراکتر پس از این دستور، کاراکتر ] است یا نه. اگر شرط برقرار باشد، دستور printformula@\ که آرگومان اول آن باید درون یک جفت قلاب قرار گیرد و آرگومان دوم آن اجباری است، فراخوانی می‌شود. در این حالت خود دستور printformula@\ آرگومان اول و دوم خود را برمی‌دارد. در صورت عدم برقراری شرط، آرگومان اول توسط ما تعیین می‌شود و آرگومان دوم توسط دستور printfoemula@\ برداشته می‌شود.


شما بر حسب نیاز خود می‌توانید دستوراتی تعریف کنید که آرگومان اختیاری آن در وسط، اول و آخر آن باشند. این کار به همین سادگی که در دو مثال قبلی آمده است، صورت می‌گیرد.
البته اگر می‌خواهید دیگر مجبور نباشید این کدها را برای ایجاد آرگومان اختیاری بنویسید، می‌توانید دستور جدیدی برای ایجاد دستور جدید تعریف کنید. (همانطور که در دستور
newcommand\ در LaTeX 2ε بازنگری صورت گرفته است و امکان داشتن آرگومان اختیاری به عنوان اولین آرگومان یک دستور، در آن گنجانده شده است)

در پایان این نکته را ذکر می‌کنم که دستور bgroup\ معادل شروع بلاک و دستور egroup\ معادل انتهای بلاک است. چون در دستور ifnextchar@\ امکان استفاده از { و } به عنوان آرگومان اول این دستور نیست، می‌توان به جای { و } که مشخص کننده ابتدا و انتهای بلاک هستند، از دو دستور معادل آنها استفاده کرد. پس شما می‌توانید دستورهایی تعریف کنید که آرگومان اختیاری داشته باشند ولی آرگومان اختیاری آنها بین { و } قرار گیرد! البته این کار پیشنهاد نمی‌شود.

+ نوشته شده توسط SuB در جمعه نوزدهم مرداد 1386 و ساعت 15:1 |
 در یکی از پست‌های قبلی به روش وارد کردن یک فایل در سند پرداختیم و گفتیم که برای نوشتن حروف فارسی باید با روش آزمون و خطا عمل کرد. دوست عزیزمان جناب مصطفی، روشی ارائه کردند که نیازی به آزمون و خطا ندارد و دقیق است.

این روش توسط جناب مصطفی ارائه شده است.

روش کار به این صورت است که شما فایلی که می‌خواهید در سند وارد کنید را در ویرایشگر فارسی‌تک نوشته و سپس در ویرایشگر نسخه 10.0 از منوی Run گزینه Convert FTX to TeX را انتخاب می‌کنید یا اینکه کلید‌های ترکیبی Ctrl + F7 را فشار می‌دهید. در این صورت عبارات فارسی به فرمت مناسب تبدیل می‌شوند.

در صورتی که این گزینه در ویرایشگر شما موجود نیست، می‌توانید از فایل ftx2tex.exe که در مسیر miktex\miktex\bin\... موجود است، این تبدیل را انجام دهید.

البته پیشنهاد من به شما این است که فقط متن‌های فارسی که می‌خواهید این کار را بر روی آنها انجام دهید، در محیط ویرایشگر فارسی‌تک نوشته و به فرمت تک تبدیل کنید. و سپس از فایل تبدیل شده Copy کرده و در فایلی که می‌خواهید وارد سند خود کنید، Paste کنید. این بدان دلیل است که محیط ویرایشگر فارسی‌تک، دارای رنگ نوشته و زمینه مناسبی نیست و همچنین این ویرایشگر مانند برخی ویرایشگر‌های دیگر، وقتی بر روی علائمی همچون آکولاد که جفت هستند، قرار می‌گیرید، زوج آنها را مشخص نمی‌کند. در این صورت شما نمی‌دانید که آکولادی که باز کرده‌اید را بسته‌اید یا نه. که در این صورت با پیغامهای متعدد در هنگام اجرای سند مواجه می‌شوید.


در همان پست گفتم که در سند فارسی‌تک نمی‌توان دستورهایی که همراه با علامت @ هستند را به کار برد. در این مورد نیز جناب مصطفی روشی ارائه کردند که می‌توان در سند نیز با این دستورات کار کرد.


این روش توسط جناب مصطفی ارائه شده است.

قبل از دستور یا دستورهایی که همراه با علامت @ هستند، دستور makeatletter\ را به کار ببرید. پس از نوشتن دستور یا دستورهایی که حاوی @ هستند، دستور makeatother\ را به کار ببرید.


البته اگر دستور makratother\ نوشته نشود، ایجاد مشکل نمی‌کند ولی شما تا پایان سند خود قادر هستید از دستورهای حاوی @ استفاده کنید.

اما در مورد پستی که در مورد دستور def\ زده شد. باید بگم که دستور def\ به صورت محلی عمل می‌کند. اگر شما تعریف دستوری را درون یک بلاک تغییر دهید، آن تعریف برای همان بلاک معتبر است. هر بلاک با { یا bgroup\ شروع و با } یا egroup\ پایان می‌یابد.

دستورهای زیر را در نظر بگیرید:

>\documentstyle[farsi]{report}
>\begin{document}
>\english
>\def\curnum{0}
>\curnum
>{\def\curnum{1}}
>\curnum
>\end{document}

پس از اجرای سند خواهید دید که در ابتدا یک صفر و سپس صفر دیگری چاپ شده است. این در صورتی است که انتظار می‌رفت که ابتدا عدد صفر و سپس عدد یک چاپ شود. این بدین خاطر است که دستور def\ به صورت محلی عمل می‌کند. در خط ششم دستور def\ در یک بلاک قرار گرفته است. پس تعریف صورت گرفته در همان بلاک معتبر است.

برای اینکه تعریف صورت گرفته در بلاک را برای کل سند معتبر کنیم، باید از دستور gdef\ به جای دستور def\ استفاده کنیم. همچنین دستور global\def\ معادل دستور gdef\ است. برای مثال اگر کدهای بالا را به صورت زیر بازنویسی کنیم، ابتدا عدد صفر و سپس عدد یک تولید می‌شود.

>\documentstyle[farsi]{report}
>\begin{document}
>\english
>\def\curnum{0}
>\curnum
>{\def\curnum{1}}
>\curnum
>\end{document}

+ نوشته شده توسط SuB در پنجشنبه هجدهم مرداد 1386 و ساعت 13:51 |

سلام

نظر یادتون نره


در این پست قصد دارم به معرفی یکی دیگر از دستورات شرطی در FarsiTeX بپردازم.

این دستور، ifnextchar@\ می‌باشد. شکل کلی این دستور به صورت زیر است:

\@ifnextchar X{Yes Case}{No Case}

این دستور اگر در دستور دیگری قرار گیرد، بررسی می‌کند که بعد از کلیه آرگومانهای آن دستور، کاراکتر X وجود دارد یا نه. اگر چنین کاراکتری وجود داشت، دستورات موجود به جای Yes Case را اجرا می کند و در غیر این صورت، دستورات موجود به جای No Case را اجرا می‌کند. توجه داشته باشید که X نمی‌تواند برخی از کاراکتر‌ها  از جمله } یا { یا \ باشد. همچنین از کلیه فاصله‌‌های بین آخرین آرگومان دستور و کاراکتر مورد نظر، صرف‌نظر می‌شود.

توجه: دستور ifnextchar@\ برخلاف دستور ifnum\ نیاز به fi\ ندارد.

در اینجا چند مثال برای آشنایی بیشتر با این دستور می‌گذارم:


مثال 1:
در این مثال، دستور ifnextchar@\ در دستور دیگری که بدون آرگومان است قرار می‌گیرد. ابتدا در یک فایل sty دستور زیر را تایپ کنید و فایل را ذخیره نمایید:

\newcommand{\my}{\par\@ifnextchar[ {\IE{true}}{\IE{false}}}

سپس دستورات زیر را در سند خود تایپ کنید:

>\documentstyle[farsi,mystyle]{report}
>\begin{document}
>\my
>\my[
>\my]
>\end{document}

با اجرای سند مشاهده می‌کنید که حاصل خط سوم و پنجم، عبارت false در خروجی است و حاصل خط چهارم، عبارت true در خروجی است. این بدین خاطر است که در دستور my\ شرط کرده‌ایم که اگر کاراکتر بعد از این دستور، کاراکتر ] بود، عبارت true و در غیر این صورت عبارت false را چاپ کند. توجه داشته باشید که ifnextchar@\ فقط کاراکتر را بررسی می‌کند و از چاپ شدن آن در خروجی جلوگیری نمی‌کند.


مثال 2:
در این مثال دستور به نحوه استفاده از ifnextchar@\ در دستور یک آرگومانی پرداخته می‌شود. ابتدا دستور زیر را در یک فایل سبک (با پسوند sty) ذخیره کنید:

\newcommand{\my}[1]{\par-#1-\@ifnextchar[ {\IE{true}}{\IE{false}}}

اکنون دستورهای زیر را در سند خود تایپ کنید:

>\documentstyle[farsi,mystyle]{report}
>\begin{document}
>\english
>\my[{3}[
>\my{4}[
>\my[]
>\end{document}

با اجرای دستورهای بالا، مشاهده می‌کنید که تنها خط پنجم تولید عبارت true می‌کند و در بقیه موارد حاصل عبارت false است. این بدین خاطر است که باید پس از کلیه آرگومانها، کاراکتر ] قرار گیرد و در خط پنجم این حالت وجود دارد.
توجه داشته باشید که برای این کار، باید دستور ifnextchar@\ آخرین دستور در دستور جدید باشد تا وجود یا عدم وجود کاراکتر ] را بعد از کلیه آرگومانهای دستور بررسی کند. در غیر این صورت نتیجه مطلوب به وجود نمی‌آید.


دستور ifnextchar@\ بیشتر برای ساختن آرگومان اختیاری برای دستورها به کار می‌رود. روش ساختن آرگومانهای اختیاری در پست‌های بعدی مطرح می‌شود.

+ نوشته شده توسط SuB در چهارشنبه هفدهم مرداد 1386 و ساعت 13:51 |
 قبلاً با دستورهای تولید محیط و دستور جدید آشنا شدیم. با اطلاعات فعلی، شما نمی توانید محیط یا دستوری بنویسید که هوشمند باشد. یعنی  به جای اینکه شما مثلاً سه دستور تعریف کنید که سه کار شبیه به هم انجام دهند ولی در چند دستور با هم اختلاف دارند، یک دستور تعریف می کنید و آرگومانی را برای تشخیص اینکه کدام نوع مد نظر شماست، در نظر بگیرید.
هوشمند سازی دستورها و محیط ها تنها با دستورات شرطی و حلقه ها صورت می گیرد. در این پست قصد نداریم به حلقه ها در فارسی تک بپردازیم و در این پست تنها یک نوه از شرطها را در فارسی تک بررسی می کنیم.

در فارسی تک مانند زبانهای برنامه نویسی می تواند اجرا یا عدم اجرای برخی دستورها را مشروط کنید. یعنی اینکه در صورتی که شرایط فراهم باشد، یکسری دستورها انجام گیرد و اگر شرایط فراهم نباشد، یک سری دستورهای دیگر انجام گیرد.
تنها تفاوت شرط در فارسی تک با شرط در زبانهای برنامه نویسی در این است که در زبانهای برنامه نویسی، تنها یک دستور برای کنترل اینکه شرط برقرار است یا نه، به کار می رود. ولی در فارسی تک، برای مقایسه هر چیزی، دستور مخصوصی وجود دارد. مثلاً برای مقایسه اعداد، یک دستور وجود دارد و یا برای مقایسه ابعاد دستوری دیگر. که این دستورات نمی توانند در جای یکدیگر واقع شوند. در این پست فقط به بررسی دستور مقایسه اعداد که یکی از ساده ترین انواع است می پردازیم.

شکل کلی دستور برای مقایسه اعداد به صورت زیر است:

>\ifnum عبارت شرطی
>مجموعه دستوراهایی که باید در صورت درست بودن عبارت شرطی اجرا شوند
>\else
>
مجموعه دستورهایی که باید در صورت نادرست بودن عبارت شرطی اجرا شوند
>\fi

عبارت شرطی، همان موردی است که می خواهید درستی یا نادرستی آن مورد بررسی قرار گیرد. که خود به صورت زیر نوشته می شود:

عدد دوم عملگر عدد اول

عدد اول، یکی از دو عددی است که می خواهید مقایسه شوند. عدد دوم نیز عدد دیگری است از همان دو عددی است که می خواهید مقایسه شوند. عملگر نیز یکی از نمادهای = (برای اینکه مقایسه کند که عدد اول با عدد دوم برابر است یا نه) ،  > (برای اینکه مقایسه کند عدد دوم از عدد اول بزرگتر است یا نه) و  < (برای اینکه مقایسه کند عدد اول بزرگتر از عدد دوم است یا نه) می باشد. برای مثال می توان نوشت 2=2 یا 3>2 یا 3<4.

مجموعه دستورهای که در صورت درست بودن یا درست نبودن عبارت شرطی اجرا می شوند، می توانند هر دستوری باشند. حتی خود می توانند حاوی دستورات شرطی دیگری باشند که در این صورت آنها را شرطهای تودرتو گوییم. در ادامه شرطهای تو در تو و چگونگی نوشتن آنها را ذکر می کنم.

توجه کنید که یک دستور شرطی می تواند حاوی else\ نباشد ولی ذکر ifnum\  و fi\ ضروری است و در صورت حذف آنها به شما پیغام خطا داده می شود.
همچنین عملگری برای مقایسه اینکه دو عبارت نامساوی هستند، وجود ندارد مثلاً اگر بخواهیم مقایسه کنیم که آیا 2 مساوی 3 نیست، عملگری برای این کار وجود ندارد. در این حالت می توان مجموعه کدها را برای حالتی که عبارت شرطی 2=3 است نوشت و جای دستوراتی که باید در صورت برقراری شرط و عدم برقراری شرط اجرا شوند، را عوض کرد. (به مثال مراجعه کنید)

نکته: فارسی تک تا شرط برقرار نشود، دستورات داخل آنرا نه اجرا می کند و نه از لحاظ درستی بررسی نمی کند. مثلاً اگر شما دستوری که نیاز به 2 آرگومان اجباری دارد را درون یک دستور شرطی قرار دهید و به این دستور هیچ آرگومان ارسال نکنید، تا زمانی که شرط برقرار نشود، فارسی تک به شما هیچ خطایی نمی دهد ولی در صورتی که شرط برقرار گردد، فارسی تک به شما پیغام خواهد داد. پس لازم می شود که دستور یا محیط جدیدی که به صورت هوشمند نوشته اید را در حالات مختلف امتحان کنید تا از درستی کدهایی که نوشته اید اطمینان حاصل کنید.

در زیر برای آشنایی بیشتر به بیان چند مثال و توضیح کامل کدهای آن می پردازم:


مثال 1 :

در این مثال قصد داریم دستوری تعریف کنیم که عبارتی را گرفته و در پاراگراف جدید به یکی از صورتهای وسط چین، چپ چین و یا  راست چین چاپ کند. تشخیص اینکه نحوه چیدمان عبارت چگونه باشد، با یک آرگومان تعیین می شود که به ترتیب 0 و 1- و 1 برای وسط چین، چپ چین و راست چین می باشد. تمامی کدهای آن به شرح زیر است:

>\documentstyle[farsi]{report}
>\newcommand{\puttonewpar}[2]{ %#1 is for alignment and #2 is the expression
>    \ifnum #1=0
>    \begin{center}#2\end{center}
>    \fi
>    \ifnum #1=-1
>    \par\beginL#2\par\endL
>    \fi
>    \ifnum #1=1
>    \par\beginR#2\par\endR
>    \fi
>}
>\begin{document}
>\puttonewpar{0}{
این متن وسط چین است}
>\puttonewpar{1}{
این متن راست چین است}
>\puttonewpar{-1}{
این متن چپ چین است}
>\end{document}

این مثال را به شکلهای دیگری هم می توان نوشت. (چه با استفاده از ifnum\  و چه با استفاده از دستورات شرطی دیگر)
شاید بگویید کدهای به کار رفته در اینجا کمی بیشتر از کدهایی است که هنگام تعریف سه دستور می نویسیم! در جواب باید گفت که شاید در این مثال، هوشمند کردن به صرفه نباشد ولی گاهی اوقات نمی توان از هوشمند سازی استفاده نکرد و حتی دو میلیون خط کد هم نمی تواند جای 5 خط کد هوشمند را بگیرد. مثلاً در آینده که با مقایسه ابعاد آشنا می شوید، خواهید دید که با استفاده از مقایسه ابعاد، می توان تنها یک دستور برای قرار دادن گزینه های یک تست تعریف کرد بطوریکه خود دستور تشخیص دهد که آیا باید چهار گزینه را در یک خط قرار دهد یا در دو سطر و یا در چهار سطر
. اگر شما از دستورات شرطی استفاده نکنید، به هیچ وجه نخواهید توانست چنین دستوری بنویسید و مجبور خواهید بود که سه دستور برای این کار منظور کنید و این شما هستید که باید تشخیص دهید از کدام دستور باید استفاده شود. که این کار حداقل از نظر من ناخوش آیند است و احتمال اشتباه در حدس زدن استفاده از کدامین دستور بسیار بالاست و گاهی نمی توان حدس زد که باید از کدام دستور استفاده کرد.

اکنون به بررسی کدهای مثال می پردازیم. خط اول آن که برای هم شناخته شده است. خط دوم نیز با توجه به پستهای قبلی نیاز به توضیح ندارد. اما خطوط بعدی کمی نیاز به توضیح دارند. در خط سوم بررسی می شود که آیا آرگومان اول برابر صفر است یا نه. در صورت صفر بودن بنا به قرار داد که در صورت مثال بیان شد، عبارت مورد نظر که همان آرگومان دوم است، باید در پاراگراف جدید به صورت وسط چین قرار گیرد. در خط ششم بررسی می شود که آرگومان اول برابر 1- است. که در صورت برقراری شرط، باید مثن به صورت چپ چین در پاراگراف جدید قرار گیرد. در خط نهم  نیز بررسی می شود که عدد داده شده برابر یک است یا نه. اگر برابر یک بود، متن باید به صورت راست چین، در پاراگراف جدید قرار گیرد. در خطهای بعدی نیز یک متن را در سه حالت چیدمان، در سند قرار می دهیم.

نکته: قبلاً گفتم که در دستور ifnum\ باید دو عدد مقایسه شوند. ولی معمولاً می خواهیم یک مقدار یک شمارنده و یک عدد را با هم مقایسه کنیم. در این صورت باید از دستور value\ استفاده کنیم. این دستور در پست تعریف شمارنده ها ، کاملاً بحث شد.


شرط‌های تودرتو:

قبلاً گفتم که امکان شرط‌های تودرتو در فارسی‌تک وجود دارد. اما روش استفاده از آنها گفته نشد. در اینجا به این بحث می‌پردازیم. در شرط‌های تودرتو، یک شرط درون شرط دیگر قرار می‌گیرد. برای شرطهای تودرتو، به ازای هر ifnum\ یک fi\ لازم است.

برای آشنایی بیشتر با شرط‌های تودرتو مثال قبلی را با شرط‌های تودرتو بازنویسی می‌کنم:

>\documentstyle[farsi]{report}
>\newcounter{a}
>\newcommand{\puttonewpar}[2]{ %#1 is for alignment and #2 is the expression
>    \ifnum #1=0
>        \begin{center}#2\end{center}
>    \else
>        \ifnum #1=-1
>            \par\beginL#2\par\endL
>        \else
>            \par\beginR#2\par\endR
>        \fi
>    \fi
>}
>\begin{document}
>\puttonewpar{0}{
این متن وسط چین است}
>\puttonewpar{1}{
این متن راست چین است}
>\puttonewpar{-1}{
این متن چپ چین است}
>\end{document}

البته این دستورات با دستورات مثال 1 کمی متفاوت هستند. تفاوت آنها در این است که برای مثال 1 اعداد 1 و 0 و 1- تنها قابل قبول اند ولی برای این مثال، تمامی اعداد صحیح قابل قبول هستند با این تفاوت که به غیر از 0 و 1- ، بقیه اعداد صحیح در حکم عدد 1 هستند یعنی با ارسال آنها به عنوان آرگومان اول، متن راست‌چین چاپ می‌شود.

+ نوشته شده توسط SuB در دوشنبه پانزدهم مرداد 1386 و ساعت 13:2 |
 قبلاً دستور newcommand\ را برای معرفی دستور جدید معرفی کردم. گفته شد که روش دیگری برای تعریف دستور جدید وجود دارد که رسمی نیست. این روش استفاده از دستور def\ است. این دستور، عبارت خواسته شده را در جای عبارت مورد نظر قرار می‌دهد. شکل کلی آن به صورت زیر است:

>\def\command{definition}

که در آن command نام دستوری دلخواه است. این دستور می‌تواند وجود داشته باشد یا وجود نداشته باشد. چون دستور def\ عمل جایگزینی را انجام می‌دهد، پس نیازی به تعریف دستور از قبل نیست.
definition نیز دستور یا دستورها و یا عبارتی است که باید جایگزین دستور command\ شود.

برای مثال کد زیر را در نظر بگیرید:

>\def\cmd{3}

اکنون در هر کجای سند که بعد از این دستور قرار دارد، به جای cmd\ ، عدد 3 جایگزین می‌شود.

یکی دیگر از محاسن این دستور، این است که می‌توان چندین بار از آن استفاده کرد. از هر کجا تعریف آن تغییر کند، جایگزینی برای آن با تعریف جدید صورت می‌گیرد. برای مثال دستورهای زیر را در نظر بگیرید:

>\documentstyle[farsi,mystyle]{report}
>\begin{document}
>\def\cmd{2}
>\cmd\\
>\def\cmd{3}
>\cmd
>\end{document}

به جای cmd\ اول، عدد 2 و به جای cmd\ دوم عدد 3 جایگزین می‌شود.

دستور جایگزین شونده می‌تواند از صفر تا 9 آرگومان داشته باشد. مثلاً دستور زیر معادل وقتی است که ما دستور cmd\ را با استفاده از دستور newcommand\ به عنوان یک دستور یک آرگومانی تعریف کنیم:

>\def\cmd#1{definition}

برای مثال وقتی که می‌خواهیم دستور پنج  آرگومانی را شبیه سازی کنیم، به صورت زیر عمل می‌کنیم:

>\def\cmd#1#2#3#4#5{definition}

نکته: ترتیب در آرگومانها ضروری است. یعنی استفاده از دستورهای زیر به جای دستور بالا اشتباه است و با پیغام خطا مواجه خواهید شد:

>\def\cmd#2#1#3#4#5{definition}

>\def\cmd#2#3#4#5#6{definition}

دستور def\ دارای انعطاف بسیار بالایی است. به طور پیش فرض، جدا کننده یک آرگومان از آرگومان دیگر، کاراکترهای } و { هستند ولی شاید شما بخواهید که این کاراکترها، به کاراکترهای [ و ] تغییر یابند. این کار به صورت زیر انجام می‌گیرد:

>\def\cmd#1[#2]{definition}

در دستور بالا، جداکننده آرگومان اول همان آکولادها هستند ولی جداکننده آرگومان دوم، علامت‌های ] و [ هستند.

شاید بخواهید جدا کننده آرگومان دو : باشد. در این صورت کد زیر را وارد می‌کنید:

>\def\cmd:#1:{definition}

در این صورت عبارتی که در جلوی cmd\ قرار گیرد و بین دو : قرار گیرد، به عنوان آرگومان اول محسوب می‌شود.

نکته: اگر جدا کننده آرگومانها، علامت دیگری معرفی شود، باید حتماً در استفاده از دستور، آرگومان در بین دو علامت ذکر شده درتعریف قرار گیرد. در غیر این صورت با پیغام خطا مواجه می‌شوید.

شاید شما بخواهید بعد از یک دستور، الزاماً دستور دیگری قرار گیرد. مثلاً می‌خواهید وقتی دستور cmd\ را به کار می‌برید، در ادامه آن یک آرگومان قرار گیرد و حتماً بعد از آن دستور cmdd\ قرار گیرد و بعد از آن آرگومانی دیگر. برای رسیدن به این هدف، کد زیر را در سند وارد می‌کنیم:

>\def\cmd#1\cmdd#2{definition}

از این قابلیت انعطاف دستور def\ در معرفی دستورها با آرگومانهای اختیاری استفاده می‌شود.

+ نوشته شده توسط SuB در جمعه دوازدهم مرداد 1386 و ساعت 17:21 |

سلام. این مطلبی که الان دارم می نویسم، قبلا نیز گفته بودم ولی الان اون روش قبلی رو بسیار ساده کردم که خدمتتون عرض می کنم.

  • متاپست چیست؟


متاپست(MetaPost) یه زبان برنامه نویسی قوی برای رسم شکل در LaTeX هست. این زبان موقعی به درد می خوره که نرم افزارهای جانبی رسم شکلی مثل TeXCAD,LaTeXPiX و ... جواب نمی دن(موقعی که شکل یه مقدار پیچیده باشه.البته نه به پیچیدگی شکلهای MATLAB و MAPLE و امثالهم. برای رسم شکلهای بسیار بسیار پیچیده بهتره که از همون MATLAB و MAPLE و ... استفاده کنید.) . این زبان یه مقدار در جامعه ی کاربران LaTeX فارسی مهجور مانده که البته حق هم دارن، چون منابع بسیار بسیار کمی (در حد صفر) به زبان فارسی برای آن وجود داره. خروجی متاپست با پسوند عدد هست مثل fig.1 یا picture.8 .چند نمونه خروجی متاپست:

 

  •   ارتباط بین متاپست و LaTeX   

  برای استفاده از شکلهای MetaPost در LaTeX ابتدا برنامه به زبان متاپست رو می نویسیم، پسوند این گونه فایلها mp.* هست.  بعدش اون فایل رو با کامپایلر متاپست کامپایل می کنیم. فایل خروجی یه فایل postscript هست که به سادگی قابل قرار دادن در LaTeX هست.

  •   نصب MetaPost روی MiKTeX

برای نصب متاپست روی MiKTeX فایل های miktex-metapost-base و miktex-metapost-bin رو از لینکهای 1 و 2 بارگیری کنید. این دو فایل را به یه جای دلخواه unzip کنید. بعد از unzip متوجه میشوید که فایلهای unzip شده به شیوه شاخه بندی miktex شاخه بندی شده اند. این یعنی اینکه فایلهایی که دانلود کرده اید را باید با حفظ ساختاری که می بینید به دایرکتورهای مناسب miktex کپی کنید. مثلا شاخه ی texmf\doc\metapost موجود در یکی از بسته هایی که unzip کرده اید رو باید به دایرکتوری texmf\doc میک تک کپی کنید. یا مثلا \texmf\tex\generic رو باید به شاخه ی texmf\tex\generic\ میک تک کپی کنید و همین طور برای بقیه... . بعد از اتمام این کار در Run دستور mo رو اجرا کنید و به گزینه ی General رفته و دکمه  Refresh رو فشار دهید. بعد تغییرات را ثبت کنید(با زدن OK و ...). متاپست روی سیستمتان نصب شده است.

  • مشکل فارسی نویسی در MetaPost

فارسی نویسی در متاپست به خودی خود بسیار دشواره و نیازمند تخصص بالایی هست. مثلا آقای روزبه پورنادر در نوشتن کتاب "المپیاد ریاضی در ایران" برای رسم شکلها از متاپست استفاده کرده بود و  تونسته بود که شکلهای با برچسب فارسی از متاپست تولید کنه که در اون زمان(حدودا ۱۰ سال پیش) کار بسیار مشکلی بود(البته نه برای ایشون!). راه حلی که این جا ارایه می دم می تونه کار شماها رو راه بندازه. البته فکر می کنم که این پست چندان جذابیتی برای شما نداشته باشه. چون همون طوری که گفتم متاپست مهجور مونده و همچنین کاربران بسیار کمی هم (حداقل در ایران) داره.


فایلهای مورد نیاز رو از جدول زیر دانلود کنید:(دقت کنید که فایلهای آپلود شده با پسوند txt. هستن که شما باید آنها رو پس از دانلود به فرمت bat.* ذخیره کنید و آن را در دایرکتوری گفته شده در جدول ذخیره کنید.)

لینک دانلود

محل ذخیره کردن فایل

mpfl.bat

texmf/miktex/bin

pdfprinter.bat

texmf/miktex/bin

 

مراحل زیر رو بیپمایید:

ابتدا فایل mp.* خود را با دستورات متاپست طراحی کنید و اون رو در دایرکتوریی که فایل فارسی تک تون قرار داره ذخیره کنین. فرض کنید فایل mp.*  شما به صورت زیر باشد:

 beginfig(1);
numeric ux, uy;
120ux=1.2in; 4uy=2.4in;
draw (0,4uy)--(0,0)--(120ux,0);
pickup pencircle scaled 1pt;
draw (0,uy){right}
for ix=1 upto 8:
..(15ix*ux, uy*2/(1+cosd 15ix))
endfor;
label.bot(btex $x$ axis etex, (60ux,0));
label.lft(btex $y$ axis etex rotated 90,
(0,2uy));
label.lft(
btex $\displaystyle y={2\over1+\cos x}$ etex,
(120ux, 4uy));
endfig;

 


حالا یه پنجره ی داس باز کنین و با دستورات cd داس به دایرکتوری فایل فارسی تک بیایین و دستور

 mptotex file.mp > file.tex رو اجرا کنین.
حالا فایل tex. ای که تولید شده رو با فارسی تک باز کنین و کل محتواشو توی یه فایل فارسی تک جدید کپی کنید. اسم فایل فارسی تک جدیدی که باز کردین رو حتما همون اسم فایل tex. بگیرید. حالا فایل فارسی تک رو باید در جاهای مناسب به طور مناسب تغییر بدین که برچسبهای انگلیسی فایلتون به برچسبهای فارسی تبدیل بشن. مثال عملی میزنم. فرض کنید که فایل با پسوند tex. که در ابتدا داشتیم به صورت زیر بود:


\shipout\hbox{\smash{\hbox{\hbox{% line 10 ms.mp
$x$ axis}\vrule width1sp}}}
\shipout\hbox{\smash{\hbox{\hbox{% line 11 ms.mp
$y$ axis}\vrule width1sp}}}
\shipout\hbox{\smash{\hbox{\hbox{% line 14 ms.mp
$\displaystyle y={2\over1+\cos x}$}\vrule width1sp}}}
\end{document}

 

باید محتویات فایل رو به صورت زیر تغییر بدید. (تغییرات رو مشخص کردم):

\documentstyle[persian]{article}
\begin{document}

\shipout\hbox{\smash{\hbox{\hbox{% line 10 ms.mp
\persian{$x$ \koodak محور}}\vrule width1sp}}}
\shipout\hbox{\smash{\hbox{\hbox{% line 11 ms.mp
\perisan{$y$ \koodak محور}}\vrule width1sp}}}
\shipout\hbox{\smash{\hbox{\hbox{% line 14 ms.mp
$\displaystyle y={2\over1+\cos x}$}\vrule width1sp}}}
\end{document}

اگه از فارسی تک قدیمی استفاده می کنید در کد بالا هر جا persian دیدید به جاش بنویسید farsi.

 حالا  فایل فارسی تک رو ذخیره کنید و  یه پنجره داس باز کنین و با دستورات cd به دایرکتوری فایل فارسی تک برید و در خط فرمان دستور mpfl file (منظور از  file اسم فایل فارسی تک بدون پسوند هست.)

عکس با برچسب فارسی شما درست شد. حالا می مونه وارد کردن اون که بسیار ساده هست. در فارسی تک جدید ابتدا باید در مقدمه ی پرونده و در دستور \documentstyle و در درون [] عبارت fgraphix رو اضافه کنین و در فارسی تک قدیمی باید در درون [] عبارت epsf رو اضافه کنین. فرض کنید که فایل خروجی متاپست شما به نام file.1 هست. باید در جایی که نام عکس را برای وارد کردن در فارسی تک تایپ می کنید همین عبارت یعنی file.1 را وارد کنید. بعد از اتمام این کار یه پنجره ی داس باز کنید و با دستورات cd به دایرکتوری فایل فارسی تک تون رفته و دستور  pdfprinter file رو وارد کنید.(file یعنی همون فایلی که عکس متاپست رو توش قرار دادین.)این فایل به طور خودکار فایل خروجی pdf رو برای شما میسازه و کار شما رو راحتتر میکنه.

عکس زیر گویای همه چیز است:

 

عکس متاپست قبل از انجام کارهای گفته شده در این پست

 

 

عکس متاپست بعد از کارهای گفته شده در این پست

امیدوارم بدردتون بخوره...

+ نوشته شده توسط وحید در پنجشنبه یازدهم مرداد 1386 و ساعت 15:14 |
 در راستای معرفی شمارنده‌ها و دستورهای مربوط به آنها، دستور دیگری نیز وجود دارد که ذکر آن ضروری است. این دستور قبلاً در پست مربوط به معرفی شمارنده‌ها مطرح نشد چون این دستور نیز حاوی علامت @ است و معرفی آن نیاز به پست مربوط به وارد کردن یک فایل در فارسی‌تک بود.

دستور addtoreset@\ برای قرار دادن یک شمارنده به عنوان زیر مجموعه‌ای از شمارنده دیگر به کار می‌رود. در هنگام تعریف شمارنده جدید این امکان وجود دارد که یک شمارنده، زیر مجموعه شمارنده‌ای دیگر واقع شود. ولی اگر شمارنده قبلاً تعریف شده باشد، باید از همین دستور استفاده کرد. شکل کلی آن به صورت زیر است:

\@addtoreset{FOO}{BAR}

این دستور، شمارنده FOO را زیر مجموعه‌ای از شمارنده BAR قرار می‌دهد. در این صورت هنگامیکه با دستور stepcounter\ مقدار شمارنده BAR افزایش یابد، شمارنده FOO نیز صفر می‌گردد.

توجه داشته باشید که یک شمارنده می‌تواند زیر مجموعه چند شمارنده باشد. در این صورت هر یک از این شمارنده‌ها که شمارنده یاد شده زیر مجموعه آنها است، وقتی با دستور stepcounter\ افزایش یابند، مقدار شمارنده یاد شده صفر می‌شود. برای فهمیدن این موضوع دستور زیر را در فایلی به نام mystyle.sty ذخیره کنید:

\@addtoreset{section}{part}

اکنون یک سند فارسی‌تک در کنار همین فایل ایجاد کرده و نام آنرا s1.ftx بگذارید. دستورهای زیر را در آن تایپ کرده و آنرا ذخیره کنید:

>\documentstyle[farsi,mystyle]{book}
>\begin{documnet}
>\english
>\setcounter{section}{3}
>\arabic{section}\\
>\stepcounter{part}
>\arabic{section}\\
>\setcounter{section}{5}
>\arabic{section}\\
>\stepcounter{chapter}
>\arabic{section}
>\farsi
>\end{document}

اکنون یک سند FarsiTeX با نام s2.ftx ایجاد کرده ودستورهای زیر را در آن تایپ کنید:

>\documentstyle[farsi]{book}
>\begin{documnet}
>\english
>\setcounter{section}{3}
>\arabic{section}\\
>\stepcounter{part}
>\arabic{section}\\
>\setcounter{section}{5}
>\arabic{section}\\
>\stepcounter{chapter}
>\arabic{section}
>\farsi
>\end{document}

مشاهده می‌کنید که فرق این دو سند تنها در وارد کردن فایل mystyle.sty است که دستور addtoreset@\ در آن وجود دارد. اما خروجی آنها تنها یک تفاوت دارد. در فایل اول، ابتدا عدد 3 سپس صفر و سپس 5 و دوباره صفر چاپ می‌شود. ولی در فایل دوم ابتدا عدد 3 و دوباره عدد 3 و سپس 5 و در پایان عدد صفر را چاپ می‌کند.

+ نوشته شده توسط SuB در چهارشنبه دهم مرداد 1386 و ساعت 16:10 |
 وارد کردن یک فایل در سند، کاربردهای بسیاری دارد. شما می تواند دستورات خود را در یک فایل نوشته و در سند خود آن فایل را فراخوانی کنید. در این صورت، محتویات آن فایل، خوانده و پردازش می شود. و می توانید از دستورات تعریف شده در این فایل، در سند خود استفاده کنید. این قابلیت سبب می شود که از نوشتن کدهای تکراری برای سندهای خود جلوگیری شود.
برخی از دستورات قابل اجرا در فارسی تک نیستند. علت مشخص نیست ولی دستورات یا شمارنده ها یا متغیرهای بُعدی که در فارسی تک به همراه @ هستند، یا اجرا نمی شوند و اگر اجرا شوند، با پیغامهای متعدد همراه هستند. در این صورت تنها مجبور هستیم این دستورات را در فایلهای دیگر نوشته و آن فایل را در سند خود وارد کنیم.

وارد کردن یک فایل در فارسی تک با برخی مشکلات همراه است. اگر بخواهید یک فایل را در فارسی تک وارد کنید و در آن فایل کلمات فارسی وجود دارند، باید به صورت خاصی نوشته شوند. طرز نوشتن این کلمات مشخص نیست و فقط با روش آزمون و خطا می توان به نتیجه مطلوب دست یافت.
دیگر مشکل وارد کردن فایل در فارسی تک، محل وارد کردن فایل است. یعنی به خاطر برخی دستورات، مجبور هستیم که فایل را در جای خاصی وارد کنیم. در غیر این صورت با پیغام خطا مواجه می شویم.

وارد کردن فایل با دستور زیر انجام می گیرد:

>\input{filename}

 این دستور فایل filename.tex را وارد می کند. در صورتی که می خواهید فایل با پسوند خاصی را باز کنید، باید نام فایل را به صورت دقیق به همراه پسوند آن ذکر کنید. مثلاً دستور فایل{input{me.sty\ فایل me.sty را باز وارد می کند. این فایل باید در کنار سند (همان پوشه ای که سند در آن قرار دارد) باشد و گرنه با پیغام خطا مواجه خواهید شد.

در مورد خود فایلی که وارد می شود، باید گفت که این فایل مانند یک سند عادی است و می توان هر دستور دلخواهی را در آن نوشت. بهتر است این دستورات با را ویرایشگر فارسی تک ننویسید. مثلاً می توانید از ویرایشگر NotePad ویندوز یا با هر ویراشگر دیگری که فقط کدهایی که شما می نویسید را درون فایل قرار دهد، استفاده کنید. (من از ویرایشگر ++NotePad استفاده می کنم که یک ویرایشگر ساده ولی کار آمد  در محیط ویندوز است. این برنامه چندین نوع فایل را پشتیبانی می کند و محیط آن برنامه را شبیه سازی می کند. مثلاً اگر محیط TeX را انتخاب کنید، دستورات را با رنگ آبی از دیگر نوشته ها متمایز می کند و ...). دستورات باید در حالت خط انگلیسی نوشته شوند و در ابتدای هر خط، نیازی به علامت < نیست.
بهتر است پایان فایل را با دستور endinput\ در خود فایل مشخص کنید. (هر چند نیازی به این کار نیست. ولی برای جلوگیری از مشکلات احتمالی، این کار ضروری به نظر می رسد.)

قبلاً گفتم که جای وارد کردن یک فایل مهم است. اگر فارسی تک به فایل ورودی شما بدون دلیل ایراد می گیرد، باید از وارد کردن این فایل در سند خود اجتناب کنید. در این صورت می توانید فایل farsi.tex موجود در دایرکتوری tex\farsitex\base\... را باز کرده و قبل از دستور endinput\ در این فایل، فایل مورد نظر خود را وارد کنید.  در این صورت برای تمام سندهای شما، این فایل وارد می شود.

نکته: فارسی تک در هر کجای فایل که دستور endinput\ را ببینید، از فایل خارج می شود.

روش دیگری برای وارد کردن یک فایل سبک (فایل با پسوند sty) در فارسی تک وجود دارد و آن قرار دادن نام آن در آرگومان اختیاری دستور documentstyle\ می باشد. مثلاً دستور زیر، فایلهای mystyle و farsi و fancybox را وارد سند جاری می کند و می توانید از دستورات آنها استفاده کنید:

>\documentstyle[farsi,mystyle,fancybox]{book}

توجه داشته باشید که در آرگومان اختیاری دستور documentstyle\ شما تنها می توانید فایلها با پسوند sty را وارد کنید. مزیت این روش نسبت به دستور input\ این است که در این حالت، شما می توانید هر دستوری را در فایل سبک به کار برید و به استفاده یا تعریف دستورهای همراه با @ مشکلی ایجاد نمی کند.

در صورت نیاز به مثال، در قمست نظرات مطرح نمایید.

+ نوشته شده توسط SuB در سه شنبه نهم مرداد 1386 و ساعت 22:1 |

قبلاً قرار شد که فایلهای کتابی که در اختیار دارم رو براتون بزارم. می تونید از اینجا دانلود کنید.

این رو بگم که این کتاب بیشتر در مورد تست ها و حل اونها بود. برای همین بسیاری از مطالب کتاب، تکراری بودند و مجبور شدم خیلی از مطالب رو حذف کنم. ولی هر جا که به دوستان کمک می کرد تا بیشتر با فارسی تک آشنا بشند رو حذف نکردم. این رو بدونید که اصل کاری همون moshi.sty هست. که البته دستورات توی این فایل به شکل اختصاری تعریف شده اند و ممکنه کمی گیج بشید.

فعلاً بای

+ نوشته شده توسط SuB در دوشنبه هشتم مرداد 1386 و ساعت 13:53 |
  با سلام

با توجه به اینکه دوستان استقبال خوبی از دو مطلب قبل داشتند، امروز (زودتر از موعود) مطلب توپ رو می زارم. منتظر نظرات شما دوستان هستیم.

در ضمن اگه رنگ آبی به کار رفته برای دستورات مناسب نیست، بگید تا عوض کنم.


شمارنده های برای نگهداری برخی مقادریر عددی تعریف می شوند. یک شمارنده عدد را بدون واحد ذخیره می کند ولی این در صورتی است که یک متغیر بُعد، اندازه و واحد را با هم نگهداری می کند. پس نمی توان آنها را به جای هم به کار برد. (البته اختلاف های دیگری هم دارند.)


تعریف شمارنده جدید:

اما یک شمارنده به صورت زیر در فارسی تک تعریف می شود:

>\newcounter{countername}[oldcounter]

countername نام شمارنده ای است که می خواهید تعریف کنید. نامی که انتخاب می کنید، باید قبلاً مورد استفاده قرار نگرفته باشد. البته می توان نام دستور و نام شمارنده را یکی در نظر گرفت ولی نام دو شمارنده نمی تواند یکی باشد. نام شمارنده بر خلاف نام دستور، با \ شروع نمی شود و استفاده از آن سبب ایجاد خطا می شود (البته می توان به شمارنده ها با استفاده از \ دسترسی پیدا کرد ولی در این پست، به این روش پرداخته نمی شود.) مقدار پیش فرض این شمارنده برابر صفر است. بر خلاف دستورها که نام آنها نمی توانند حاوی ارقام باشند، برای نام شمارنده ها می توان از اعداد نیز استفاده کرد. مثلاً نامهای my1 و my1counter2 مجاز هستند.
oldcounter نام یک شمارنده است که وجود دارد. در صورتی که می خواهید از این آرگومان اختیاری استفاده کنید، باید قبلاً شمارنده ای برای این قسمت تعریف کرده باشید. اگر از این آرگومان استفاده کنید، وقتی شمارنده ای که نام آن در این آرگومان قرار دارد با دستور خاصی افزایش یابد ، مقدار countername دوباره برابر صفر خواهد شد. از این آرگومان برای شمارنده هایی مثل section استفاده می شود که باید با تغییر یک شمارنده، مقدار آنها نیز باید صفر شود ( وقتی شمارنده chapter تغییر می کند، باید شمارنده section نیز تغییر کند.) ذکر این نکته ضروری است که اگر از این آرگومان استفاده کنید، countername یک زیر مجموعه و یا شمارنده فرعی (subsidiary) از oldcounter محسوب می شود.


چاپ مقدار شمارنده ها:

اولین دستورهایی که در رابطه با شمارنده ها باید گفته شوند، دستورهای مربوط به چاپ مقدار شمارنده ها در خروجی است. برای این کار دستورهای متفاوتی وجود دارد و حتی خود می توانید دستوری برای این کار تعریف کنید.
دستورهای چاپ مقدار شمارنده در خروجی عبارتند از :

1) دستور alph\
این دستور دارای شکل کلی زیر است:

>\alph{countername}

که در آن countername، نام شمارنده مورد نظر است. این دستور مقدار آرگومان خود یعنی countername را به صورت یکی از حروف انگلیسی در حالت کوچک (Lower Case) به خروجی می برد. مقدار شمارنده باید بین 1 تا 26 باشد. در صورتی که شمارنده درای مقدار صفر باشد، چیزی در خروجی چاپ نخواهد شد و در صورتی که مقدار شمارنده از صفر کمتر و یا از 26 بیشتر باشد، آنگاه با پیغام خطا مواجه می شوید. اگر به جای alph\ از Alph\ استفاده کنیم، به جای حروف کوچک انگلیسی، حروف بزرگ (Upper Case) انگلیسی چاپ می شوند.

برای مثال دستورات زیر را در نظر بگیرید:

>\documentstyle[farsi]{report}
>\def\thechapter{\alph{chapter}}
>\begin{document}
>\chapter{}
>\end{document}

پس از اجرای دستورات بالا مشاهده می کنید که به جای اینکه عبارت «فصل 1» را مشاهده کنید، عبارت «فصل a» را می بینید. فعلاً به دستورات def\ و thechapter\ کاری نداشته باشد. فقط دستور {alph{chapter\ مد نظر است. (فعلاً به chapter در همین دستور کاری نداشته باشید تا در ادامه بفهمید که این شمارنده چیست و از کجا آمده است.)

2) دستور arabic\
این دستور دارای شکل کلی زیر است:

>\arabic{countername}

که در آن countername نام شمارنده مورد نظر است. این دستور مقدار شمارنده را به صورت اعداد عربی (در فارسی تک همان اعداد فارسی) به خروجی می برد. مقدار شمارنده می تواند هر مقداری باشد. (فکر کنم نیازی به مثال برای این دستور نباشد.)

3) دستور fnsymbol\
شکل کلی آن به صورت زیر است:

>\fnsymbol{countername}

که countername نام شمارنده مورد نظر است. این شمارنده می تواند مقداری بین 1 تا 11 داشته باشد. این دستور علائم خاصی که می توانند در پانویس (footnote) به عنوان مشخص کننده پانویس جدید به کار روند، را در خروچی چاپ می کند. اگر مقدار آن صفر باشد، چیزی چاپ نخواهد شد و اگر مقدار آن کمتر از صفر و یا بزرگتر از 11 باشد، با پیغام خطا مواجه می شوید. (فکر کنم نیازی به مثال برای این دستور هم نباشد.)

نکته مهم: این دستور حتماً باید در حالت ریاضی استفاده گردد و گرنه برای برخی اعداد، به شما پیغام خطا داده می شود و نتیجه آن چیزی نیست که شما انتظار دارید.

4) دستور roman\
شکل کلی آن به صورت زیر است:

>\roman{countername}

countername همان نام شمارنده مورد نظر است. این دستور مقدار شمارنده را به صورت اعداد رومی (i و ii و iii و ...) چاپ می کند. این شمارنده باید از صفر بزرگتر باشد. اگر مقادیر کمتر از یک را وارد کنید، هیچ چیز چاپ نمی شود. این دستور اعداد بسیاری را پشتیبانی می کند.(ولی هر عددی نمی توان به آن داد.) اگر به جای roman\ از Roman\ استفاده شود، اعداد رومی را به صورت بزرگ (I و II و III و ...) چاپ می شوند. (فکر کنم برای این دستور نیز نیاز به مثال نمی باشد.)


تغییر مقدار شمارنده ها:

دستورهای مختلفی برای تغییر مقدار شمارنده ها وجود دارند. (همچنین شما می تواند دستورات جدیدی برای این کار تعریف کنید.) که عبارتند از:

1) دستور setcounter\ که برای مقدار دادن به شمارنده ها به کار می رود. شکل کلی آن به صورت زیر است:

>\setcounter{countername}{value}

که countername نام شمارنده ای است که قبلاً تعریف شده است و value مقداری است که می خواهیم به آن نسبت دهیم. این مقدار نباید حاوی واحد باشد و یا اینکه عددی اعشاری باشد ولی می تواند یک عدد منفی باشد.

نکته: برای اینکه مقدار شمارنده a در شمارنده b قرار گیرد، نمی توان از دستور {setcounter{b}{a\ استفاده کرد. چون باید به جای a یک مقدار عددی قرار گیرد در صورتی که a یک مقدار عددی نیست. (در ادامه چگونگی این کار را خواهم گفت)

مثال: دستورات زیر را در ویرایشگر فارسی تک با دقت تایپ کنید:

>\documentstyle[farsi]{report}
>\newcounter{mycounter}
>\begin{document}
>\arabic{mycounter}
:
>\setcounter{mycounter}{-4}
>\arabic{mycounter}
>\end{document}

مشاهده می کنید که اول مقدار صفر و سپس مقدار 4- در خروجی چاپ می شود.

2) دستور addtocounter\ که برای اضافه کردن یک مقدار معین به شمارنده به کار می رود. شکل کلی آن به صورت زیر است:

>\addtocounter{countername}{value}

که در آن countername نام شمارنده مورد نظر است و value مقداری است که می خواهیم به آن اضافه کنیم. این مقدار می تواند هر عدد صحیح باشد.

مثال: دستورات زیر را در ویرایشگر فارسی تک با دقت تایپ کنید:

>\documentstyle[farsi]{report}
>\newcounter{mycounter}
>\begin{document}
>\setcounter{mycounter}{-3}
>\arabic{mycounter}:
>\addtocounter{mycounter}{5}
>\arabic{mycounter}
>\end{document}

با اجرای دستورهای بالا مشاهده می کنید که در ابتدا مقدار 3- و سپس مقدار 2 در خروجی چاپ می شود.

3) دستور stepcounter\ که برای اضافه کردن یک واحد به شمارنده به کار می رود. شکل کلی آن به صورت زیر است:

>\stepcounter{countername}

که countername نام شمارنده مورد نظر است.
این دستور، علاوه بر آنکه یک واحد به شمارنده اضافه می کند، مقدار تمام شمارنده های زیر مجموعه
countername را برابر صفر می کند. مثلاً وقتی شمارنده ای که شماره فصل را نگهداری می کند، تغییر یابد، مقدار شمارنده ای که شماره section را نگهداری می کند نیز باید برابر یک گردد. این کار توسط این دستور و تعریف شمارنده صورت می گیرد.

مثال: دستورهای زیر را در ویرایشگر فارسی تک تایپ کنید:

>\documentstyle[farsi]{report}
>\newcounter{myc1}
>\newcounter{myc2}[myc1]
>\begin{document}
>\setcounter{myc2}{3}
>\arabic{myc2}:
>\stepcounter{myc1}
>\arabic{myc2}
>\end{document}

پس از اجرای این دستورات مشاهده می کنید که در ابتدا برای شمارنده myc2 مقدار 3 را در نظر گرفته ایم و در اولین چاپ مقدار این شمارنده، عدد 3 چاپ می شود. در هنگامی که با دستور stepcounter\ به شمارنده myc1 یک واحد اضافه می کنیم، چون شمارنده myc2 زیر مجموعه ای از شمارنده myc1 است، مقدار myc2 برابر صفر می شود. که عدد صفر در خروجی چاپ می شود.

دستور دیگری به نام refstepcounter\ نیز برای تغییر مقدار شمارنده وجود دارد که مانند stepcounter\ عمل می کند.


استفاده از شمارنده:

برای استفاده از مقدار شمارنده، یک دستور یعنی value\ به طور پیش فرض در فارسی تک موجود است. این دستور دارای شکل کلی زیر است:

>\value{countername}

که countername نام همان شمارنده مورد نظر است.
در واقع این دستور مقدار شمارنده ذکر شده را برای استفاده در دستورهای دیگر بر می گرداند. مثلاً اگر بخواهید مقدار شمارنده
myc1 را در شمارنده myc2 قرار دهید، باید حتماً از دستور زیر استفاده کنید:

>\setcounter{myc2}{\value{myc1}}

توجه داشته باشید که با نوشتن {value{myc1\ نمی توانید مقدار شمارنده myc1 را در خروچی چاپ کنید. برای این کار چندین راه پیش روی شماست و یکی از آنها استفاده از دستور arabic\ است که قبلاً کاملاً بحث شد. راههای دیگری نیز برای این کار وجود دارد که در آینده به آنها پرداخته می شود.


دستور دیگری در رابطه با شمارنده ها وجود دارد که آن دستور usecounter\ است. در اینجا فقط از این دستور نام می برم و کاربرد آن را در پستهای دیگر مطرح می کنم. شکل کلی آن به صورت زیر است:

>\usecounter{countername}


برخی از شمارنده های موجود در فارسی تک:

در فارسی تک و به طور کلی در LaTeX شمارنده هایی به طور پیش فرض تعبیه شده است. این شمارنده ها وظیفه نگهداری مواردی چون شماره فصل جاری، شماره بخش جاری، شماره فرمول جاری و ... را بر عهده دارند. شما توانایی تغییر این شمارنده ها را دارید. البته وجود یا عدم وجود آنها بستگی به سبک سنذ شما دارد. در زیر برخی از آنها را معرفی می کنم:

1) chapter
این شمارنده شماره فصل جاری را نگهداری می کند. این شمارنده در سبکهایی چون book و report تعریف شده است ولی در سبک article تعریف نشده است.

2) section
این شمارنده، شماره قسمت جاری را نگهداری می کند. این شمارنده نیز در سبک book و report و حتی article تعریف شده است. (تعریف شمارنده section به گونه ای است که در سبکهایی که شمارنده chapter دارند، شمارنده section به عنوان یک زیر مجموعه از chapter محسوب می شود. در واقع با افزایش یک واحدی به شمارنده chapter از طریق دستور stepcounter\، مقدار section برابر صفر می شود.)

3) part
شماره بخش جاری را نگهداری می کند. این شمارنده در سبک article نیز تعریف شده است.

4) subsection
این شمارنده، شماره قسمت فرعی را نگهداری می کند. این شمارنده زیر مجموعه ای از شمارنده
section محسوب می شود.

5) page
این شمارنده شماره صفحه جاری را نگهداری می کند.

شمارنده های معرفی شده، مهمترین شمارنده های فارسی تک محسوب می شوند. شمارنده های دیگری در فارسی تک وجود دارند که می توان از بین آنها شمارنده های paragraph ، subsubsection ، subparagraph ،footnote ، table ،figure ، footnote و ... را نام برد که توضیح درباره آنها از حوصله این پست خارج است.

با توجه با توضیحات داده شده در این پست و مثالهای زده شده، نیازی به مثال احساس نمی شود. در صورت لزوم در قسمت نظرات ذکر کنید.

+ نوشته شده توسط SuB در یکشنبه هفتم مرداد 1386 و ساعت 13:40 |

در فارسی تک، چندین محیط برای نوشتن فرمولها وجود دارد.
حال اگر بخواهید یک سری محاسبات ریاضی را در فارسی تک به در پاراگرافی جدید بنویسید، چندین راه پیش رو دارید. حال اگر بخواهید محاسبات ریاضی، علاوه بر اینکه در یک پاراگراف جدید چاپ شوند، در سمت راست چپ نیز نوشته شوند، فقط یک راه دارید. بقیه راهها چاره ساز نیستند. این راه، تعریف یک محیط جدید با خصوصیات دلخواه شماست.
در یکی از مطالب قبلی، روش تعریف یک محیط جدید در فارسی تک به طور کامل گفته شد و دیگر نیازی به بحث در مورد تعریف محیط جدید احساس نمی شود.
من برای رسیدن به هدفم که در بالا ذکر شد، محیطی به نام Lmath به صورت زیر تعریف می کنم:

>\newenvironment{Lmath}{\par\noindent\beginL$\displaystyle}{$\par\endL}

در ابتدا به املای کلمات دقت کنید زیرا کلمه environment یک کلمه دارای املای بدی است و املای صحیح آن فوراً فراموش می شود ( معمولاً n دوم از قلم می افتد). حرف L در Lmath و beginL و endL ، به صورت بزرگ (UpperCase) می باشد و بقیه حروف به صورت کوچک (LowerCase) هستند.
برای این نام Lmath را برای این محیط انتخاب کردم چون محاسبات و فرمولهای ریاضی را در سمت چپ می نویسد. شما می توانید هر نام دیگری برای این محیط انتخاب کنید.
دستور par\ را که همه می شناسند و برای این به کار رفته است که محاسبات مورد نظر ما، در پاراگراف جدید قرار گیرند.
از دستور noindent\ استفاده شده است تا در در خط اول این پاراگراف، تو رفتگی ایجاد نشود.
دستور beginL\ برای قرار گیری مطالب این پاراگراف در سمت چپ صفحه است.
استفاده از $ سبب می شود که به فارسی تک بفهمانیم که قصد نوشتن مطالب ریاضی داریم.
همانطور که در مطالب پیشین گفته شد، فرمولهایی که در بین دو $ قرار می گیرند، در بعضی موارد دچار اشکال در زیبایی مطلب می کنند. مثلاً هنگام نوشتن حد ، برای مثال عبارت "x->2" به جای اینکه کاملاً در زیر کلمه lim قرار گیرد، در زیر و سمت راست آن قرار می گیرد که از نظر زیبا دوستان، ناخوش آیند به نظر می رسد. استفاده از دستور displaystyle\ این مشکل را حل می کرد. اکنون نیز از همین دستور، برای رفع این مشکل استفاده شده است.
دستور par\ دوم نیز سبب جدید شدن پاراگراف می شود.
دستور endL\ نیز پایان چپ نویسی را مشخص مب کند.


نکته: جای دستورات par\ و beginL\ و endL\ بسیار مهم است و باید به همان شکلی که در بالا نوشته شده است، تایپ گردند و گرنه محیط به درستی عمل نخواهد کرد و به جای اینکه در سمت چپ بنویسد، در همان سمتی می نویسد که کلمات قبل از محیط نوشته شده اند (می توانید امتحان کنید)
شما می توانید این محیط را گسترش دهید و بر اساس نیاز خود، مواردی را به آن زیاد کنید ( به غیر از beginL\ و endL\ که در شرایط خاصی قابل حذف اند، بقیه دستورات را نمی توان حذف کرد. چون ممکن است سبب مشکلاتی گردند) و یا اینکه آنرا هوشمند سازید. ( در آینده به این مطلب می پردازیم)

+ نوشته شده توسط SuB در شنبه ششم مرداد 1386 و ساعت 14:11 |

سلام بر همگی

من تقریباً هر هفته یه بار، یه مطلب توپ در مورد فارسی تک می زارم. مطالب کم و جزئی هم هر وقت شد می زارم. برای اینکه باعث دلگرمی من بشید، توی قسمت نظراتف نظر خودتون رو بگید. اگه سوالی هم بود همون جا مطرح کنید.


با توجه به اینکه روش تعریف محیط جدید در فارسی تک، قبلاً مورد بررسی قرار گرفت، تعریف دستور جدید در فارسی تک به آسانی انجام می گیرد. در بیشتر منابع آموزشی LaTeX، این دستورهای تعریف محیط جدید و تعریف دستور جدید را به دنبال هم می آورند.

متاسفانه LaTeX 2.09 دارای قابلیت تعریف دستور یا محیط جدید با آرگومان یا آرگومانهای اختیاری نیست. در صورتی که این قابلیت در LaTeX2ε گنجانده شده است. این کاستی سبب مشکل بزرگی نمی شود و کمی کد نویسی برای سند را زیادتر می کند. با استفاده از دستورهای شرطی می توان به راحتی این مشکل را حل کرد. (حل این مشکل سبب نمی شود که شما در LaTeX 2.09 بتوانید از دستورات جدید با آرگومان اختیاری استفاده کنید؛ بلکه سبب می شود که شما آن آرگومانی که می خواهید اختیاری باشد را بنویسد ولی در صورتی که این آرگومان با مقدارهای مورد نظر یکسان نباشد، هیچ کاری انجام نگیرد.)

در این پست به تعریف دستور جدید با استفاده از دستور newcommand\ می پردازیم. با استفاده از دستور def\ نیز می توان به تعریف دستور جدید پرداخت ولی استفاده از این دستور را می توان تعریف دستور جدید به طور غیر رسمی دانست. (هر چند که نویسندگان LaTeX 2.09 و فارسی تک بیشتر از دستور def\ برای تعریف دستور جدید بهره می برند!) در پستهای آینده که به بررسی دستور def\ می پردازیم، دلیل این حرف من را خواهید فهمید.

تعریف دستور جدید به صورت زیر انجام می گیرد:

>\newcommand{\cmd}[num]{definition}

cmd همان نام دستور جدید است. این نام نباید نام دستور یا محیط دیگری که موجود است و یا ;end باشد. علامت \ در ابتدای نام دستور اجباری است. (بهتر است نام دستور جدید، نام یک شمارنده، متغیر بُعد و ... نباشد؛ هر چند که اشکال ندارد.) همچنین این نام فقط می تواند حروف باشد و استفاده از نمادها و یا اعداد مجاز نیست.
num نیز بیانگر تعداد آرگومانهای اجباری این دستور جدید است. می تواند عددی بین صفر تا 9 باشد. در صورتی که ذکر نشود، برابر صفر در نظر گرفته می شود.
definition مجموعه دستور یا دستورهایی هستند که با فراخوانی اسن دستور، بایستی انجام پذیرند. در واقع محتویات این آرگومان، در محل فراخوانی دستور قرار می گیرند. اگر بخواهیم از آرگومانها در این قسمت استفاده کنیم باید از n# استفاده کنیم که n شماره آرگومان مورد نظر است. مثلاً برای استفاده از آرگومان اول از 1# و برای استفاده از آرگومان نهم از 9# بهره می بریم.

فراخوانی دستورات در فارسی تک به دو دسته تقسیم می شود. فراخوانی دستورات در حالت خط انگلیسی و در حالت خط فارسی.

در حالت خط انگلیسی شکل کلی فراخوانی دستورات بی آرگومان به صورت زیر است: (در حالت خط انگلیسی تمام نمادهای \ و { و }  به صورت انگلیسی هستند)

>\cmd

دستورات یک آرگومانی که آرگومان اول آنها arg1 است به صورت زیر فراخوانی می شوند:

>\cmd{arg1}

دستورات دو آرگومانی که آرگومان اول آنها arg1 و آرگومان دوم آنها arg2 است، به صورت زیر فراخوانی می شوند:

>\cmd{arg1}{arg2}

اگر آرگومانی تنها یک رقم یا یک کاراکتر باشد می توان از دو علامت {} برای آن آرگومان صرف نظر کرد. (به مثال مراجعه کنید.)
برای دستورات 3 تا 9 آرگومانی نیز به همین شکل عمل می کنیم.

فراخوانی دستورات در حالت فارسی، برای دستورات بدون آرگومان به صورت زیر است: (مقصود از نماد > ، حالت خط فارسی است)

>\cmd

برای فراخوانی دستورات یک آرگومانی به صورت زیر عمل می کنیم:

>\arg1}cmd}

توجه داشته باشید که در این حالت تمام نمادهای \ و } و {  به صورت فارسی هستند. (به مثال مراجعه کنید)
اگر در این حالت، هر یک از آرگومانها یا بخشی از آنها در انگلیسی بود، باید آن قسمتی که انگلیسی است را درون دو @ که در حالت فارسی نوشته شده اند، قرار دهید. اگر فارسی تک اشکال نگیرد، بدانید که در صورت قرار ندادن موارد انگلیسی درون دو @ ، نتیجه مطلوب شما حاصل نمی شود. (به مثال مراجعه کنید)

دستورات 2 تا 9 آرگومانی نیز به همین صورت فراخوانی می شوند.

با توجه به اینکه امکان نمایش حالت نوشته در اینجا امکان پذیر نیست، کلیه مثالها را از اینجا دانلود کنید.

+ نوشته شده توسط SuB در چهارشنبه سوم مرداد 1386 و ساعت 13:20 |