دستور 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\ را قبل از تعریف دستور یاد شده به کار ببریم.
کاربرانی که در فارسی تک به تایپ فرمولهای ریاضی پرداختهاند، میدانند که وقتی شما از دستور lim\ در محیطهای ریاضی استفاده کنید، زیر وند آن به جای اینکه در زیر کلمه lim نوشته شود، در سمت راست پایین این کلمه قرار میگیرد. این مشکل در محیطهای ریاضی که با $$ شروع میشوند اتفاق نمیافتد.
قبل از تعریف مجدد دستور lim\ باید تصمیم بگیرید که عبارت قرار گرفته در جلوی دستور lim\ به چه صورت باشد. وقتی شما از دستور frac\ در در بین دو $ استفاده میکنید، اندازه فونت مورد استفاده برای صورت و مخرج کسر تغییر میکند و کوچکتر میشود. اما اگر از همین دستور در بین دو $$ استفاده کنید، دیگر این تغییر اندازه انجام نمیگیرد! پس قبل از تعریف مجدد دستور باید تصمیم بگیرید که دستور lim\ به کدام سبک عمل کند. (هر دو روش در این پست گفته میشود.)(البته قبلاً راهی توسط خودم برای رفع این مشکل ارائه شده بود ولی تعریف دوباره دستور lim\ راحتترین راه ممکن است.)
تعریف مجدد دستور lim\ (حالت اول):
برای این حالت دستور lim\ را چنان تعریف میکنیم که اگر دستور frac\ بعد از دستور lim\ استفاده شود، تغییر اندازه فونت اعمال شود. من استفاده از همین حالت را پیشنهاد میکنم. چون فرمولهایی که در بین دو $ قرار میگیرند، اکثراً در بین مطالب فارسی استفاده میشوند و عدم اعمال تغییر اندازه فونت سبب زشت شدن متن تایپ شده میشود. شما میتوانید دستور lim\ را به همین حالت تعریف کنید و در مواقعی که نیاز دارید این دستور مانند حالت دوم عمل کند، از دستور displaystyle\ در قبل از دستور lim\ استفاده کنید.
برای حالت اول lim\ را به صورت زیر تعریف کنید:(کدهای حالت اول از کدهای حالت دوم بیشتر است.)
\makeatletter
\let\@oldlim=\lim
\def\@subscript_#1{\@ifnextchar ^ {\@subsuperscript_{#1}}{\bgroup\displaystyle\@oldlim_{#1}\egroup}}
\def\@superscript^#1{\@ifnextchar _ {\@supersubscript^{#1}}{\bgroup\displaystyle\@oldlim^{#1}\egroup}}
\def\@subsuperscript_#1^#2{\bgroup\displaystyle\@oldlim_{#1}^{#2}\egroup}
\def\@supersubscript^#1_#2{\bgroup\displaystyle\@oldlim^{#1}_{#2}\egroup}
\def\lim{\@ifnextchar _ {\@subscript}{\@ifnextchar ^ {\@superscript}{\bgroup\displaystyle\@oldlim\egroup}}}
استفاده از این همه کد به علت مشکلهایی است که خود LaTeX (یا TeX) ایجاد میکند.
تمام دستورهای مورد استفاده در این کد، قبلاً در وبلاگ معرفی شدهاند(به جز یک مورد). با این حال من از تشریح کد خودداری میکنم. (در صورت نیاز تشریح کد در قسمت نظرات مطرح کنید یا با ایمیل به من اطلاع دهید.)
مثال:
کدهای زیر را در یک سند فارسیتک تایپ کنید:
>\documentstyle[farsi]{article}
>\begin{document}
>$\lim_{x\to\infty}\frac{1}{x}$\par
>\makeatletter
>\let\@oldlim=\lim
>\def\@subscript_#1{\@ifnextchar ^ {\@subsuperscript_{#1}}{\bgroup\displaystyle\@oldlim_{#1}\egroup}}
>\def\@superscript^#1{\@ifnextchar _ {\@supersubscript^{#1}}{\bgroup\displaystyle\@oldlim^{#1}\egroup}}
>\def\@subsuperscript_#1^#2{\bgroup\displaystyle\@oldlim_{#1}^{#2}\egroup}
>\def\@supersubscript^#1_#2{\bgroup\displaystyle\@oldlim^{#1}_{#2}\egroup}
>\def\lim{\@ifnextchar _ {\@subscript}{\@ifnextchar ^ {\@superscript}{\bgroup\displaystyle\@oldlim\egroup}}}
>$\lim_{x\to\infty}\frac{1}{x}$
>\end{document}
خروجی به صورت زیر است:

