این کار رو خیلی راحت میتونید با بسته bidi-atbegshi
انجام بدهید:
\documentclass{article}
\pagestyle{empty}
\usepackage{ptext}
\usepackage[calc]{picture}
\usepackage{bidi-atbegshi}
\usepackage{xepersian}
\settextfont{Yas}
\makeatletter
\AtBeginShipout{%
\AtBeginShipoutUpperRight{%
\setlength{\unitlength}{1mm}
\thicklines
\put(1in+\oddsidemargin-10mm,-1in-\topmargin-\headheight-\headsep+10mm){\line(1,0){\textwidth+20mm}}
\put(1in+\oddsidemargin-10mm,-1in-\topmargin-\headheight-\headsep+10mm){\line(0,-1){\textheight+20mm}}
\put(1in+\oddsidemargin-10mm,-1in-\topmargin-\headheight-\headsep-\textheight-10mm){\line(1,0){\textwidth+20mm}}
\put(1in+\oddsidemargin+\textwidth+10mm,-1in-\topmargin-\headheight-\headsep+10mm){\line(0,-1){\textheight+20mm}}
\ifnum\c@page=\@ne
\put(1in+\oddsidemargin-10mm,-1in-\topmargin-\headheight-\headsep-\mytopboxheight-5mm){\line(1,0){\textwidth+20mm}}
\fi
}
}
\makeatother
\begin{document}
\newsavebox\mytopbox
\newdimen\mytopboxheight
\setbox\mytopbox\vbox{%
\ptext[1]
}
\setlength{\mytopboxheight}{\ht\mytopbox}
\unvbox\mytopbox
\bigskip\bigskip\bigskip
\ptext[1-100]
\end{document}
توضیح کد
تصویر کلی که من از انجام این کار دارم اینه که میخواهم دور متن یک کادری بکشم که از خود متن (گوشههای چپ و راست و بالا و پایین بلاک متن) حدود ۱۰ میلیمتری فاصله داشته باشه. از اونجایی که وقتی کادر مستطیلشکل دور بلاک متن میکشم، احتیاجی نیست که شماره صفحه داشته باشم، شماره صفحه رو با دستور زیر پاک کردم:
\pagestyle{empty}
برای انجام محاسبات، از بسته زیر استفاده میکنم تا بتونم مختصات دستورات \put
و \line
رو بر حسب پارامترهایی مانند \textwidth
و \textheight
و غیره بدهم:
\usepackage[calc]{picture}
گزینه calc
به من اجازه میده تا جمع و تفریقهام رو به شکل راحتی انجام بدهم. کار کلی رسم کادر رو بسته bidi-atbegshi
انجام میده. من با این بسته روی چهار گوشه کاغذ میتونم هر چیزی که خواستم بگذارم. برای من راحتتر این بود که از گوشه بالا سمت راست کاغذ شروع کنم:
\AtBeginShipout{%
\AtBeginShipoutUpperRight{%
من \unitlength
رو برای راحتی به ۱ میلیمتر تغییر دادم:
\setlength{\unitlength}{1mm}
خطهای کادر میخواهم ضخیم باشه:
\thicklines
اول میخواهم خط افقی بالا رو رسم کنم. میخواهم ۱۰ میلیمتر از هر دو طرف متن فاصله داشته باشم:
\put(1in+\oddsidemargin-10mm,-1in-\topmargin-\headheight-\headsep+10mm){\line(1,0){\textwidth+20mm}}
خط عمودی سمت راست:
\put(1in+\oddsidemargin-10mm,-1in-\topmargin-\headheight-\headsep+10mm){\line(0,-1){\textheight+20mm}}
خط افقی پایین:
\put(1in+\oddsidemargin-10mm,-1in-\topmargin-\headheight-\headsep-\textheight-10mm){\line(1,0){\textwidth+20mm}}
خط عمودی سمت چپ:
\put(1in+\oddsidemargin+\textwidth+10mm,-1in-\topmargin-\headheight-\headsep+10mm){\line(0,-1){\textheight+20mm}}
برای کشیدن خط افقی متن برای اینکه دقیقاً ۵ میلیمتر پایین متن کشیده بشه متن را داخل یک \vbox
قرار میدهم تا ارتفاع متن رو بدونم و بعدش متن رو قرار میدهم:
\newsavebox\mytopbox
\newdimen\mytopboxheight
\setbox\mytopbox\vbox{%
\ptext[1]
}
\setlength{\mytopboxheight}{\ht\mytopbox}
\unvbox\mytopbox
فقط در صورتی که در صفحه اول باشم، باید این خط افقی پایین متن کشیده بشه:
\ifnum\c@page=\@ne
\put(1in+\oddsidemargin-10mm,-1in-\topmargin-\headheight-\headsep-\mytopboxheight-5mm){\line(1,0){\textwidth+20mm}}
\fi