دستور \fancypage :
این دستور برای تعیین پسزمینه تمام صفحات یک سند به کار میرود. و شکل کلی آن به صورت زیر است:
>\fancypage{TEXT1}{TEXT2}
TEXT1 همان عبارت مورد نظر است. این عبارت میتواند عکس، متن یا ترکیبی از این دو باشد.
توجه: این دستور در فایل fancybox.sty تعریف شده است پس برای استفاده از این دستور ابتدا باید فایل یاد شده را فراخوانی کنید.
با توجه به اینکه دستور \fancypage از دستورات پیشفرض LaTeX 2.09 نیست و همچنین در فایل fancybox.sty هیچ توضیحی در مورد نحوه استفاده از این دستور داده نشده است، کاربرد آرگومان دوم این دستور را بنده حقیر نمیدانم و فکر نمیکنم نیازی به دانستن آن باشد.
دستور \thisfancypage :
این دستور نیز مشابه دستور \fancypage است و تنها تفاوت آنها در این است که \fancypage پسزمینه تمام صفحات سند را تعیین میکند ولی \thisfancypage پسزمینه صفحه فعلی سند را تعیین میکند.
مثال 1:
در این مثال نحوه استفاده از دستور \fancypage را میآموزید. کدهای زیر را در ویرایشگر فارسیتک تایپ نمایید:
>\documentstyle[persian,fancybox]{oldreport}
>\fancypage{\Huge\IE{SuB}}{}
>\begin{document}
>\english
>The first page
>\newpage
>The second page
>\newpage
>The third page
>\end{document}
خروجی آنرا مشاهده کنید. در خروجی 3 صفحه داریم که در هر صفحه در گوشه سمت چپ و پایین محدوده تایپ صفحه عبارت مورد نظر یعنی SuB چاپ شده است.
با مشاهده این مثال میفهمید که مبدا قرار گیری عبارت مورد نظر گوشه سمت چپ و پایین محدوده تایپ است. (محدوده تایپ کوچکتر از اندازه برگه است و به متغیرهای بُعد مختلفی از جمله \textwidth و \textheight و ... بستگی دارد.)
معمولاً این قرارگیری پیشفرض دستور \fancypage برای ما خوشآیند نیست و جای دیگری برای آن در نظر داریم. تنها کافی است با قرار دادن متن مورد نظر در عبارت دستور \put و تعیین مکان آن، مکان پسزمینه را تعیین کنید. برای آشنایی با نحوه این کار مثال زیر را مشاهده کنید.
مثال 2:
>\documentstyle[persian,fancybox]{oldreport}
>\fancypage{\put(200,200){\Huge\IE{SuB}}}{}
>\begin{document}
>\english
>The first page
>\newpage
>The second page
>\newpage
>The third page
>\end{document}
مشاهده میکنیم که مکان قرارگیری پسزمینه تغییر کرد.
ممکن است بخواهید که پسزمینه دقیقاً در وسط محدوده تایپ قرار گیرد در این صورت نیاز به تعریف دستور دیگری داریم که این دستور به صورت زیر تعریف میشود:
>\makeatletter
>\newsavebox\pagebackgroundbox
>\newdimen\backgroundwd
>\newdimen\backgroundht
>\def\preparebackground#1{
> \long\def\put(##1,##2)##3{\@killglue\raise##2\hbox to\z@{\kern##1 ##3\hss}\ignorespaces}
> \savebox{\pagebackgroundbox}{#1}
> \backgroundwd=.5\textwidth
> \addtolength{\backgroundwd}{-.5\wd\pagebackgroundbox}
> \backgroundht=.5\textheight
> \addtolength{\backgroundht}{-.5\ht\pagebackgroundbox}
> \put(\backgroundwd,\backgroundht){#1}
>}
>\makeatother
دستور تعریف شده دستور \preparebackground است با یک آرگومان که عبارت مورد نظر را گرفته و با محاسبه وسط محدوده تایپ، عبارت مورد نظر را در وسط محدوده تایپ قرار میدهد. نحوه استفاده از این دستور در مثال زیر آورده شده است:
مثال 3:
کدهای زیر را تایپ و خروجی آنرا مشاهده نمایید:
>\documentstyle[persian,fancybox]{oldreport}
>\makeatletter
>\newsavebox\pagebackgroundbox
>\newdimen\backgroundwd
>\newdimen\backgroundht
>\def\preparebackground#1{
> \long\def\put(##1,##2)##3{\@killglue\raise##2\hbox to\z@{\kern##1 ##3\hss}\ignorespaces}
> \savebox{\pagebackgroundbox}{#1}
> \backgroundwd=.5\textwidth
> \addtolength{\backgroundwd}{-.5\wd\pagebackgroundbox}
> \backgroundht=.5\textheight
> \addtolength{\backgroundht}{-.5\ht\pagebackgroundbox}
> \put(\backgroundwd,\backgroundht){#1}
>}
>\makeatother
>\fancypage{\preparebackground{\Huge\IE{SuB}}}{}
>\begin{document}
>\english
>The first page
>\newpage
>The second page
>\newpage
>The third page
>\end{document}
برای اینکه یک متن یا عکس را در هرکجای سند قرار دهیم از دستور \put استفاده میکنیم.
شکل کلی این دستور به صورت زیر است:
>\put(X,Y){OBJ}
X و Y مختصات را بیان میکنند. این دو باید عدد وارد شوند اما در تعریف دستور در \unitlength ضرب میشوند که \unitlength نیز یک متغیر بُعد و برابر 1pt است. در ادامه بیشتر در مورد آن صحبت میکنم.
OBJ همان متن، عکس یا هر چیز دیگر است که میخواهید محل آنرا تعیین کنید.
نحوه کار دستور \put :
این دستور در هر کجا قرار گیرد، آرگومان سوم خود را به اندازه X pt چپتر از وسط خط فعلی و به اندازه Y pt بالاتر از وسط خط فعلی قرار میدهد. در واقع X و Y وارد شده، مختصات درج آرگومان سوم نسبت به وسط خط جاری در خروجی و کمی جلوتر از آخرین کاراکتر در آن خط است.
توضیح بالا گنگ است ولی این تنها برای کسانی است که تاکنون با دستور \put کار نکرده باشند. برای فهمیدن بهتر مثال زیر را مشاهده کنید:
مثال:
کدهای زیر را در نظر بگیرید:
>\documentstyle[persian]{oldbook}
>\begin{document}
>\english
>This is the first line
>\put(0,0){.}
>\end{document}
خروجی آنرا نیز مشاهده کنید.خروجی به صورت زیر خواهد بود:
This is the first line.
همانطور که مشاهده میشود، نقطه توسط دستور \put جایگذاری شده است. با صفر قرار دادن آرگومانهای اول ودوم به فارسیتک میگوییم که نقطه را دقیقاً در مبدا این جایگذاری قرار بده. پس به مکان نقطه را خوب نگاه کنید. این مکان همان مبدا سنجش دستور \put است (البته با کمی اختلاف)
این دستور فعلاً کاربرد آنچنانی نخواهد داشت ولی برای تولید BackGround برای صفحات سند بسیار مفید است. در مورد ساخت BackGround در پستهای بعدی بحث خواهم کرد.
یکی از قابلیتهای فارسیتک که آنرا برتر از Microsoft Word میکند، قابلیت Header و Footer است که میتوان آنرا بسیار هوشمند ساخت.
در کتابها اکثراً از سرصفحه استفاده میشود. فرم معمول اینگونه است که در صفحات فرد به شکل زیر است:
|
شماره صفحه |
(انتشارات) |
نام فصل |
و در صفحات زوج به صورت زیر است:
|
نام فصل |
(انتشارات) |
شماره صفحه |
در فارسیتک به طور پیشفرض این قابلیت قرار داده شده است. این کار با دستور زیر انجام میگیرد:
>\pagestyle{headings}
دستور بالا را باید در مقدمه سند خود قرار دهید تا سرصفحه به تمام صفحات اضافه شود.
اما ممکن است بخواهید سرصفحه به صورت دلخواه شما باشد. در این صورت تعریف یک سرصفحه کمی مشکل است و ممکن است گیج کننده باشد.
اما نویسندگان LaTeX و در نتیجه فارسیتک به فکر شما بودهاند و این مشکل را با استفاده از فایل ffancyhe.sty حل کنید. این فایل حاوی یک Page Style به نام fancy و همچنین دستورهایی است که کار شما را در تولید سرصفحه و پاصفحه آسان میکنند.
چگونه از Fancy برای تولید سرصفحه و پاصفحه دلخواه استفاده کنیم؟
ابتدا باید فایل ffancyhe.sty را در سند خود فراخوانی کنید. کافی است در دستور \documentstyle عبارت ffancyhe را به قسمت آرگومان اختیاری اضافه کنید)
سپس Page Style را fancy قرار دهید. برای این کار دستور زیر را در مقدمه سند خود وارد کنید:
>\pagestyle{fancy}
اکنون سند شما بسته به سبک سند دارای سرصفحه و پاصفحه است. اما میتوانید سرصفحه و پاصفحه را به میل خود تغییر دهید که با دستورات زیر انجام میگیرند:
|
دستور |
توضیح آرگومان (متنی که به جای TEXT قرار میگیرد) |
| \rhead{TEXT} | متن سمت چپ سرصفحه |
| \lhead{TEXT} | متن سمت راست سرصفحه |
| \chead{TEXT} | متن وسط سرصفحه |
| \rfoot{TEXT} | متن سمت چپ پاصفحه |
| \lfoot{TEXT} | متن سمت راست پاصفحه |
| \cfoot{TEXT} | متن وسط پاصفحه |
همچنین دو متغیر بُعد برای کنترل ضخامت خط سرصفحه و پاصفحه تعریف شدهاند. که عبارتند از:
| \headrulewidth | ضخامت خط سرصفحه |
| \footrulewidth | ضخامت خط پاصفحه |
این مثال را دریافت و نتیجه آنرا مشاهده کنید.
در طی چند هفته گذشته، چندین نفری به فالرسیتک 1.0 کوچ کردهاند! اما سوالی که اغلب برای این کوچکنندگان پیش میآید، این است که چگونه میتواند از فارسیتک 1.0 خروجی DVI گرفت.
اگرچه خروجی PDF از خروجیهای PS و DVI به مراتب بهتر است اما در برخی موارد حتی خود بنده هم ترحیج میدهم از خروجی DVI استفاده کنم.
اما برای اینکه در فارسیتک 1.0 خروجی DVI داشته باشید، کافی است در مقدمه سند خود دستور زیر را وارد کنید:
>\pdfoutput=0
مقدمه سند کجاست؟
به تمام فاصله و دستورهای بین دو دستور ... documentstyle\ و {begin{document\ مقدمه سند گفته میشود.
در اینجاست که نیاز به معرفی دستور \hfill احساس میشود. این دستور بین دو متن فاصله لازم را ایجاد میکنند تا دو متن مورد نظر در دورترین فاصله قرار گیرند.
توجه: دستوری که اکنون معرفی میشود، دستور \hfill است آنرا با دستور \hfil (با یک L ) اشتباه نگیرید!
دستور \hfill :
همانطور که گفته شد از این دستور برای ایجاد بیشترین فاصله بین دو متن استفاده میشود. این دستور به ظاهر هیچ آرگومانی ندارد و طرز استفاده آن به صورت زیر است:
>First Text \hfill Second Text
First Text و Second Text همان متنهای مورد نظر هستند.
اینکه کدام متن در سمت راست قرار گیرد و کدام متن در سمت چپ، بستگی به پاراگراف دارد.
یک مزیت این دستور این است که در محیطهای ریاضی نیز کار میکند و با آن مشکلی نخواهید داشت.
برای آشنایی بیشتر با این دستور مثال را دانلود و بررسی نمایید.
در ادامه معرفی دستورات فارسیتک نسخه جدید لازم دیدم چند دستور کاربردی را معرفی کنم.
گرچه این دستورها از قبل به شیوهای دیگر در فارسیتک موجود بودهاند اما یک دستور جدید نیز به آنها اضافه شده است که کاربر را انجام کارهای اضافی بینیاز میکند.
سه دستور \automathdigits و \persianmathdigits و \europeanmathdigits برای این هستند که تعیین کنند در محیط ریاضی، چه ارقامی به کار روند.
در فارسیتک ارقام محیط ریاضی دارای دو حالت هستند. ارقام فارسی، ارقام انگلیسی.
دستور \automathdigits :
این دستور به فارسیتک میگوید که انتخاب نوع رقم در محیط ریاضی، بر عهده موتور فارسیتک است و فارسیتک خود بر اساس زبان بند، نوع رقم را تعیین میکند.
دستور \persianmathdigits :
این دستور فارسیتک را مجبور میکند که در تمام محیطهای ریاضی که پس از به کار بردن این دستور، استفاده شدهاند، ارقام را به صورت ارقام فارسی چاپ کند. یعنی هیچ فرقی نمیکند که بند فعلی، بند فارسی باشد یا انگلیسی. در هر صورت ارقام محیط ریاضی آن، ارقام فارسی خواهند بود.
دستور \europeanmathdigits :
این دستور فارسیتک را مجبور میکند که تمامی ارقام موجود در محیطهای ریاضی پس از خود را به صورت رقم انگلیسی (اروپایی) چاپ کند.
توجه: فارسیتک به طور پیشفرض دستور \automathdigits را اجرا میکند. پس بدون هیچ نگرانی میتوانید به تایپ بپردازید چون فارسیتک در این زمینه نیز هوشمندی خود را به رخ میکشاند!!!
برای آشنایی بیشتر با این سه دستور، این لینک را دانلود و بررسی نمایید.
از دوستانی که پاسخ سوالاتشون دیر داده شد، واقعاً عذرخواهی میکنم. چون این چند روزه مشغول انتخاب رشته بودم و ... .
برخی دوستان سوال میپرسند اما ایمیلی در اختیار ما نمیگذارند. اگر میتونید به نحوی ایمیل خود را به اطلاع من برسونید. چون امکانات قسمت نظرات بسیار کم هست و نمیشه تمام موارد را در اون قسمت مطرح کرد. اگر ایمیل خود را در اختیار من قرار بدید، میتونم علاوه بر دادن جواب شما در قسمت نظرات، به ایمیلتون هم ارسال کنم.
امیدوارم که مطالبی که تاکنون در اختیارتون قرار دادم، مفید واقع شده باشه.
فعلاً علاوه بر آموزش فارسیتک، کارهای دیگری هم در زمینه فارسیتک دارم انجام میدم. اگر دوستان اطلاعات مفیدی در هر یک از این زمینهها دارند، حتماً در اختیار بنده بزارند.
1- ساخت مبدل فارسیتک به یونیکد (نوشته شده ولی در حال انجام آزمایش برای انتشار هستم)
2- ساخت مبدل یونیکد به فارسیتک ( درصد پیشرفت 0 درصد هست!)
3- ساخت ویرایشگر تحت ویندوز برای فارسیتک عیناً مشابه ویرایشگر موجود (درصد پیشرفت 0 درصد - علت عدم پیشرفت : نیافتن کنترلی در #C که توانایی نگهداری متنهایی با چند چیدمان را داشته باشد.)
4- ساخت ویرایشگر تحت ویندوز برای فارسیتک که بر مبنای یونیکد کار میکند. (درصد پیشرفت 0 درصد - نیاز به تکمیل پروژههای پیشین دارد.)
5- ارائه فارسیتک تحت وب (درصد پیشرفت 5 درصد - عدم آشنایی مورد نیاز با امکانات وب)
6- ارائه نصبکننده خودکار برای FarsiTeX 1.0 Pre 1 (درصد پیشرفت 90٪ - در حال آزمایش بر روی ویستا و پیشرفته ساختن نصبکننده که کاربر را از انجام بسیاری از کارها بی نیاز کند)
در FarsiTeX 1.0 Pre 1 سعی بر آن شده است که دسترسی به موارد انگلیسی و فارسی راحت و مقدور گردد. در واقع هدف از فارسیتک، یک سیستم حروفچینی دو زبانه بود. اما در نسخه پیشین، فارسیتک بیستر به سیستم حروفچینی منحصراً فارسی میماند تا یک سیستم حروفچینی دو زبانه. بدین منظور در این نسخه تغییرات لازم اعمال گردیده تا این مهم انجام گردد.
یکی از مواردی که میتواند در اسناد مفید باشد، درج تاریخ است.
فارسیتک هم میتواند تاریخ میلادی درج کند و هم تاریخ خورشیدی (تاریخ ایرانی، تاریخ هجری شمسی). تاریخ درج گشته بر مبنای هر یک از این دو تاریخ میتواند با حروف و علائم فارسی باشد و یا با حروف و علائم انگلیسی.
مثلا برای امروز یعنی 19 مرداد سال 1387، فارسیتک میتواند یکی از چهار خروجی زیر را تولید کند:
۱- 19 مرداد 1387
۲- e 19 Mordad 1387
3- August 9 , 2008
4- 9 اوت ۲۰۰۸
فارسیتک در انتخاب کدامیک از موارد بالا برای درج تاریخ بسیار هوشمند است اما برای سهولت کار، دستورهایی نیز قرار گرفتهاند.
چگونه تاریخ درج کنم؟
برای درج تاریخ در هرجای سند کافی است از دستور \today استفاده کرد. برای استفاده از این دستور، نیاز نیست هیچ فایل دیگر را فراخوانی کنید چون فایل مربوط به این دستور به طور پیشفرض توسط فارسیتک فراخوانی میشود.
دستور \autocalendar :
در کل ۳ دستور وجود دارند که میتوانند نحوه درج تاریخ را تغییر دهند. \autocalendar یکی از همین دستورها است.
این دستور نحوه درج تاریخ را به گونهای تغییر میدهد که نحوه درج آن توسط موتور فارسیتک تشخیص داده شود. این بدان معنی است که پس از کاربرد این دستور و استفاده از \today برای درج تاریخ، با توجه به اینکه محیط فارسی است یا انگلیسی به ترتیب تاریخ خورشیدی با کاراکترهای فارسی و تاریخ میلادی با کاراکترهای انگلیسی (موارد ۱ و ۳ در مثال بالا) درج میشود.
از بین ۳ دستور تغییر دهنده نحوه درج تاریخ، این دستور به طور پیشفرض توسط موتور فارسیتک فراخوانی میشود.
دستور \iraniancalendar :
این دستور، نحوه درج تاریخ را بر روی درج تاریخ بر مبنای تقویم خورشیدی قرار میدهد. یعنی در محیط فارسی، تاریخ خورشیدی با کاراکترهای فارسی (مورد ۱ در مثال بالا) و در محیط انگلیسی، تاریخ خورشیدی با کاراکترهای انگلیسی درج میشود (مورد ۲ در مثال بالا)
دستور \gregoriancalendar :
این دستور، نحوه درج تاریخ را بر روی درج تاریخ بر مبنای تقویم میلادی قرار میدهد. یعنی در محیط فارسی، تاریخ میلادی با کاراکترهای فارسی (مورد ۴ در مثال بالا) و در محیط انگلیسی، تاریخ میلادی با کاراکترهای انگلیسی درج میشود (مورد ۳ در مثال بالا)
برای آشنایی بیشتر این فایل را دانلود و بررسی نمایید.
دستور obeylines\
گاهی لازم میشود که وقتی یک خط در ویرایشگر فارسیتک تمام میشود، در خروجی (فایل PDF یا DVI یا PS و یا هر خروجی دیگر فارسیتک) نیز آن خط تمام شود. یعنی به جای اینکه از \\ برای شروع سطر جدید در خروجی استفاده کنیم، از سطرها را در ویرایشگر به همانگونهای بچینیم که در خروجی انتظار آنرا داریم. مثلاً در شعر نو به دلیل ماهیتی که دارد، دائماً باید از \\ برای پایان دادن به یک به اصطلاح مصراع استفاده کرد. استفاده از \\ در این موارد تایپیست را کلافه میکند.
دستور obeylines\ هیچ آرگومانی ندارد و به صورت زیر فراخوانی میشود:
>\obeylines
این دستور در هرجا به کار رود، بر ادامه سند تاثیر میگذارد. این چیزی نیست که مطلوب ما است. برای جلوگیری از تاثیر کلی این دستور، میتوان این دستور را در یک بلاک قرار داد. قبلاً گفته شد که یک بلاک با کاراکتر { آغاز شده و با کاراکتر } پایان مییابد.
برای روشن شدن این مطلب به دو مثال زیر توجه کنید:
مثال 1:
دستورهای زیر را در ویرایشگر فارسیتک وارد کنید:
>\documentstyle[persian]{oldreport}
>\pdfoutput=0
>\begin{document}
>\english
>\obeylines
>text 1
>text 2
>text 3
>text 4
>\end{document}
خروجی مثال به صورت زیر خواهد بود:
text 1
text 2
text 3
text 4
مشاهده میکنید که در ششم، هفتم، هشتم و نهم کدهای این مثال از \\ برای خط جدید استفاده نشده است ولی در خروجی پس از تولید text 1 ، خط جدید شده است. این به خاطر استفاده از دستور obeylines\ در خط پنجم کدهای بالاست.
مثال 2:
دستورهای زیر را در ویرایشگر فارسیتک وارد کنید:
>\documentstyle[persian]{oldreport}
>\pdfoutput=0
>\begin{document}
>\english
>{
>\obeylines
>text 1
>text 2
>}
>text 3
>text 4
>\end{document}
خروجی به صورت زیر است:
text 1
text 2
text 3 text 4
همانطور که مشاهده میکنید، دستور obeylines\ را در بلاک قرار دادیم. پس اثرات این دستور تنها در چیزهایی که در آن بلاک قرار دارد، اعمال میشود. پس text 1 و text 2 هر کدام در یک خط جداگانه قرار میگیرند و text 3 و text 4 هر دو در یک خط قرار میگیرند (زیرا این دو عبارت در بلاکی که دستور obeylines\ قرار دارد، جای نگرفتهاند.)
توجه1: با فراخوانی دستور obeylines\، اتمام خط در ویرایشگر فارسیتک، مساوی است با استفاده از دستور par\ نه دستور newline\ (و همچنین نه مساوی با دستور \\ )
توجه 2: با فراخوانی دستور obeylines\، دستورهایی چون \\ ، par\ و ... به قوت خود باقی هستند و همان کارهای قبلی را انجام میدهند.
توجه 3: اگر میخواهید از تورفتگی که در اثر جدید شدن خط ایجاد میشود جلوگیری کنید، میتوانید درون بلاک، مقدار متغیر بُعد parindent\ را صفر کنید. (میدانیم که این مقدار صفر تنها در بلاکی که در آن مقدار متغیر بُعد parindent\ را صفر کردهایم، معتبر است و بر بقیه قسمتهای سند تاثیری ندارد.)
در این پست تنها به شعر سنتی میپردازم و در آینده به شعر نو خواهم پرداخت.
برای قرار دادن شعر نو از محیط oldpoem استفاده میشود.
برای جداسازی دو مصراع، از علامت & استفاده میشود. توجه داشته باشید که اگر حالت خط فارسی باشد، باید علامت & نیز فارسیباشد (توسط کلیدهای ترکیبی Shift+A تولید شود) و اگر حالت خط انگلیسی باشد، باید علامت & نیز انگلیسی تایپ گردد (توسط کلیدهای ترکیبی Shift+7 تولید شود).
برای جداسازی یک بیت با بیت بعدی، از \\ در حالت خط فارسی استفاده میشود.
در هنگام تایپ شعر سنتی، بدون نگرانی کار تایپ را انجام دهید. فارسیتک در این زمینه بسیار هوشمند است و بر اساس بلندی بیتها و مصراعها، آنها را میچیند. در صورتی که دو مصراع در یک سطر جای نگیرند، فارسیتک به صورت خودکار، تمام مصراعها را به صورت پلهای میچیند.
برای نمونه دستور زیر را در نظر بگیرید:

اگر قبل از این دستور، اندازه فونت را برابر scriptsize قرار دهیم، خروجی به صورت زیر است:

و اگر قبل از این دستور، اندازه فونت را برابر normalsize قرار دهیم، خروجی زیر را خواهیم داشت: (مصراعها پلهای چیده شدهاند.)

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

توجه داریم که نحوه چیدمان بیتها و همچنین خروجی به موارد زیادی از جمله عرض سند، اندازه فونت، طول مصراع و ... دارد.
در بالا ابتدا در خروجی DVI سند، به میزان لازم Zoom تغییر کرده است و سپس عکس گرفته شده است. به همین علت عکسهای قرار داده شده، بزرگتر یا کوچکتر از مقدار واقعی آنها هستند.
مثال این پست را میتوانید از اینجا دانلود کنید.
همچنین میتوانید خروجی PDF مثال این پست را در اینجا مشاهده کنید.
محیط *oldpoem نیز برای چیدن شعرهای سنتی وجود دارد که بعداً به آن میپردازم.
در فارسی تک نسخه 1.0 می توان دستورهای فارسی را نیز تعریف نمود؛ یعنی برای تولید لوگوی فارسیتک هنگامیکه حالت خط فارسی باشد، میتوان هم از دستور FarsiTeX\ استفاده کرد و هم از \فارسیتک . هر دو دستور یک خروجی را دارند با این تفاوت که دستور اول انگلیسی و دستور دوم فارسی است.
البته همانطور که قبلاً (در ابتدای کار وبلاگ) گفته شده است، فارسیتک به بزرگی و کوچکی حروف حساس است. همانطور که تنها شکل انگلیسی برای تولید لوگوی فارسیتک، به صورت FarsiTeX\ است، تنها شکل فارسی برای تولید لوگوی فارسیتک، به صورت \فارسیتک است. (توجه کنید که بین «فارسی» و «تک» هیچ فاصله وجود ندارد و همچنین حرفهای «ی» و «ک» به شکل بزرگ خود هستند. اگر غیر از این را تایپ کنید، با پیغام خطا در فارسیتک مواجه میشوید.)
طبق فایل PDF ارائه شده برای فارسیتک 1.0 ، دستورهای زیر به طور پیشفرض به هر دو زبان فارسی و انگلیسی برای حالت خط فارسی موجود هستند: (به بزرگی و کوچکی حروف دقت کنید.)
|
\فارسیتک |
FarsiTeX\ |
|
\لتک |
LaTeX\ |
|
\تک |
TeX\ |
|
\ریال |
rial\ |
|
حقکپی\ |
copyright\ |
توجه: دستورهای فارسی تنها در حالت خط فارسی قابل استفاده هستند و در حالت خط انگلیسی غیرقابل استفادهاند.
قرارداد: از این پس برای نمایش حالت خط فارسی در این وبلاگ از نماد > استفاده میشود و شما نباید این کاراکتر را تایپ کنید.
چگونه دستور فارسی جدید تعریف کنیم؟
از دو دستور def\ و newcommand\ که قبلاً معرفی شدهاند، میتوان برای تولید اینگونه دستورها استفاده کرد. البته روش دیگری نیز وجود دارد که آنرا در پستهای بعدی خواهم گفت.
برای آشنایی بیشتر با تعریف دستور فارسی جدید، به مثال مراجعه کنید.
برای دریافت مثال اینجا را کلیک کنید.
با سلام
از این به بعد تمام دستوراتی که معرفی میکنم برای FarsiTeX 1.0 Pre 1 هست و بنده هیچ مسئولیتی در قبال اجرا شدن این دستورها و یا نتایج آنها بر ورژنهای قبلی فارسیتک ندارم.
در ضمن از MikTeX 2.7 استفاده میکنم اما چون FarsiTeX 1.0Pre 1 بر مبنای LaTeX 2.09 هست، فکر نمیکنم تفاوت زیادی در فارسیتکی که بر روی این ورژن و یا ورژنهای قبلی اجرا میشود، وجود داشته باشد.
در گذشته با دستور کم و بیش با دستور input\ آشنا شدهاید. اکنون دستور دیگری به نام include\ را معرفی میکنم که کاری مشابه با دستور input\ انجام میدهد.
از این دستور برای وارد کردن یک فایل به سند شما استفاده میشود. شکل کلی آن به صورت زیر است:
\include{FileName}
FileName همان نام فایل مورد نظر است که میخواهید وارد سند خود کنید.
تنها تفاوت آن با دستور input\ در این است که وقتی فارسیتک به دستور input\ میرسد، فوراً به سراغ فایل مورد نظر میرود و فرمانهای آنرا اجرا میکند. اما وقتی دستور include\ را به کار میبرید، ابتدا فارسیتک در خروجی به صفحه جدید میرود، سپس به سراغ فایل مورد نظر میرود و پس از اتمام کار در فایل مورد نظر، در خروجی به صفحه جدید میرود و ادامه سند را اجرا میکند.
از این دستور بیشتر برای سندهای بزرگ مثل کتابهای یا مقالات استفاده میشود که دارای چندین فصل هستند و اگر همه سند در یک فایل تایپ شود، بررسی فایل آسان نخواهد بود. با تایپ کردن هر فصل در یک فایل، میتوان سند را تقسیمبندی کرد. حتی اگر چند نفر تایپیست باشند، میتوان هر فصل را بر عهده یک نفر گذاشت و آنها به هر کدام بدون نگرانی از کار دیگری، به تایپ قسمت خود بپردازد.
در فارسیتک دستوراتی هستند که مربوط به جعبهها میشوند. برای مثال دستوری برای پیدا کردن پهنا یا ارتفاع یک جعبه. در این پست دو دستور مهم wd\ و ht\ میپردازیم.
دستور wd\
از این دستور برای بدست آوردن پهنای یک جعبه استفاده میشود. شکل کلی آن به صورت زیر است:
\wd\BOXNAME
BOXNAME همان نام جعبه مورد نظر است.
توجه داشته باشید که این دستور باعث تولید عدد در خروجی نمیشود بلکه یک مقدار عددی به همراه واحد تولید میکند. (واحد آن sp است) پس میتوان یک متغیر بُعد را برابر آن در نظر گرفت یا با استفاده از دستور number\ مقدار آن را در خروجی چاپ نمود.
برای مثال دستورات زیر را در نظر بگیرید:
\documentstyle[farsi]{report}
\begin{document}
\english
\newdimen\myboxwidth
\newsavebox{\mybox}
\savebox{\mybox}{1}
\myboxwidth=\wd\mybox
\number \myboxwidth
\end{document}
خط اول و دوم که برای همه کاربران فارسیتک آشنا است. در خط سوم برای تولید خروجی بهتر از دستور english\ استفاده کردهایم. (قبلاً گفتیم که دستور number\ وقتی عدد را به فارسی به خروجی میبرد، رقمهای آن را در جای مناسب آن چاپ نمیکند و این ممکن است باعث اشتباه شما در تشخیص عدد شود) در خط بعدی متغیر بُعدی به نام myboxwidth\ را برای نگهداری پهنای جعبه خود تعریف کردیم. سپس جعبهای به نام mybox\ برای نگهداری عدد مورد نظرمان تعریف کردهایم. در خط بعدی عدد 1 را درون این جعبه قرار دادهایم. در خط بعدی مقدار متغیر بُعد myboxwidth\ را برابر پهنای جعبه mybox\ قرار دادهایم. در خط بعدی مقدار myboxwidth\ را در خروجی چاپ کردهایم. خط پایانی نیز برای همه آشناست.
توجه: یکی از کاربردهای دستور wd\ ساخت دستور برای تولید سوالات تستی میباشد. با ترکیب جعبهها و دستور شرطی ifdim\ میتوان دستور قابل انعطافی برای تولید سوالهای چهار گزینهای (یا بیشتر) تعریف کرد.
دستور ht\
از این دستور برای بدست آوردن ارتفاع یک جعبه استفاده میشود. شکل کلی آن به صورت زیر است:
\ht\BOXNAME
BOXNAME همان نام جعبه مورد نظر است.
این دستور دقیقاً مانند دستور ht\ عمل میکند.
یکی از دستورهای شرطی موجود در فارسیتک، دستوری است که برای مقایسه ابعاد به کار میرود. این دستور ifdim\ میباشد. این دستور بسیار شبیه به دستور ifnum\ میباشد که قبلاً معرفی شد. تنها تفاوت این دو دستور در عبارت شرطی است که میپذیرند.
شکل کلی این دستور به صورت زیر است:
\ifdim عبارت شرطی
دستوراتی که در صورت برقراری عبارت شرطی باید اجرا شوند
\else
دستوراتی که در صورت عدم برقراری عبارت شرطی باید اجرا شوند
\fi
عبارت شرطی عبارت است از یک عملگر مقایسهای (که میتواند = یا < یا > باشد) و دو مقدار بُعد (یعنی باید همراه واحد باشند). واحدهای انتخاب شده برای مقایسه بعدها میتواند هر واحد شناخته شده در فارسیتک باشد.
استفاده از fi\ الزامی است و به معنای پایان دهنده دستور شرطی است.
استفاده از else\ اختیاری است.
برای مثال دستور زیر مقایسه میکند که 2pt از 1mm بزرگتر است یا نه. در صورت برقراری شرط، عبارت True و در غیر این صورت Flase را در خروجی چاپ میکند.
\ifdim 2pt>1mm
\IE{True}
\else
\IE{False}
\fi
واضح است که خروجی False است! چون 1mm از 2pt بزرگتر است.
قبلاً گفتیم که هر متغیر بُعد میتواند مستقیماً در جاهایی که نیاز به بُعد است به کار رود. این بدان معنا است که در دستور ifdim\ میتواند مقدار متغیرهای بُعد را بررسی کرد. (برخلاف شمارندهها)
برای مثال میخواهیم دستوری بنویسیم که اگر مقدار متغیر textwidth\ از 200pt بیشتر بود، در خروجی True چاپ کند و در غیر این صورت عبارت False را در خروجی چاپ کند.
دستور را به صورت زیر تعریف میکنیم:
\ifdim \textwidth > 200pt
\IE{True}
\else
\IE{False}
\fi
در پستهای بعدی با برخی از کاربردهای این متغیر آشنا میشویم.
دستور framebox\
از این دستور برای تولید یک جعبه که دور آن خط کشیده شده است به کارمیرود. این دستور نیز دارای دو شکل است. شکل اول آن به صورت زیر است:
\framebox[WID][POS]{TEXT}
WID تعیین کننده پهنای جعبه است. اگر ذکر نشود، پهنای جعبه به اندازه پهنای متن بعلاوه دو برابر fboxsep\ (در ادامه توضح داده میشود) در نظر گرفته میشود.
POS تعیین کننده نحوه چیدمان متن درون جعبه است که در این شکل استفاده از دستور میتواند l برای چپچین و r برای راستچین و c برای وسطچین باشد. این آرگومان مانند آرگومان متناظرش در دستور makebox\ ، در محیط فارسی به طور عکس عمل میکند. این بدین معنی است که در محیطهای فارسی l برای راستچین و r برا چپچین است.
TEXT همان متن مورد نظر است که میخواهیم درون جعبه کادردار قرار گیرد. پهنای این متن نباید از پهنای صفحه بیشتر شود. در این صورت متن از جعبه بیرون میافتد. استفاده از \\ و \par در این دستور مجاز است ولی هیچ تاثیری نمیگذارد.
برای قرار دادن متنهای چند خطی درون جعبه کادردار باید از دستورهای دیگری استفاده کرد.
در مورد این دستور دو متغیر بُعد وجود دارد. یکی برای تعیین ارتفاع خط و دیگری برای تعیین فاصله میان کادر و متن.
fboxrule\ ارتفاع خط را در دستور fbox\ مشخص میکند.
fboxsep\ تعیین کننده فاصله میان کادر و متن است. یعنی متن درون جعبه از بالا و پایین و چپ و راست به این فاصله قرار میگیرد.
شکل دوم اسن دستور به صورت زیر است:
\framebox(X,Y)[POS]{TEXT]
X ضریبی برای تعیین پهنای جعبه است. یعنی پهنای جعبه برابر است با X ضربدر unitlength\. (در این مورد در دستور makebox\ کاملاً توضیح دادم)
Y ضریبی برای تعیین ارتفاع جعبه است. یعنی ارتفاع جعبه برابر است با Y ضربدر unitlength\. (در این مورد در دستور makebox\ کاملاً توضیح دادم)
POS نیز طرز چیدمان متن درون جعبه را مشخص میکند. که میتواند l یا r یا c یا t یا b یا ترکیبی از آنها باشد. (در این مورد در دستور makebox\ کاملاً توضیح دادم)
TEXT نیز متن مورد نظر است.
دستور fbox\
این دستور دارای شکل کلی زیر است:
\fbox{TEXT}
که شکل بالا معادل دستور زیر است:
\framebox{TEXT}
توجه: متغیرهای بُعد fboxrule\ و fboxsep\ برای این دستور نیز متعبر هستند.
دستور parbox\
این دستور برای قرار دادن متنی درون جعبههای چند سطری استفاده میشود. این دستور باعث میشود که یک جعبه تولید شود که متن درون آن میتواند چند سطر یا پارارگراف باشد. شکل کلی آن به صورت زیر است:
\parbox[POS]{WIDTH}{TEXT}
POS تعیین کننده طرز قرار گیری جعبه است. که میتواند t یا b یا c باشد. به طور پیشفرض مقدار آن برابر c است. اگر این آرگومان برابر t باشد، بالاترین خط متن موجود در جعبه در امتداد سطر جاری قرار میگیرد. اگر این آرگومان b اختیار شود، آخرین سطر متن درون جعبه در امتداد سطر جاری قرار میگیرد و اگر c باشد، وسط جعبه در امتداد سطر جاری قرار میگیرد.
WIDTH تعیین کننده پهنای جعبه است. اگر پهنای جعبه کوچکتر از پهنای متن درون آن باشد، متن درون آن به چند سطر شکسته میشود. (مانند محیط minipage)
TEXT متن مورد نظر است که میخواهیم درون جعبه قرار گیرد. این متن می تواند حاوی \\ باشد. بر خلاف بقیه جعبهها، در جعبههای تولیدی دستور parbox\ ، به کاربردن \\ به معنی رفتن به خط جدید است. دستور \par نیز در این دستور باعث جدید شدن خط میشود. (دستور par\ فقط باعث میشود که خط جدید شود و تورفتگی اولین خط پاراگراف را ایجاد نمیکند.)
مثال:
در این مثال فقط قصد دارم نقش POS را در دستور parbox\ نمایش دهم. کار کدهای زیر را در نظر بگیرید:
>\documentstyle[farsi]{report}
>\begin{document}
>\english
>Text Before Box \fbox{\parbox[t]{.7cm}{Text in Box}}\par
>Text Before Box \fbox{\parbox[b]{.7cm}{Text in Box}}\par
>Text Before Box \fbox{\parbox[c]{.7cm}{Text in Box}}
>\end{document}
خروجی این دستورها به صورت زیر است:

گاهی در فارسیتک مجبور هستید دستورهایی بنویسید که آرگومانهای آنها شامل دستور par\ هستند.
اگر یک دستور را به استفاده از def\ تعریف کنید، وقتی در آرگومان آن از par\ استفاده کنید، با پیغام Paragraph ended before \cmd was completed مواجه میشوید (cmd\ همان دستوری است که در آرگومان آن از par\ استفاده کردهاید). برای اضافه کرده این قابلیت به دستور کافی است قبل از def\ (در تعریف دستور) از long\ استفاده کنید.
برای مثال اگر دستور cmd\ را به صورت زیر تعریف کنید، میتوانید از par\ در هر یک از آرگومانهای آن استفاده کنید:
\long\def\cmd#1#2{#1:#2}
توجه: قبلاً دیدید که برای تعریف دستور با آرگومان اختیاری مجبور هستیم ابتدا دستور اصلی را تعریف کنیم و سپس یک دستور که در همان دستور اول در شرایط خاصی فراخوانی میشود، تعریف کنیم که در واقع این دستور فرعی کار اصلی را انجام میدهد. وقتی میخواهیم در آرگومان آن دستور اصلی از par\ استفاده کنیم، اگر خود دستور اصلی، در هنگام تعریف آرگومانی بپذیرد، باید دستور long\ را قبل از تعریف دستور اصلی به کار بریم وگرنه از long\ قبل از تعریف دستور فرعی باید استفاده نمود. برای مثال در دستور parbox\ (قبلاً به طور کامل معرفی شد) دیدیم که گاهی باید از دستور par\ استفاده کنیم. اگر به فایل latex.tex (موجود در مسیر MikTeX\latex209\base\...) نگاهی بیندازید، دستور یاد شده به صورت زیر تعریف شده است:
\def\parbox{\@ifnextchar [{\@iparbox}{\@iparbox[c]}}
همانطور که میبینید در هنگام تعریف دستور parbox\ (دستور اصلی)، هیچ آرگومانی در نظر گرفته نشده است. به همین دلیل برای استفاده از دستور par\ در آرگومان دستور parbox\، در اینجا از long\ استفاده شده است. بلکه از آن در تعریف iparbox@\ (دستور فرعی) استفاده شده است. که کد آن به صورت زیر است:
\long\def\@iparbox[#1]#2#3{\leavevmode \@pboxswfalse
\if #1b\vbox
\else \if #1t\vtop
\else \ifmmode \vcenter
\else \@pboxswtrue $\vcenter
\fi
\fi
\fi{\hsize #2\@parboxrestore #3}\if@pboxsw \m@th$\fi}
استفاده نکردن از long\ در تعریف parbox\ و در عوض استفاده از آن در تعریف iparbox@\ به این دلیل است که خود parbox\ در تعریف هیچ آرگومانی ندارد و در واقع ما خواستار فعال شدن این قابلیت برای آرگومانهای iparbox@\ هستیم. اما اگر parbox\ در هنگام تعریف دارای آرگومان بود، وضعیت استفاده از long\ طور دیگری خواهد بود. که در این صورت با حالتهای پیچیدهای سر و کار خواهیم داشت. اما در همه موارد این نکته را توجه داشته باشید که برای فعال شدن این قابلیت برای آرگومان مورد نظر یک دستور باید ببینیم که این آرگومان در تعریف کدام دستور (فرعی یا اصلی) به کار رفته است و long\ را قبل از تعریف دستور یاد شده به کار ببریم.
این دستور سبب میشود که متن تعیین شده، در سمت چپ صفحه قرار گیرد. شکل کلی آن به صورت زیر است:
>\leftline{TEXT}
TEXT همان متن مورد نظر است که میخواهیم در سمت چپ قرار گیرد.
دستور rightline\
این دستور سبب میشود که متن تعیین شده، در سمت راست صفحه قرار گیرد. کلی آن به صورت زیر است:
>\rightlien{TEXT}
TEXT همان متن مورد نظر است.
دستور centerline\
با این دستور بیشتر از دو دستور قبلی آشنایی دارید. این دستور برای قرار دادن متن مورد نظر در وسط صفحه به کار میرود. شکل کلی آن به صورت زیر است:
>\centerline{TEXT}
TEXT همان متن مورد نظر است.
توجه: دستورهای centerline\ و leftline\ و rightline\ هم برای متنهای فارسی به کار میروند و هم برای متنهای انگلیسی.
توجه: این سه دستور برای متنهایی به کار میروند که کمتر از یک خط پهنا دارند. اگر متن مورد استفاده در این سه دستور بزرگتر از پهنای خط باشد، متن از خط بیرون میزند. همچنین در این سه دستور، \par معنی ندارد. همچنین \\ باعث رفتن به خط جدید نمیشود. بلکه تنها فاصله میاندازد.
توجه: قبل از به کار بردن این سه دستور، با دستور \\ یا \par خط را جدید کنید. در غیر این صورت متن قبل از این سه دستور و متن درون دستور در یک خط قرار میگیرند و پهنای آن خط، از یهنای بقیه خطها بیشتر میشود و در صورت زیاد بودن کلمات به کار رفته، متن از صفحه کاغذ بیرون میزند.
جعبهها در فارسیتک برای منظورهای خاصی به کار میروند. یک جعبه را میتوان قسمتی از صفحه گفت که از بقیه قسمتها جدا شده است. این تعریف آن چنان گویا نیست ولی در ادامه کمکم با این تعریف آشنا میشویم.
ویژگی مشترک بیشتر جعبهها این است که در آنها خط جدید و پاراگراف جدید معنی ندارد. یعنی شما در بیشتر جعبهها نمیتوانید به طور مستقیم به خط جدید یا پاراگراف جدید بروید و نیاز به دستورات خاصی برای این کار است.
برخی دستورهای مربوط به جعبهها عبارتند از:
دستور makebox\
این دستور یک متن را درون جعبهای قرار میدهد و آنرا در خروجی چاپ میکند.
این دستور دارای دو شکل متفاوت است. شکل اول این دستور بدین صورت است:
>\makebox[WID][POS]{OBJ}
WID پهنای جعبه را تعیین میکند. اگر این عدد از پهنای متن موجود در جعبه کمتر باشد، متن به هم میریزد ولی اندازه جعبه زیاد نمیشود. اگر این آرگومان ذکر نشود، اندازه جعبه به اندازه متن درون آن تعیین میشود.
POS محل جعبه را مشخص میکند. این آرگومان محل قرار گیری متن درون جعبه را تعیین میکند. این آرگومان میتواند l برای چپچین، r برای راستچین یا c برای وسطچین باشد. البته با هر کاراکتر دیگری به غیر از l و r مانند کاراکتر c رفتار میشود. اگر POS ذکر نشود، مقدار پیشفرش برای آن c یا همان وسطچین است. توجه کنید که اگر WID که همان آرگومان اول این دستور است ذکر نشود، دیگر نمیتوانید از آرگومان دوم استفاده کنید. اگر بخواهید که اندازه جعبه برابر با اندازه متن باشد و از آرگومان دوم بتوانید استفاده کنید، میتوانید قبل از استفاره از جعبه، اندازه متن را تعیین کنید (این کار با دستورهایی که بعداً مطرح میشود، انجام میگیرد) و سپس این اندازه را به عنوان آرگومان اول به دستور ارسال کنید.
OBJ همان متن مورد نظر است که میخواهید درون جعبه قرار گیرد.
پیشنهاد میکنم برای آموزش کار با جعبهها حتماً از دستور جعبه مورد نظر را به عنوان آرگومان دستور fbox\ ارسال کنید. فقط در اینجا این نکته را متذکر میشود که این دستور به دور جعبه خط میکشد. این دستور باعث میشود که مرز جعبه را به طور تقریبی تشخیص دهید و کار با آنرا بهتر درک کنید. من از همین روش در این پست استفاده میکنم.
مثال 1 :
در این مثال یک متن را در حالات مختلف دستور makebox\ امتحان میکنم و خروجی را مقایسه میکنیم.
ابتدا دستورهای زیر را در محیط ویرایشگر فارسیتک تایپ کنید.
>\documentstyle{report}
>\begin{document}
>\noindent
>\fbox{\makebox{An English Text}} \\
>\fbox{\makebox[7cm]{An English Text}} \\
>\fbox{\makebox[7cm][l]{An English Text}} \\
>\fbox{\makebox[7cm][r]{An English Text}} \\
>\fbox{\makebox[1cm]{An English Text}}
>\end{document}
خروجی آن به صورت زیر است:

در این سند از فایل farsi.sty استفاده نشده است چون هیچ دستور فارسی استفاده نکردهایم پس نیازی به وارد کردن این فایل نیست.
در خط چهارم از کدها متنی درون جعبه قرار میگیرد و در خروجی چاپ میشود. همانطور که میبینید با دستور fbox\ باعث شدیم که دور جعبه، یک کادر کشیده شود. همچنین آرگومان اول دستور makebox\ ذکر نشده است چون میخواهیم اندازه متن درون جعبه با اندازه آن برابر باشد. در خط بعدی اندازه جعبه را از اندازه متن بزرگتر انتخاب کردهام. میبینید که به طور پیشفرض، متن درون جعبه به صورت وسطچین قرار میگیرد. در خط بعدی اندازه جعبه را همان مقدار تعیین کردهام ولی با این تفاوت که متن چپچین قرار میگیرد. در خط بعدی متن درون جعبه به صورت راستچین قرار میگیرد و در خط بعدی اندازه جعبه را کوچکتر از اندازه متن در نظر گرفتهام که باعث شده متن از داخل جعبه بیرون بزند و باعث بههم ریختگی در خروجی سند شود.
شکل دوم این دستور به صورت زیر است:
>\makebox(X,Y)[POS]{OBJ}
X پهنای جعبه بر حسب پوینت میباشد. در واقع پهنای این جعبه برابر است با حاصلضرب X در متغیر بُعدی به نام unitlength\ که مقدار پیشفرض این متغیر برابر 1pt میباشد.
Y ارتفاع جعبه را تعیین میکند. این ارتفاع نیز همانند پهنای جعبه، برابر است با حاصلضرب Y در متغیر unitlenght\.
POS مانند شکل اول این دستور، تعیین کننده وضعیت متن درون جعبه است. که تفاوتی با شکل قبل در این آرگومان وجود دارد. این آرگومان میتواند l برای چپچین، r برای راستچین، c برای وسطچین باشد. اما تفاوت این شکل دستور در اینجاست که این آرگومان میتواند t یا b باشد و یا ترکیبی از آنها. t برای حالتی است که متن در بالاترین نقطه جعبه قرار گیرد و b برای حالتی است که میخواهیم متن در پایینترین نقطه جعبه قرار گیرد. در شکل اول دستور، مقدار ارتفاع جعبه به طور پیشفرض تعیین شده بود و امکانی برای تعیین ارتفاع جعبه وجود نداشت. پس فرقی بین متن در بالا یا متن در وسط با متن در پایین نبود. ولی در این شکل دستور، بین این حالتها تفاوت وجود دارد. توجه داشته در این شکل دستور نیز اگر X و Y ذکر نشوند، نمیتوان از POS استفاده کرد.
OBJ نیز متنی است که میخواهیم درون جعبه قرار گیرد.
مثال 2:
در این مثال نیز حالتهای مختلف برای شکل دوم دستور makebox\ را بررسی میکنیم.
کدهای زیر را در نظر بگیرید:
>\documentstyle{report}
>\begin{document}
>\noindent
>\fbox{\makebox(100,50){An English Text}}
>\fbox{\makebox(100,50)[t]{An English Text}}
>\fbox{\makebox(100,50)[b]{An English Text}}
>\fbox{\makebox(100,50)[lt]{An English Text}}
>\fbox{\makebox(100,50)[rt]{An English Text}}
>\fbox{\makebox(100,50)[lb]{An English Text}}
>\fbox{\makebox(100,50)[rb]{An English Text}}
>\fbox{\makebox(100,50)[lr]{An English Text}}
>\fbox{\makebox(100,50)[lrt]{An English Text}}
>\fbox{\makebox(100,50)[lrb]{An English Text}}
>\end{document}
خروجی آن به صورت زیر است:

چنانکه میبینید آرگومان تعیین کننده موقعیت متن درون جعبه میتواند ترکیبی از چند حالت باشد. ولی فقط این نکته را باید بگویم که ترکیب l و r در این شکل از دستور سبب قرار گیری متن در کل جعبه میشود. همانطور که میبینید در سه جعبه آخر، متن کشیده شده است تا به اندازه جعبه درآید. در انگلیسی این کار با فاصله انداختن بین کلمات حاصل میشود ولی در فارسی با قرار گیری ـ در بین حروف یک کلمه حاصل میشود.
نکته: اگر پهنای جعبه از پهنای خط بیشتر شود، متن درون جعبه به خط بعد منتقل نمیشود بلکه در همان خط قرار میگیرد و اگر پهنای جعبه خیلی بیشتر از پهنای خط باشد، در این صورت مقداری از متن بیرون از صفحه قرار میگیرد و هنگام چاپ، آن قسمتی که بیرون قرار میگیرد، چاپ نمیشود.
توجه: در فارسیتک l و r برای چیدمان متن درون جعبه، درست عمل نمیکنند. وقتی r را به کار میبرید، متن به وسط چپچین قرار میگیرد و وقتی l را به کار میبرید، متن به صورت راستچین قرار میگیرد!
دستور mbox\
این دستور شکل کوتاه شده دستور makebox\ است. این دستور آرگومان اختیاری ندارد. شکل کلی آن به صورت زیر است:
>\mbox{OBJ}
OBJ متنی است که میخواهد درون جعبه قرار گیرد.
در این دستور پهنای جعبه به اندازهای انتخاب میشود که به اندازه پهنای متن باشد. در واقع این دستور با دستور {makebox{OBJ\ هیچ تفاوتی ندارد ولی برای تایپ سریعتر بسیار کارآمد است.
از این دستور در فرمولهای ریاضی استفاده کردهاید. پس نیاز به بیان مثال برای این دستور نیست.
دستور newsavebox\
این دستور تولید مکانی برای نگهداری جعبه میکند. شما میتوانید با تولید یک مکان برای نگهداری جعبه، و قرار دادن جعبه در آن اطلاعات خوبی بدست آورید و در هر کجای سند که خواستید، آن جعبه را قرار دهید. در این صورت میتوانید به سرعت ایجاد سند بیفزایید.
شکل کلی دستور به صورت زیر است:
>\newsavebox{\boxname}
boxname\ نامی است که برای این مکان نگهدارنده جعبه در نظر میگیریم. این نام باید به گونهای انتخاب شود که دستور یا جعبهای قبلاً با این نام موجود نباشد.
دستور newbox\
شکل کلی این دستور به صورت زیر است:
\newbox\boxname
boxname\ نام مکانی است که برای نگهداری جهبه در نظر میگیریم.
دستور newbox\ و newsavebox\ دو دستور شبیه به هم هستند. تفاوت این دو دستور در خصوصیت نامی است که برای مکان در نظر میگیریم. در دستور newbox\ بررسی نمیشود که دستور یا جعبهای که قصد تعریف آنرا داریم، قبلاً تعریف شده است یا نه. ولی دستور newsavebox\ ابتدا بررسی میکند که چنین دستور یا جعبهای وجود دارد یا نه. اگر وجود داشته باشد، با پیغام خطایی به شما اخطار میدهد و در غیر این صورت، این مکان جدید را در نظر میگیرد.
من استفاده از دستور newsavebox\ را پیشنهاد میکنم.
دستور savebox\
این دستور برای قرار دادن یک متن در یک جعبهای که قبلاً با دستور newbox\ یا newsavebox\ تعریف شده است، به کار میرود.این دستور نیز دارای دو شکل است.
شکل کلی اول آن به صورت زیر است:
>\savebox{\boxname}[WID][POS]{OBJ}
boxname\ نام جعبهای است که قبلاً با یکی از دو دستور newbox\ یا newsavebox\ تعریف شده است.
WID بیان کننده پهنای جعبه است. اگر ذکر نشود، پهنای جعبه برابر با پهنای متن درون آن است.
POS تعیین کننده چیدمان متن درون جعبه است. که برای این شکل از دستور، یکی از مقدارهای l یا r یا c میتواند باشد. (با مقدارهای بجز l و r مانند c عمل میشود). اگر این آرگومان ذکر نشود، متن به طورت وسطچین چیده میشود. لازم به ذکر این نکته است که اگر WID را ذکر نکنید، نمیتوانید از این آرگومان استفاده کنید.
OBJ همان متن موردنظر است که میخواهید درون جعبه قرار دهید. این متن خود میتواند یک جعبه تولید شده توسط دستورهایی همچون makebox\ و mbox\ و ... باشد. توجه داشته باشید که اگر بخواهید جعبه mybox\ را درون جعبه mmybox\ قرار دهید، نمیتوانید از دستور {savebox{\mmybox}{\mybo\ استفاده کنید. بلکه باید به شکل دیگری عمل کنید که در ادامه توضیح میدهم.
شکل دوم این دستور به صورت زیر است:
>\savebox{\boxname}(X,Y)[POS]{OBJ}
boxname\ نام جعبه مورد نظر است که قبلاً تعریف شده است.
X بیان کننده پهنای جعبه است. در واقع پهنای این جعبه برابر خواهد بود با unitlenght\ ضربدر X.
Y نیر بیان کننده ارتفاع جعبه است. ارتفاع این جعبه برابر است با unitlenght\ ضربدر Y.
POS نیز بیان کننده موقعین متن در جعبه است. که میتواند l یا r یا c یا t یا b یا ترکیبی از آنها باشد که در دستور makebox\ کاملاً توضیح داده شد.
OBJ نیز متن مورد نظر است که باید درون جعبه قرار گیرد.
دستور sbox\
این دستور نیز برای ذخیره کردن جعبه در یک محل به کار میرود. شکل کلی آن به صورت زیر است:
>\sbox{\boxname}{OBJ}
boxname\ نام جعبهای است که قبلاً تعریف شده است و میخواهید متن درون آن قرار گیرد.
OBJ همان متنی است که میخواهید درون این جعبه قرار گیرد.
این دستور دقیقاً معادل دستور {savebox{\boxname}{OBJ\ است که برای راحتی کار تعریف شده است.
دستور usebox\
این دستور برای چاپ کردن جعبهای که قبلاً ایجاد و مقدار دهی شده است به کار میرود. دستورهای savebox\ و sbox\ هیچ مقداری را در خروجی چاپ نمیکردند ولی این دستور باعث تولید خروجی میشود.
شکل کلی آن به صورت زیر است:
>\usebox{\boxname}
boxname\ نام جعبهای است که میخواهیم در خروجی چاپ شود. این جعبه باید قبلاً تعریف شده باشد.
نکته: قبلاً گفتم که برای قرار دادن متن درون یک جعبه در جعبهای دیگر باید کد خاصی را به کار برد. دستور زیر سبب میشود که محتویات mybox\ درون mmybox\ قرار گیرد.
>\sbox{\mmybox}{\usebox{\mybox}}
اکنون مثالهای مربوط به دستورهای newsavebox\ و savebox\ و usebox\ را یکجا بیان میکنم.
مثال 3 :
کدهای زیر را در نظر بگیرید:
>\documentstyle{report}
>\newsavebox{\mybox}
>\newsavebox{\mmybox}
>\begin{document}
>\savebox{\mybox}(90,40)[lrt]{This is a sample}
>\noindent
>\fbox{\usebox{\mybox}}
>\fbox{\usebox{\mmybox}}\\
>\sbox{\mmybox}{\usebox{\mybox}}
>\fbox{\usebox{\mybox}}
>\fbox{\usebox{\mmybox}}
>\end{document}
خروجی آن به صورت زیر است:

مشاهده میکنید که دستور خط نهم سبب کپی شدن محتویات mybox\ در mmybox\ شد.
در مورد جعبهها، دستورهای دیگری نیز وجود دارند که به علت حجم بالای این پست، در پست بعدی به آنها میپردازم.
احساس کردم که مطالبم داره بیخود میشه! چون به جای جنبه کاربردی، جنبه محض داره. برای همین این لیست دستورهای تولید کننده الفبای یونانی (آلفا، بتا و ...) رو توی فارسیتک میگذارم. میتونید از اینجا دانلود کنید.
فایل PS با حجم 23KB
گاهی در فارسیتک میخواهید بفهمید که یک عدد زوج است یا فرد. مثلاً میخواهید بفهمید که در صفحهای قرار دارید که شماره آن زوج است یا فرد. این کار با شرط ifodd\ انجام میگیرد. این شرط مانند ifnum\ است. شکل کلی آن به صورت زیر است:
\ifodd num
True Case Commands
\else
False Case Commands
\fi
num همان عدد مورد نظر است.
True Case Commands دستوراتی هستند که در صورت فرد بودن عدد باید اجرا شوند.
False Case Commands دستوراتی هستند که در صورت زوج بودن عدد باید اجرا شوند.
توجه: دستوری به نام ifeven\ وجود ندارد تا تشخیص دهد که عدد زوج است. برای تشخیص زوج بودن عدد باید حتماً از دستور ifodd\ استفاده کنیم.
مثال:
قصد داریم دستوری بنویسیم که در صورت زوج بودن شماره صفحه، EVEN و در صورت فرد بودن شماره صفحه ODD را در خروجی چاپ کند.
\def\pagenumstatus{%
\ifodd \value{page}%
\IE{ODD}%
\else%
\IE{EVEN}%
\fi%
}
حال اگر دستور pagenumstatus\ را در هر کجای سند به کار برید، خروجی مطلوب حاصل میشود.
اما اصل مطلب:
برای گذاشتن پاورقی در سمت چپ در فارسیتک ابتدا فایل leftfootnote.sty را از اینجا دانلود کنید. سپس آنرا در سند فارسیتک خود وارد کنید. در هر کجا که خواستید پاورقی را در سمت راست قرار دهید، از دستور lfootnote\ به جای footnote\ استفاده کنید.
توجه: در دستور lfootnote\ نیز میتوانید با ارسال آرگومان اختیاری این دستور، مانند footnote\ خودتان شماره پاورقی را تعیی کنید.
در این دستور، شماره پاورقی نیز در سمت راست قرار میگیرد.
توجه: چون به طور معمول در قرار دادن پاورقیها در سمت چپ، پاورقیها عبارتهای انگلیسی هستند، من نیز در تعریف این دستور به طور پیشفرض عبارت پاورقی را انگلیسی تعریف کردهام. پس برای قرار دادن عبارت فارسی در پاورقی در سمت چپ باید عبارت فارسی را به عنوان آرگومان دستور {}IF\ در نظر بگیرید.
منظور از محیط ریاضی، محیط math نیست بلکه محیطی است که با $ شروع و به $ ختم میشود. و یا محیطی که با $$ شروع و با $$ پایان مییابد. بقیه محیطهای ریاضی مثل محیط math که در تعریف آنها از $ یا $$ استفاده شده است نیست همین خاصیت را دارند.
ifmmode\ نیز مانند شرطهای دیگر است و به صورت کلی زیر به کار میرود:
>\ifmmode
>True Case Commands
>\else
>False Case Commands
>\fi
True Case Commands و False Case Commands دستور یا دستورهایی هستند که به ترتیب در محیط ریاضی و در محیط غیر ریاضی اجرا میشود.
برای مثال دستورهای زیر را در نظر بگیرید:
>\documentstyle[farsi]{report}
>\def\ismathmode{\ifmmode\mbox{\IE{True}}\else\IE{False}\fi}
>\begin{document}
>$\ismathmode$\\
>\ismathmode
>\end{document}
مشاهده میکنید که اولین مقدار خروجی برابر True و دومی برابر False است.
کاربرد این شرط زمانی است که شما میخواهید از یک دستور مخصوص محیطهای ریاضی، در محیطهای معمولی استفاده کنید. اگر بخواهید از نوشتن $ های متوالی خلاص شوید، تنها راه استفاده از این شرط است. مثلاً شما میخواهید دستور frac\ را در متن معمولی استفاده کنید. برای استفاده در متن معمولی باید کدهای زیر را در هر بار استفاده بنویسید:
>$\frac{\mbox{Up Text}}{\mbox{Down Text}}$
اما اگر ffrac\ را به صورت زیر تعریف کنیم، از تایپهای بیمورد خلاص میشویم:
>\def\ffrac#1#2{
>\ifmmode
> \frac{#1}{#2}
>\else
> $\frac{\mbox{#1}}{\mbox{#2}}$
>\fi}
حال اگر دستور ffrac\ را چه در محیط ریاضی و چه در محیط های غیر ریاضی به کار بریم، با پیغام خطا مواجه نخواهیم. شد. البته حاصل این دستور در دو حالت کمی متفاوت است و آن به دلیل استفاده از mbox\ است.
توجه: شرط ifmmode\ فقط توسط خود برنامه تغییر مقدار میدهد و شما قادر نیستید مقدار آنرا تغییر دهید.
شکل کلی دستور ffootnoterule\ به صورت زیر است:
\ffootnoterule
شکل کلی دستور efootnotetule\ به صورت زیر است:
\efootnoterule
دستور اولی باعث میشود که خط جداکننده پاورقی در سمت راست صفحه کشیده شود و دستور دوم همین خط را در سمت چپ صفحه میکشد.
توجه: این دو دستور تغییرات را بر صفحه جاری و صفحههای بعد از آن اعمال میکنند و بر صفحههای قبلی تاثیری نخواهند داشت.
یک عیبی که این دستورها دارند این است که پهنای خط کشیده را برابر 4. ضربدر columnwidth\ قرار میدهد. (columnwidth\ نیز یکی از متغیرهای بُعد تعریف شده در فارسی تک است.)
برای رفع این عیب من پیشنهادی دارم و آن تعریف دستوری است که این قابلیت را داشته باشد. دستوری که در اینجا میگذارم، دارای برخی دستورات است که شما با آنها آشنا نیستید و در آینده با توضیح در مورد دستورهای فارسی تک، دلیل استفاده از این دستورات را میفهمید.
دستور را به صورت زیر تعریف کنید:
\def\DFRW{.4\columnwidth}
\def\DFRA{r}
\def\chfootnoterule{\@ifnextchar[ {\@chfootnoterule}{\@chfootnoterule[\DFRA]}}
\def\@chfootnoterule[#1]{\@ifnextchar[ {\@@chfootnoterule[#1]}{\@@chfootnoterule[#1][\DFRW]}}
\def\@@chfootnoterule[#1][#2]{%
\if #1l%
\lfootnoterule[#2]%
\fi
\if #1r%
\rfootnoterule[#2]%
\fi%
}
\def\lfootnoterule[#1]{%
\global\def\footnoterule{\kern-3\p@\hrule width #1\kern 2.6\p@}%
}
\def\rfootnoterule[#1]{%
\global\def\footnoterule{%
\hbox to \columnwidth{\beginR \vbox{\kern -3\p@\hrule width #1 \kern 2.6\p@}\hfil\endR}%
}%
}
دستور اصلی تعریف شده در این کدها، دستور chfootnoterule\ است (مخفف change footnote rule) که دارای شکل کلی زیر است:
\chfootnoterule[ALIGNMENT][WIDTH]
ALIGNMENT تعیین کننده تراز خط است. که میتواند r برای قرار گیری خط پاورقی در سمت راست و l برای قرار گیری خط پاورقی در سمت چپ باشد. مقدار این آرگومان به طور پیشفرض برابر با مقدار DFRA\ است. (DFRA مخفف Default Footnote Rule Alignment است.) مقدار پیشفرض برای DFRA\ برابر r است. توجه کنید که باید مقدر DFRA\ را با دستور def\ تغییر دهید. البته تغییر مقدار پیشفرض معمولاً حداکثر برای یکبار کافی است.
WIDTH تعیین کننده پهنای خط است. اگر میخواهید پهنای خط به اندازه پهنای متن باشد، میتوانید این آرگومان را برابر textwidth\ قرار دهید. مقدار پیشفرض این آرگومان برابر DFRW\ است. (DFRW مخفف Default Footnote Rule Width میباشد.) مقدار پیشفرض برای DFRW\ برابر با 4. ضربدر columnwidth\ است. توجه داشته باشید که DFRW\ یک متغیر بُعد نیست. تعریف نکردن DFRW\ به عنوان یک متغیر بُعد دلیل خاصی دارد. مقدار دهی DFRW\ نیز باید با دستور def\ انجام گیرد و معمولاً حداکثر برای یکبار کافی است.
توجه داشته باشید که chfootnoterule\ هر کجا به کار رود، تغییرهای حاصل از آن از صفحه جاری به بعد انجام میگیرد.
این دستور را بر اساس سلیقه خود میتوانید تغییر دهید و امکاناتی را به آن اضافه کنید. مثلاً میتوانید آرگومان دیگری به آن اضافه کنید تا با آن بتوانید ارتفاع (قطر) خط جداکننده پاورقی را تعیین کنید. اما این مطلب از حوصله این پست خارج است.
این دستورهای در فایلی تایپ شدهاند. این فایل را از اینجا دانلود کنید.
یکی دیگر از متغیرهای بُعد فارسیتک، parindent\ میباشد. این متغیر مقدار تورفتگی اولین خط هر پاراگراف را مشخص میکند. این متغیر هرکجا مقدار گیرد، تغییرات را بر روی پاراگراف بعدی انجام میدهد و بر پاراگرافهای قبلی و پاراگراف جاری تاثیری نخواهد داشت. با توجه به اینکه parindent\ یک متغیر بُعد است و در مورد این نوع متغیرها قبلاً به طور کامل بحث شد، نیاز به توضیح خاصی نیست.
توجه: parindent\ را با noindent\ اشتباه نگیرید. اولی یک متغیر بُعد و دومی یک دستور است. اما با قرار دادن parindent\ برابر صفر میتوان همان کاری را انجام داد که دستور noindent\ انجام میدهد.
نکته: گفتیم که parindent\ هرکجا مقدار دهیشود تغییر آن بر روی پاراگراف بعدی اعمال میشود ولی اگر مقدار parindent\ را به محض به کار بردن دستور par\ تغییر دهید، در این صورت بر همان پاراگراف نیز تاثیر خواهد داشت ولی اگر حتی یک کاراکتر (به غیر از کاراکتر فضای خالی) بین دستور par\ قرار گیرد، دیگر مقدار آن بر پاراگراف جاری تاثیر نخواهد داشت.
متغیر بُعد parskip\
یکی دیگر از متغیرهای بُعد، parskip\ میباشد. این متغیر فاصله میان دو پاراگراف متوالی را مشخص میکند. این متغیر هر کجا مقدارش تغییر کند، از آن پاراگراف به بعد تاثیر میگذارد.
مثال را از اینجا دانلود کنید.
چون 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\ مشخص میشود. اما در بیشتر موارد این دو با هم برابرند.
متغیرهای بُعد، نوعی از متغیرها در فارسی تک هستند که وظیفه نگهداری اندازه ها را بر عهده دارند. این متغیرها به غیر از اندازه، واحد را هم نگهداری می کنند. این مقدمه ای است برای مطرح کردن مبحث متغیرهای بُعد در فارسی تک.
تعریف متغیرهای بُعد:
متغیرهای بُعد به صورت زیر تعریف می شوند:
\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 ) تعریف شده اند.
نیاز به مثال اضافی احساس نمی شود. در صورت نیاز در قسمت نظرات مطرح فرمایید.
دستوری که در این پست قصد معرفی ان را دارم، دستوری برای چاپ اعداد به فرم فارسی یا انگلیسی در فارسی تک است. این دستور شاید به تنهایی کاربرد نداشته باشد ولی در یکی از پست های آینده که در مورد متغیرهای بٌعد در فارسی تک است بسیار کارآمد خواهد بود.
شکل کلی این دستور به صورت زیر است:
>\number num
که در این دستور num همان عددی است که می خواهید در خروجی چاپ شود. توجه کنید که این دستور از سری دستورهایی است که نیاز به آکولاد ندارد. یعنی باید به همین شکلی که در بالا نوشته شده است، تایپ شود.
توجه داشته باشید که num باید یک عدد باشد و نمی تواند شمارنده یا متغیر نوع یا هر چیز دیگری باشد.
اگر بخواهیم مقدار شمارنده mycounter را در خروجی چاپ کنیم، یکی از راههایی که پیش رو داریم، استفاده از دستور زیر است:
>\number \value{mycounter}
قبلاً گفتیم که mycounter یک عدد نیست ولی دستور value\ یک عدد تولید می کند. همچنین نمی توان از دستور arabic\ استفاده کرد. چون این دستور فقط مقدار را به خروجی می برد و عدد تولید نمی کند.
در پست مربوط به متغیرهای بُعد خواهید دید که این دستور چقدر کار را راحت می کند.
نکته: اینکه خروجی تولید شده در این دستور، یک عدد فارسی باشد یا انگلیسی، بستگی به محیط خط این دستور ندارد. اگر می خواهید خروجی به صورت اعداد انگلیسی باشد، باید از دستور english\ قبل از این دستور استفاده شود تا فونت جاری برای اعداد در فارسی تک، به فونت انگلیسی تغییر یابد و خروجی، اعداد انگلیسی باشند. در واقع این دستور اعداد را با همان فونتی که برای چاپ اعداد جاری در فارسی تک تعریف شده است، به خروجی می برد.
نیازی به مثال برای این پست احساس نمی شود. در صورت نیاز، در قسمت نظرات مطرح نمایید.
شما در فارسی تک قادر هستید شرطهای جدیدی برای خود بسازید. برای ساختن شرط جدید باید از دستور زیر استفاده کرد.
>\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
مثلاً شما میخواهید دستوری داشته باشید که دارای دو آرگومان است. آرگومان اول اجباری و آرگومان دوم اختیاری است. (مانند دستور 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@\ امکان استفاده از { و } به عنوان آرگومان اول این دستور نیست، میتوان به جای { و } که مشخص کننده ابتدا و انتهای بلاک هستند، از دو دستور معادل آنها استفاده کرد. پس شما میتوانید دستورهایی تعریف کنید که آرگومان اختیاری داشته باشند ولی آرگومان اختیاری آنها بین { و } قرار گیرد! البته این کار پیشنهاد نمیشود.
این روش توسط جناب مصطفی ارائه شده است.
روش کار به این صورت است که شما فایلی که میخواهید در سند وارد کنید را در ویرایشگر فارسیتک نوشته و سپس در ویرایشگر نسخه 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}
سلام
نظر یادتون نره
در این پست قصد دارم به معرفی یکی دیگر از دستورات شرطی در 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@\ بیشتر برای ساختن آرگومان اختیاری برای دستورها به کار میرود. روش ساختن آرگومانهای اختیاری در پستهای بعدی مطرح میشود.
هوشمند سازی دستورها و محیط ها تنها با دستورات شرطی و حلقه ها صورت می گیرد. در این پست قصد نداریم به حلقه ها در فارسی تک بپردازیم و در این پست تنها یک نوه از شرطها را در فارسی تک بررسی می کنیم.
در فارسی تک مانند زبانهای برنامه نویسی می تواند اجرا یا عدم اجرای برخی دستورها را مشروط کنید. یعنی اینکه در صورتی که شرایط فراهم باشد، یکسری دستورها انجام گیرد و اگر شرایط فراهم نباشد، یک سری دستورهای دیگر انجام گیرد.
تنها تفاوت شرط در فارسی تک با شرط در زبانهای برنامه نویسی در این است که در زبانهای برنامه نویسی، تنها یک دستور برای کنترل اینکه شرط برقرار است یا نه، به کار می رود. ولی در فارسی تک، برای مقایسه هر چیزی، دستور مخصوصی وجود دارد. مثلاً برای مقایسه اعداد، یک دستور وجود دارد و یا برای مقایسه ابعاد دستوری دیگر. که این دستورات نمی توانند در جای یکدیگر واقع شوند. در این پست فقط به بررسی دستور مقایسه اعداد که یکی از ساده ترین انواع است می پردازیم.
شکل کلی دستور برای مقایسه اعداد به صورت زیر است:
>\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 هستند یعنی با ارسال آنها به عنوان آرگومان اول، متن راستچین چاپ میشود.
>\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\ در معرفی دستورها با آرگومانهای اختیاری استفاده میشود.
دستور 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 و در پایان عدد صفر را چاپ میکند.
برخی از دستورات قابل اجرا در فارسی تک نیستند. علت مشخص نیست ولی دستورات یا شمارنده ها یا متغیرهای بُعدی که در فارسی تک به همراه @ هستند، یا اجرا نمی شوند و اگر اجرا شوند، با پیغامهای متعدد همراه هستند. در این صورت تنها مجبور هستیم این دستورات را در فایلهای دیگر نوشته و آن فایل را در سند خود وارد کنیم.
وارد کردن یک فایل در فارسی تک با برخی مشکلات همراه است. اگر بخواهید یک فایل را در فارسی تک وارد کنید و در آن فایل کلمات فارسی وجود دارند، باید به صورت خاصی نوشته شوند. طرز نوشتن این کلمات مشخص نیست و فقط با روش آزمون و خطا می توان به نتیجه مطلوب دست یافت.
دیگر مشکل وارد کردن فایل در فارسی تک، محل وارد کردن فایل است. یعنی به خاطر برخی دستورات، مجبور هستیم که فایل را در جای خاصی وارد کنیم. در غیر این صورت با پیغام خطا مواجه می شویم.
وارد کردن فایل با دستور زیر انجام می گیرد:
>\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\ این است که در این حالت، شما می توانید هر دستوری را در فایل سبک به کار برید و به استفاده یا تعریف دستورهای همراه با @ مشکلی ایجاد نمی کند.
در صورت نیاز به مثال، در قمست نظرات مطرح نمایید.
قبلاً قرار شد که فایلهای کتابی که در اختیار دارم رو براتون بزارم. می تونید از اینجا دانلود کنید.
این رو بگم که این کتاب بیشتر در مورد تست ها و حل اونها بود. برای همین بسیاری از مطالب کتاب، تکراری بودند و مجبور شدم خیلی از مطالب رو حذف کنم. ولی هر جا که به دوستان کمک می کرد تا بیشتر با فارسی تک آشنا بشند رو حذف نکردم. این رو بدونید که اصل کاری همون moshi.sty هست. که البته دستورات توی این فایل به شکل اختصاری تعریف شده اند و ممکنه کمی گیج بشید.
فعلاً بای
با توجه به اینکه دوستان استقبال خوبی از دو مطلب قبل داشتند، امروز (زودتر از موعود) مطلب توپ رو می زارم. منتظر نظرات شما دوستان هستیم.
در ضمن اگه رنگ آبی به کار رفته برای دستورات مناسب نیست، بگید تا عوض کنم.
شمارنده های برای نگهداری برخی مقادریر عددی تعریف می شوند. یک شمارنده عدد را بدون واحد ذخیره می کند ولی این در صورتی است که یک متغیر بُعد، اندازه و واحد را با هم نگهداری می کند. پس نمی توان آنها را به جای هم به کار برد. (البته اختلاف های دیگری هم دارند.)
تعریف شمارنده جدید:
اما یک شمارنده به صورت زیر در فارسی تک تعریف می شود:
>\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 و ... را نام برد که توضیح درباره آنها از حوصله این پست خارج است.
با توجه با توضیحات داده شده در این پست و مثالهای زده شده، نیازی به مثال احساس نمی شود. در صورت لزوم در قسمت نظرات ذکر کنید.
در فارسی تک، چندین محیط برای نوشتن فرمولها وجود دارد.
حال اگر بخواهید یک سری محاسبات ریاضی را در فارسی تک به در پاراگرافی جدید بنویسید، چندین راه پیش رو دارید. حال اگر بخواهید محاسبات ریاضی، علاوه بر اینکه در یک پاراگراف جدید چاپ شوند، در سمت راست چپ نیز نوشته شوند، فقط یک راه دارید. بقیه راهها چاره ساز نیستند. این راه، تعریف یک محیط جدید با خصوصیات دلخواه شماست.
در یکی از مطالب قبلی، روش تعریف یک محیط جدید در فارسی تک به طور کامل گفته شد و دیگر نیازی به بحث در مورد تعریف محیط جدید احساس نمی شود.
من برای رسیدن به هدفم که در بالا ذکر شد، محیطی به نام 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\ که در شرایط خاصی قابل حذف اند، بقیه دستورات را نمی توان حذف کرد. چون ممکن است سبب مشکلاتی گردند) و یا اینکه آنرا هوشمند سازید. ( در آینده به این مطلب می پردازیم)
سلام بر همگی
من تقریباً هر هفته یه بار، یه مطلب توپ در مورد فارسی تک می زارم. مطالب کم و جزئی هم هر وقت شد می زارم. برای اینکه باعث دلگرمی من بشید، توی قسمت نظراتف نظر خودتون رو بگید. اگه سوالی هم بود همون جا مطرح کنید.
با توجه به اینکه روش تعریف محیط جدید در فارسی تک، قبلاً مورد بررسی قرار گرفت، تعریف دستور جدید در فارسی تک به آسانی انجام می گیرد. در بیشتر منابع آموزشی 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 آرگومانی نیز به همین صورت فراخوانی می شوند.
با توجه به اینکه امکان نمایش حالت نوشته در اینجا امکان پذیر نیست، کلیه مثالها را از اینجا دانلود کنید.
شاید این نکته که می خواهم بنویسم، نکته مهمی نباشد ولی برای کسانیکه می خواهند در فارسی تک سریع تایپ کنند (مخصوصاً تایپیست های کتابهای ریاضی) مفید است.
در فارسی تک، گاهی لازم می شود تا یک متن انگلیسی را در بین دو دستور InE\ و EnE\ قرار دهیم، یعنی برای چاپ شدن عبارت text در خروجی، باید از دستور زیر استفاده کنیم:
>\InE text \EnE
به جای این کار می توان از دستور زیر استفاده کرد:
>\IE{text}
این دستور توسط نویسندگان فارسی تک، در فارسی تک گنجانده شده است و شما نیاز به تعریف آن ندارید (هر چند که تعریف این دستور کار بسیار آسانی است)
اگر بخواهید برای عبارت فارسی نیز این کار را انجام دهید، دستور زیر را استفاده کنید:
>\IF{عبارت فارسی مورد نظر}
فکر می کنم نیازی به مثال نباشد. در صورتی که نیاز به مثال در این زمینه دارید، در قسمت نظرات بنویسید.
سلام
من مطالب قبلی وبلاگ رو خوندم و دیدم که آقا وحید یه توضیح مختصر در مورد تعریف محیط جدید دادند. حالا با اجازه ایشون، توضیحی کامل در مورد تعریف محیط جدید و استفاده ازش در اینجا می زارم. امیدوارم مفید واقع بشه.
تعریف محیط جدید:
یک محیط جدید در فارسی تک به صورت زیر تعریف می شود:
>\newenvironment{name}[num]{before}{after}
name همان نام محیطی است که می خواهید تعریف کنید. این نام نباید نام هیچ محیط و یا دستوری باشد که وجود دارد. توجه داشته باشید که چون فارسی تک به بزرگی و کوچکی حروف حساس است پس باید در انتخاب نام محیط و استفاده اط محیط دقت داشت که کوچکی و بزرگی نام محیط رعایت شود.
num تعداد آرگومانهای این محیط را مشخص می کند. تعداد آرگومانهای یک محیط عددی بین 0 تا 9 می باشد. اگر تعداد آرگومانهای ذکر نشود، فارسی تک به طور پیش فرض، تعداد آرگومانهای محیط را صفر در نظر می گیرد.
before دستور یا دستوراتی هستند که هنگامیکه اعلام شروع این محیط را می کنید، اجرا می شوند. در واقع این دستورات جایگزین دستور شروع محیط می گردند. این آرگومان می تواند بدون هیچ دستوری باشد. اگر محیط شما دارای آرگومان است، برای استفاده از آرگومانها باید از num# استفاده کنید. که نام شماره آرگومان مورد نظر است. مثلاً برای استفاده از آرگومان اول، باید بنویسید 1# و یا برای استفاده از آرگومان دوم باید بنویسید 2# .
after دستور یا دستوراتی هستند که هنگامی که اعلام پایان محیط می کنید، اجرا می شوند. این آرگومان نیز می تواند حاوی هیچ دستوری نباشد.
توجه: گاهی باید جای دستورات را در آرگومان before تغییر داد تا نتیجه مطلوب بدست آید. این نکته برای آرگومان after نیز صادق است. (در مثال به این حالت بر می خوریم)
محیط جدید می تواند در هر جای سند تعریف شود. ولی باید تعریف آن قبل از اولین استفاده از محیط قرار گیرد. پیشنهاد من به شما این است که این محیط را در یک فایل متنی دیگر تعریف کرده و سپس از آن استفاده کنید. ( روش تعریف و استفاده از فایلهای دیگر در فارسی تک در پست های بعدی آورده خواهد شد. چون اکنون روش این کار را نمی دانید، تعریف محیط جدید را در بین دو دستور ...documentstyle\ و دستور شروع سند قرار دهید.)
استفاده از محیط جدید:
برای استفاده از محیطی با نام name که هیچ گونه آرگومانی ندارد به صورت زیر عمل می کنیم:
>\begin{name}
>command and text
>\end{name}
command and text دستورات و یا متنی است که می خواهید تحت تاثیر آن محیط قرار گیرند.
همه شما با نحوه استفاده از محیط های بدون آرگومان آشنا هستید. ولی ممکن است با نحوه استفاده از محیط هایی که دارای آرگومان هستند، آشنا نباشید. برای مثال محیط tabular، یک محیط با یک آرگومان است. برای استفاده از محیط های یک آرگومانی به صورت زیر عمل می کنیم:
>\begin{name}{arg1}
>command and text
>\end{name}
command and text دستورات و یا متنی است که می خواهید تحت تاثیر آن محیط قرار گیرند.
arg1 همان آرگومان اول این محیط است.
برای استفاده از محیط های دو آرگومانی به صورت زیر عمل می کنیم:
>\begin{name}{arg1}{arg2}
>command and text
>\end{name}
command and text دستورات و یا متنی است که می خواهید تحت تاثیر آن محیط قرار گیرند.
arg1 همان آرگومان اول این محیط است.
arg2 همان آرگومان دوم این محیط است.
برای محیطهای 3 تا 9 آرگومانی نیز مانند محیطهای 1و 2 آرگومانی عمل می کنیم.
اکنون به بیان چند مثال می پردازیم.
مثال 1: (محیط بدون آرگومان)
همانطور که می دانید، در فارسی تک برای قرار دادن یک پاراگراف انگلیسی باید از دستورات زیر استفاده کرد:
>\english
>\begin{center}
>The Paragraph
>\end{center}
>\farsi
حال می خواهیم با تعریف یک محیط جدید، خود را از نوشتن این دستورات راحت کنیم. محیط جدیدی به نام EnCenter که مخفف EnglishCenter است به صورت زیر تعریف می کنیم: (در مورد محل تعریف این محیط قبلاً بحث شده است)
>\newenvironment{EnCenter}{\english\begin{center}}{\farsi\end{center}}
و سپس در هر کجای سند که خواستید از محیط می توانید به صورت زیر استفاده کنید. مثلاً می خواهیم عبارت Hello World را در وسط صفحه چاپ کنیم. برای این کار از دستورات زیر استفاده می کنیم:
>\begin{EnCenter}
>\Hello World.
>\end{EnCenter}
حال نتیجه را مشاهده کنید. خواهید دید که نتیجه بدست آمده، همان نتیجه دلخواه شماست.
همانطور که قبلاً در نکته ذکر شد، گاهی لازم است ترتیب قرار گیری دستورات در تعریف محیط جدید، تغییر یابد تا نتیجه حاصل آن چیزی باشد که مطلوب ماست. مثلاً اگر در تعریف محیط EnCenter دستور farsi\ را بعد از دستور {end{center\ قرار دهیم، نتیجه چیز دیگری خواهد بود. این در صورتی است که در حالت معمولی که در ابتدای مثال آنرا بیان کردیم، این جای این دو دستور به شکل دیگری است.
مثال 2: (محیط یک آرگومانی)
در ابتدا این نکته را متذکر می شوم که آرگومانهای محیط چندان کاربرد ندارد. اما بیشتر زمانی مورد استفاده قرار می گیرند که نیاز به محیط هوشمند باشد. مثلاً محیط tabular در فارسی تک را در نظر بگیرید. این محیط، یک محیط یک آرگومانی است. (در واقع دو آرگومانی است که یک آرگومان آن اجباری و دیگری اختیاری است. در این پست، هدف ما فقط آرگومان اجباری محیط ها است و در پستی دیگر، به آرگومانهای اختیاری در محیطها نیز می پردازیم.) این آرگومان مشخص می کند که چیدمان عناصر جدول چگونه باشد و در کجا نیاز به خط افقی است. هوشمند کردن یک محیط نیاز به دستورات شرطی دارد که در پستی دیگر به آن پرداخته خواهد شد.
می خواهیم محیطی تعریف کنیم که یک پاراگراف فارسی را گرفته و اولین خط آنرا به فاصله ای که دلخواه ماست از سمت راست چاپ کند.
محیط را به صورت زیر تعریف می کنیم:
\newenvironment{NewFaPar}[1]{\farsi\par\noindent\hspace{#1}}{\par}
همانطور که می بینید، نام این محیط NewFaPar است و یک محیط یک آرگومانی است. این آرگومان، بیان کنند میزان فاصله اولین خط پاراگراف مورد نظر از سمت راست است. به نحوه استفاده از آرگومان اول دقت کنید. همانطور که می بینید، در هنگام استفاده از این محیط، باید آرگومان این محیط همراه با یکی از واحدهای شناخته شده در فارسی تک باشد.
برای استفاده از این محیط به صورت زیر عمل می کنیم ( علامت < یعنی حالت خط انگلیسی است و علامت > یعنی حالت خط فارسی است.)
>\begin{NewFaPar}{2cm}
> نرم افزار حروف چینی \FarsiTeX بهترین نرم افزار برای حروف چینی مقالات و کتابهای است \ldots
>\end{NewFaPar}
بعد از اجرای سندی که حاوی مثال بالاست مشاهده می کنید که اولین سطر این پاراگراف، به اندازه 2 سانتی متر از خطوط دیگر جلوتر است.
برای این مبحث دو مثال گذاشته ام که می توانید از اینجا دانلود کنید.
این مطلب مربوط به فارسی تک قدیمی (آخرین نسخه ارائه شده قبل از farsitex 1.0 pre 1) است. ممکن است این دستورات در نسخه جدید فارسی تک هم کار بدهند.
شاید تا کنون خواسته باشید متنی را به صورت ایرانیک و سیاه بنویسید. برای این کار نمی توانید از دستور iranic \siah\ استفاده کنید. چون با دستور siah\ شما به فارسی تک می گویید که فونتی را می خواهید که به صورت سیاه مطالب را به خروجی می برد و با استفاده از دستور iranic\ ، شما به فارسی تک می فهمانید که فونتی را می خواهید که به صورت ایرانیک مطالب را در خروجی چاپ می کند. در واقع برای هر حالت فونت، یک فونت تعریف شده است. پس باید از دستورات برای انتخاب فونت مناسب استفاده کنید. در زیر لیست این دستور ات را می نویسم:
>\nazok
>\iranic
>\siah
>\khabide
>\siahir
>\siahkh
>\tookhali
>\sayedar
>\tahrir
دستورات ایرانیک، سیاه، خوابیده، توخالی و سایه دار برای همه شما آشنا هستند. ولی چهار دستور نازک، siahir\ و siahkh\ و تحریر برای شما تازگی دارند. (دستورات بالا را من برای راحتی در آموزش، به صورت حالت خط انگلیسی نوشتم ولی شما می توانید این دستورات را چه در حالت خط فارسی و چه در حالت خط انگلیسی تایپ کنید.)
دستور nazok\ فونت را به همان حالت معمولی بر می گردارند. همان حالتی که قبل از استفاده از یکی از دستورات تغییر دهنده فونت، به طور پیش فرض وجود دارد.
دستور tahrir\ نیز فونت را به حالت تحریر می برد. چنانچه که دیده می شود در فونت فارسی، فرقی دستور نازک و دستور تحریر نیست!
دستور siahir\، متن را هم به صورت ایرانیک و هم به صورت سیاه در می آورد.
دستور siahkh\، متن را به صورت هم خوابیده و هم سیاه در می آورد.
همانطور که برای فارسی این حالتها وجود دارد، برای متنهای انگلیسی هم حالتهایی برای فونت وجود دارد. در انگلیسی دستورات rm\ و bf\ و it\ و tt\ و sl\ به ترتیب معادل دستورات نازک، سیاه، ایرانیک، تحریر و خوابیده هستند. البته it\ همان ایتالیکی است که برای تایپ فرمولها در حالت ریاضی به کار می رود. و دستور tt\ بر خلاف فونت فارسی، خروجی متفاوتی با دستور rm\ تولید می کند!
ذکر این نکته نیز ضروری است که از دستورات بالا که برای متون انگلیسی بیان شدند، در متون فارسی نیز استفاده کرد (چون نویسندگان فارسی تک، برای زبان فارسی نیز این دستورات را تعریف کرده اند)
فکر نکنم نیاز به مثال باشد. اگر نیاز بود، در قسمت نظرات بگویید تا مثالی در این مورد نیز بگذارم.
-----------
انگار من که سرم شلوغه، بیشتر از بقیه دوستان اینجا مطلب می زارم!!!!!![]()
برای نوشتن یک متن در بالای علائمی چون مساوی، نتیجه می دهد و ... می توان از دستور زیر استفاده کرد:
>\stackrel{text}{symbol}
این دستور، عبارت text را در بالای symbol قرار می دهد.
مثلا دستور زیر سبب تولید یک علامت مساوی می شود که در بالای آن عبارت Hop نوشته شده است:
>$\stackrel{Hop}{=}$
اگر عبارتی که می خواهید در بالای علامت مساوی بنویسید، بزرگتر از پهنای مساوی باشد می توانید با چاپ کردن دو یا سه یا تعداد بیشتری مساوی در کنار هم، مساوی بزرگتری داشته باشید. البته باید فاصله بین هر دو مساوی متوالی را 2pt- انتخاب کنید تا مساوی ها کاملاً به هم بچسبند.
برای مثال دستور زیر سبب تولید دو مساوی به هم چسبیده می شود که در بالای آنها عبارت Hop نوشته شده است:
>$\stackrel{Hop}{=\hspace{-2pt}=}$
و یا برای تولید سه مساوی در کنار هم می توان از دستور زیر استفاده کرد:
>$\stackrel{Hop}{=\hspace{-2pt}=\hspace{-2pt}=}$
برای تولید علامت نتیجه می دهد بزرگتر، می توان از دستور زیر استفاده کرد:
>$\stackrel{Hop}{=\hspace{-2pt}=\hspace{-2pt}\Longrightarrow}$
مثال را از اینجا دانلود کنید.
شاید تا کنون خواسته باشید در فارسی تک، برای نمایش مجموعه اعداد حقیقی، از نماد آن استفاده کنید ولی نمی دانستید باید چه کنید. شاید برخی از دوستان از دستور Re\ استفاده کرده باشند. ولی زمانی که می خواهید مجموعه اعداد طبیعی، صحیح، گویا، گنگ و ... را نمایش دهید، دیگر دستوری در فارسی تک وجود نخواهد داشت که این کار را برای شما انجام دهد. در زیر روشی را می گویم تا با آن بتوانید تمام مجموعه اعداد را با مجموعه های هم نام آنها متمایز کنید.
ابتدا باید با دستور زیر برخی دستورات را به فایل فارسی تک خود اضافه کنید. این دستور را در هر کجای برنامه می توانید استفاده کنید به شرط آنکه خط در حالت انگلیسی باشد. ولی پیشنهاد من به شما این است که این دستور را در بین دو دستور documentstyle\ و {begin{document\ وارد کنید.
\input{amssym}
حال در هر کجای فرمول که خواستید، این دستور را به کار برید. این کار سبب می شود که عبارت داخل آکولاد به صورت تو خالی در سند درج گردد.
\Bbb{R}
توجه داشته باشید که فارسی تک به بزرگی و کوچکی حروف دستوراتش حساس است.
در دستور بالا R، کاراکتر یا کاراکترهایی است که می خواهید به صورت تو خالی در سند درج گردد. این کاراکترها باید در فرم بزرگ خود باشند. مثلاً اگر به جای R تایپ کنید r، یا نتیجه ای دربر نخواهد داشت یا اینکه نتیجه چیز دیگری است.
شاید برخی دوستان بگویند که «دستور دیگری نیز برای نوشتن توخالی کاراکترها وجود دارد. پس دیگری نیازی نیست که از این دستور استفاده کنیم!». در جواب باید گفت که آن دستور که برای توخالی نوشتن کاراکترها می باشد، فقط برای متون فارسی کاربرد دارد و امکان استفاده از آن در محیط های ریاضی نیست. (می توانید امتحان کنید)
پیشنهاد می کنم که با استفاده از دستور def\، دستورهای دیگری تعریف کنید که به جای تایپ ${Bbb{R\$، برای مثال تایپ کنید $R\$.
این مثال را دانلود کنید.
------------
من وقت ندارم که با فارسی تک زیاد کار کنم تا نکات جدید از فارسی تک بفهمم ولی آنچه که بلدم رو توی این وبلاگ می زارم تا دوستان دیگه هم استفاده کنند.
امیدوارم که ایم مطلب هم براتون مفید باشه.
من تازه به نویسندگان این وبلاگ اضافه شدم. امیدوارم مطالبم مفید باشه.
---------------------------------
گاهی اوقات، باید به فارسی تک بفهمانید که از سایز مناسب برای فونت استفاده کند. در این صورت باید از دستور زیر استفاده کنید.
\displaystyle
این دستور باید قبل از عبارتی قرار گیرد که می خواهید اندازه فونت در مورد آن رعایت شود.
ابتدا کمی توضیح و سپس یک مثال می گذارم.
ابتدا دو دستور زیر را در محیط ویرایشگر فارسی تک تایپ کنید.
>$$\frac{\frac{a}{2}}{3}$$
>$$\frac{\frac{\displaystyle a}{2}}{3}$$
اگر هر دو خروجی حاصل را مقایسه کنید، مشاهده می کنید که حرف a در خروجی حاصل از دستور اول، کوچکتر از a در خروجی حاصل از دستور دوم است. این به خاطر استفاده از displaystyle\ قبل از حرف a است.
شاید درباره توضیح بالا بگویید که زیاد مهم نیست که حرف a کوچکتر باشد. حال دستور زیر را اجرا و خروجی را مشاهده کنید:
>$\lim_{x\to 0}f(x)$
مشاهده می کنید که نماد x به سوی صفر میل کند، به جای اینکه زیر lim قرار گیرد، به صورت اندیس ظاهر شده است. حال دستور زیر را اجرا و خروجی را مشاهده کنید.
>$\displaystyle\lim_{x\to 0}f(x)$
مشاهده می کنید که تنها تفاوت این دستور با دستور قبلی، تنها در دستور displaystyle\ است و خروحی حاصل، آن چیزی است که مطلوب ما است. یعنی نماد x به سوی صفر میل کند، در زیر lim قرار گرفته است.
همانطور که قول داده بودم یک مثال می گذارم. از اینجا دانلود کنید.
فارسی تک دستوری به نام \arcsin یا \arctan در محیط ریاضی نداره ولی شما می تونین هر تابع ریاضیی که دلتون خواست در فارسی تک تعریف کنین. ببینین:
\def\arcsin{\mathop{arcsin}}
\def\arccos{\mathop{arcos}}
\def\myfunction{\mathop{my function}}
اگه می خواین با فارسی تک سوالات چهار گزینه ای یا پنج گزینه ای طراحی کنین می تونین از سبک کتاب "المپیاد ریاضی ایران" انتشارات دانشگاه شریف استفاده کنین. پس برین اینجا.
فعلا خداحافظ...
معمولا در بعضی از اعلامیه ها و یا مقالات یک کادر می کشند که مثلا سایه دار است.مثال زیر به آموزش کشیدن این کار می پردازه.
{article}[farsi,fancybox]documentstyle\
{document}begin\
}vbox\}shadowbox\
{center}begin\
متن مورد نظرتون
{{{center}end\
توصیه می کنم به فایل WSHOP.ftx که از اینجا قابل دانلوده یه نگاهی بندازین. اگه هم خروجی این فایل رو می خواین اینجا و اونجا! رو کلیک کنین.
فعلا خداحافظ...
تنظیمات صفحه بندی همانطور که معلومه برای تنظیم صفحه بندیه! مثلا فاصله از حاشیه ها، فاصله بین پاراگرافها و ... . این دستورات معمولا در مقدمه ی پرونده قرار می گیرن. به مثال زیر دقت کنین:
\addtolength{\textwidth}{4cm{
\addtolength{\textheight}{2cm}
\addtolength{\topmargin}{-2cm}
\addtolength{\oddsidemargin}{-1cm}
اولین دستور به پهنای متن 4 سانتیمتر اضافه می کنه. دومین دستور به ارتفاع متن 2 سانتی متر اضافه می کنه. سومین دستور از حاشیه ی بالایی 2 سانتی متر کم می کنه و آخرین دستور هم از حاشیه ی چپ صفحات فرد 1سانتیمتر می کاهد. برای اطلاعات بیشتر هم به راهنماهای LaTeX مراجعه کنین.
حالا به آموزش افزودن عبارات فارسی در محیط ریاضی می پردازم. مثلا اگر بخواهیم در محیط ریاضی به جای lim از "حد" استفاده کنیم، از دستور زیر باید کمک بگیریم:
\def\had}\hbox{حد}{
حالا مثلا می تونیم با دستور $\had_{n\rightarrow 2}x^2=4$ به جای lim از حد استفاده کنیم.
فعلا خداحافظ...
فارسی تک دو زبان برای تایپ فرمول ریاضی داره. برای رفتن به حالت انگلیسی باید ابتدا باید دستورات زیر رو تایپ کرده و سپس فرمول خود رو بنویسین:
\english
\mathenumber
این ابزار از فایل با فرمت dvi به طور مستقیم خروجی pdf تولید می کنه و در اکثر ورژن های MiKTeX موجوده. دستورش هم به صورت روبرو هست: dvipdfm file.dvi . این ابزار در شاخه ی MiKTeX\miktex\bin موجوده. اگه می خواین dvipdfm با یه رزلوشن خاص فایل pdf رو تولید کنه، از دستور زیر استفاده کنین:
dvipdfm –r file.dvi
ابتدا در مقدمه ی پرونده تون دستورات زیر رو درج کنین:
\def\etoday{ \english\ifcase\month\or January \or February \or March \or April
\or May \or June \or July \or August \or September \or October \or
November \or December \fi \space\number\day, \number\year}
حالا اگه هر جای پرونده تون دستور \etoday رو بنویسین روز و ماه و سال میلادی رو درج می کنه.
فعلا خداحافظ...
سلام. سال نو مبارک. یک مثال از قرار دادن عکس در زمینه ی پرونده ی خروجی فارسی تک در زیر آمده است:
\documentstyle[persian,fgraphix]{article}
\thispagestyle{empty}
\english
\addtolength{\topmargin}{-5mm}
\centerline{\includegraphics{figure.eps}}
\vskip -190mm
\addtolength{\topmargin}{5mm}
\persian
\centerline{\Large عنوان }
\vskip 10mm
\centerline{\LARGE یک متن دلخواه}
فعلا خداحافظ...