زیپرشین XePersian > زیتک
جابجا شدن کراپمارکهای چاپشده توسط بسته bidi-atbegshi در محیط multicols
(1/1)
وحید دامنافشان:
توی فایل پیوست، به محض شروع محیط multicols در صفحه ۳، کراپمارکهایی که توسط بسته bidi-atbegshi چاپ شدند، جابجا میشن. این مشکل رو چطور میشه حل کرد؟
vafa:
اگر از بسته geometry استفاده نمیکنید، حتماً کد زیر را در نوشتار خود قرار دهید:
--- کد: ---\setlength{\pdfpagewidth}{\paperwidth}
\setlength{\pdfpageheight}{\paperheight}
--- End code ---
اگر از بسته geometry استفاده میکنید، احتیاجی به این کار نیست. البته این موضوع ربطی به مشکل نداره تنها یک پیشنهاد بود.
--- نقل قول از: وحید دامنافشان در سپتامبر 29, 2014, 08:56:11 pm ---توی فایل پیوست، به محض شروع محیط multicols در صفحه ۳، کراپمارکهایی که توسط بسته bidi-atbegshi چاپ شدند، جابجا میشن. این مشکل رو چطور میشه حل کرد؟
--- End quote ---
علت مشکل:
اگر به خاطر داشته باشید توی نسخههای قدیمی بسته bidi زمانی که از بسته multicol و محیط multicols استفاده میکردید فهرست مطالب اشتباه چاپ میشد که این یکی از باگهای موتور etex بود. برای درست کردن این موضوع (روشی که الان بسته bidi استفاده میکنه) اینه که تک رو به قول معروف ما fool میکنیم. برای مثال اگر دو ستون دارید این اتفاقی هست که میافته:
--- کد: ---\hskip \columnwidth
\hfil \vrule width\columnseprule \hfil
<put first column here>
\hskip -\textwidth
<put second column here>
\hskip \columnsep
\hskip \columnwidth
--- End code ---
با این روش هم دو ستون ترتیبش از راست به چپ میشه و هم مشکل فهرست مطالب دیگه وجود نداره. اما اگر صفحهای با محیط multicols شروع یا تموم بشه از اونجایی که بسته multicols در واقع output routine رو تغییر میده، جای گوشههای چپ و راست کاغذ به اندازه همون \columnwidth و \columnsep عوض میشه.
راهحل چیست:
اینکه تست کنیم که آیا متن یک ستونی هست یا نه. اگر یک ستونی بود همون مختصات قبلی رو استفاده کن ولی اگر یکستونی نیود از متخصات جدید استفاده کن:
--- کد: ---\documentclass[a4paper]{book}
\usepackage{ptext,graphicx}
\usepackage{picture}
\usepackage{multicol}
\usepackage{bidi-atbegshi}
\usepackage{xepersian}
\settextfont{XB Niloofar}
\setlength{\pdfpagewidth}{\paperwidth}
\setlength{\pdfpageheight}{\paperheight}
\makeatletter
\AtBeginShipout{%
\ifnum\col@number=\@ne
\AtBeginShipoutUpperLeft{%
\setlength{\unitlength}{1mm}
\put(-1,-5){\line(-1,0){10}}
\put(-1,-5){\line(0,-1){10}}
}
\AtBeginShipoutUpperRight{%
\setlength{\unitlength}{1mm}
\put(1,-5){\line(1,0){10}}
\put(1,-5){\line(0,-1){10}}
}
\AtBeginShipoutLowerLeft{%
\setlength{\unitlength}{1mm}
\put(-1,5){\line(-1,0){10}}
\put(-1,5){\line(0,1){10}}
}
\AtBeginShipoutLowerRight{%
\setlength{\unitlength}{1mm}
\put(1,5){\line(1,0){10}}
\put(1,5){\line(0,1){10}}
}
\else
\AtBeginShipoutUpperLeft{%
\setlength{\unitlength}{1mm}
\put(-\dimexpr\columnwidth+\columnsep+1mm\relax,-5){\line(-1,0){10}}
\put(-\dimexpr\columnwidth+\columnsep+1mm\relax,-5){\line(0,-1){10}}
}
\AtBeginShipoutUpperRight{%
\setlength{\unitlength}{1mm}
\put(-\dimexpr\columnwidth+\columnsep-1mm\relax,-5){\line(1,0){10}}
\put(-\dimexpr\columnwidth+\columnsep-1mm\relax,-5){\line(0,-1){10}}
}
\AtBeginShipoutLowerLeft{%
\setlength{\unitlength}{1mm}
\put(-\dimexpr\columnwidth+\columnsep+1mm\relax,5){\line(-1,0){10}}
\put(-\dimexpr\columnwidth+\columnsep+1mm\relax,5){\line(0,1){10}}
}
\AtBeginShipoutLowerRight{%
\setlength{\unitlength}{1mm}
\put(-\dimexpr\columnwidth+\columnsep-1mm\relax,5){\line(1,0){10}}
\put(-\dimexpr\columnwidth+\columnsep-1mm\relax,5){\line(0,1){10}}
}
\fi
}
\makeatother
\begin{document}
\chapter{مقداری متن}
\ptext[1-10]
\newpage
\begin{multicols*}{2}
\ptext[1-7]
\end{multicols*}
\end{document}
--- End code ---
vafa:
کد قبلی فقط یرای دو ستون کار میکرد. در کد زیر مهم نیست که تعداد ستونها چند تا باشند چون ضریب \columnwidth و \columnsep همیشه تعداد ستونها منهای یک است:
--- کد: ---\documentclass[a4paper]{book}
\usepackage{ptext,graphicx}
\usepackage{picture}
\usepackage{multicol}
\usepackage{bidi-atbegshi}
\usepackage{xepersian}
\settextfont{XB Niloofar}
\setlength{\pdfpagewidth}{\paperwidth}
\setlength{\pdfpageheight}{\paperheight}
\makeatletter
\AtBeginShipout{%
\ifnum\col@number=\@ne
\AtBeginShipoutUpperLeft{%
\setlength{\unitlength}{1mm}
\put(-1,-5){\line(-1,0){10}}
\put(-1,-5){\line(0,-1){10}}
}
\AtBeginShipoutUpperRight{%
\setlength{\unitlength}{1mm}
\put(1,-5){\line(1,0){10}}
\put(1,-5){\line(0,-1){10}}
}
\AtBeginShipoutLowerLeft{%
\setlength{\unitlength}{1mm}
\put(-1,5){\line(-1,0){10}}
\put(-1,5){\line(0,1){10}}
}
\AtBeginShipoutLowerRight{%
\setlength{\unitlength}{1mm}
\put(1,5){\line(1,0){10}}
\put(1,5){\line(0,1){10}}
}
\else
\AtBeginShipoutUpperLeft{%
\setlength{\unitlength}{1mm}
\put(-\dimexpr\numexpr\col@number-1\relax\columnwidth+\numexpr\col@number-1\relax\columnsep+1mm\relax,-5){\line(-1,0){10}}
\put(-\dimexpr\numexpr\col@number-1\relax\columnwidth+\numexpr\col@number-1\relax\columnsep+1mm\relax,-5){\line(0,-1){10}}
}
\AtBeginShipoutUpperRight{%
\setlength{\unitlength}{1mm}
\put(-\dimexpr\numexpr\col@number-1\relax\columnwidth+\numexpr\col@number-1\relax\columnsep-1mm\relax,-5){\line(1,0){10}}
\put(-\dimexpr\numexpr\col@number-1\relax\columnwidth+\numexpr\col@number-1\relax\columnsep-1mm\relax,-5){\line(0,-1){10}}
}
\AtBeginShipoutLowerLeft{%
\setlength{\unitlength}{1mm}
\put(-\dimexpr\numexpr\col@number-1\relax\columnwidth+\numexpr\col@number-1\relax\columnsep+1mm\relax,5){\line(-1,0){10}}
\put(-\dimexpr\numexpr\col@number-1\relax\columnwidth+\numexpr\col@number-1\relax\columnsep+1mm\relax,5){\line(0,1){10}}
}
\AtBeginShipoutLowerRight{%
\setlength{\unitlength}{1mm}
\put(-\dimexpr\numexpr\col@number-1\relax\columnwidth+\numexpr\col@number-1\relax\columnsep-1mm\relax,5){\line(1,0){10}}
\put(-\dimexpr\numexpr\col@number-1\relax\columnwidth+\numexpr\col@number-1\relax\columnsep-1mm\relax,5){\line(0,1){10}}
}
\fi
}
\makeatother
\begin{document}
\chapter{مقداری متن}
\ptext[1-100]
\begin{multicols*}{4}
\ptext[1-100]
\end{multicols*}
\ptext[1-100]
\end{document}
--- End code ---
vafa:
توی نسخه بعدی بسته bidi-atbegshi من این مورد رو درست میکنم تا احتیاجی به تنظیم دستی نباشه.
کنترل
[0] صندوق پستی
Go to full version