تعریف مجدد دستور lim\ (حالت دوم):
برای این حالت دستور lim\ را چنان تعریف میکنیم که اگر دستور frac\ بعد از دستور lim\ قرار گیرد، تغییرات اندازه فونت برا صورت و مخرج آن اعمال نشود.
این تعریف مجدد به صورت زیر است:
\makeatletter
\let\@oldlim=\lim
\def\lim{\displaystyle\@oldlim}
مثال:
کدهای زیر را در محیط ویرایشگر فارسیتک تایپ کنید:
>\documentstyle[farsi]{article}
>\begin{document}
>$\lim_{x\to\infty}\frac{1}{x}$\par
>\makeatletter
>\let\@oldlim=\lim
>\def\lim{\displaystyle\@oldlim}
>$\lim_{x\to\infty}\frac{1}{x}$
>\end{document}
خروجی به صورت زیر است:

این دستور سبب میشود که متن تعیین شده، در سمت چپ صفحه قرار گیرد. شکل کلی آن به صورت زیر است:
>\leftline{TEXT}
TEXT همان متن مورد نظر است که میخواهیم در سمت چپ قرار گیرد.
دستور rightline\
این دستور سبب میشود که متن تعیین شده، در سمت راست صفحه قرار گیرد. کلی آن به صورت زیر است:
>\rightlien{TEXT}
TEXT همان متن مورد نظر است.
دستور centerline\
با این دستور بیشتر از دو دستور قبلی آشنایی دارید. این دستور برای قرار دادن متن مورد نظر در وسط صفحه به کار میرود. شکل کلی آن به صورت زیر است:
>\centerline{TEXT}
TEXT همان متن مورد نظر است.
توجه: دستورهای centerline\ و leftline\ و rightline\ هم برای متنهای فارسی به کار میروند و هم برای متنهای انگلیسی.
توجه: این سه دستور برای متنهایی به کار میروند که کمتر از یک خط پهنا دارند. اگر متن مورد استفاده در این سه دستور بزرگتر از پهنای خط باشد، متن از خط بیرون میزند. همچنین در این سه دستور، \par معنی ندارد. همچنین \\ باعث رفتن به خط جدید نمیشود. بلکه تنها فاصله میاندازد.
توجه: قبل از به کار بردن این سه دستور، با دستور \\ یا \par خط را جدید کنید. در غیر این صورت متن قبل از این سه دستور و متن درون دستور در یک خط قرار میگیرند و پهنای آن خط، از یهنای بقیه خطها بیشتر میشود و در صورت زیاد بودن کلمات به کار رفته، متن از صفحه کاغذ بیرون میزند.
۱) در فارسی تک جدید، نمایه گذاری به ترتیب حروف الفبا انجام نمیشه.
۲) در فارسی تک جدید، به نظر میرسه دستوری برای تعیین سایز عکس وجود نداره(یا حداقل من نمی دونم)!
یک پروژه:
آیا کسی می تونه یه مبدل یونیکد به فارسی تک خوب بسازه(نه مثل قبلیا که خوب نبودن)؟ اگه کسی این کار رو کرد، به من خبر بده، چون در اون صورت میشه از یک ویرایشگر قدرتمند و یونیکد مثل TeXmaker برای تولید فایلهای ورودی در فارسی تک استفاده کرد.
در ضمن تا چند ساعت آینده، اون لینکهایی که مربوط به نصب فارسی تک روی MiKTeX2.5 بود، اصلاح میشه.
جعبهها در فارسیتک برای منظورهای خاصی به کار میروند. یک جعبه را میتوان قسمتی از صفحه گفت که از بقیه قسمتها جدا شده است. این تعریف آن چنان گویا نیست ولی در ادامه کمکم با این تعریف آشنا میشویم.
ویژگی مشترک بیشتر جعبهها این است که در آنها خط جدید و پاراگراف جدید معنی ندارد. یعنی شما در بیشتر جعبهها نمیتوانید به طور مستقیم به خط جدید یا پاراگراف جدید بروید و نیاز به دستورات خاصی برای این کار است.
برخی دستورهای مربوط به جعبهها عبارتند از:
دستور 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\ میباشد. این متغیر فاصله میان دو پاراگراف متوالی را مشخص میکند. این متغیر هر کجا مقدارش تغییر کند، از آن پاراگراف به بعد تاثیر میگذارد.
مثال را از اینجا دانلود کنید.
