سلام،
خوشبختانه آقا وفا در بسته زیپرشین تمامی زحمات مربوط به تبدیل تاریخ رو کشیدن و اون رو در فایل xepersian-persiancal.sty
در اختیار کاربران قرار دادند. در این فایل در واقع به صورت کلی پس از اجرا شدن بسته XePersian
، یک بار محاسبات مربوط به تاریخ انجام میپذیرد و پس از آن با تغییر تاریخ دیگر این محاسبات صورت نمیپذیرد. بدین ترتیب شما نمیتوانید با تغییر تاریخ پس از اجرای بسته، تاریخ شمسی مورد نظر خود را چاپ کنید و یا از بستههای تغییر تاریخ استفاده نمایید. به منظور رفع این معضل و سازگاری بستههای ذکر شده با XePersian
، کافی است به هنگام صدا زده شدن دستور تاریخ، دوباره کلیه محاسبات تکرار شود و در انتها تاریخ شمسی چاپ گردد. من با استفاده از محاسبات استفاده شده در فایل مذکور، دستور \today
را در به صورت زیر بازنویسی کردهام (که باید در دیباچه فایل تک افزوده گردد).
\makeatletter
\renewcommand{\today}{%
% the following codes have been borrowed from XePersian package distributed by V. Khalighi under the LPPL license.
\XePersian@y=\year \XePersian@m=\month \XePersian@d=\day
\XePersian@temp=\XePersian@y
\divide\XePersian@temp by 100\relax
\multiply\XePersian@temp by 100\relax
\XePersian@yModHundred=\XePersian@y
\advance\XePersian@yModHundred by -\XePersian@temp\relax
\ifodd\XePersian@yModHundred
\XePersian@leapfalse
\else
\XePersian@temp=\XePersian@yModHundred
\divide\XePersian@temp by 2\relax
\ifodd\XePersian@temp\XePersian@leapfalse
\else
\ifnum\XePersian@yModHundred=0%
\XePersian@temp=\XePersian@y
\divide\XePersian@temp by 400\relax
\multiply\XePersian@temp by 400\relax
\ifnum\XePersian@y=\XePersian@temp\XePersian@leaptrue\else\XePersian@leapfalse\fi
\else\XePersian@leaptrue
\fi
\fi
\fi
\XePersian@latini=31\relax
\ifXePersian@leap
\XePersian@latinii = 29\relax
\else
\XePersian@latinii = 28\relax
\fi
\XePersian@latiniii = 31\relax
\XePersian@latiniv = 30\relax
\XePersian@latinv = 31\relax
\XePersian@latinvi = 30\relax
\XePersian@latinvii = 31\relax
\XePersian@latinviii = 31\relax
\XePersian@latinix = 30\relax
\XePersian@latinx = 31\relax
\XePersian@latinxi = 30\relax
\XePersian@latinxii = 31\relax
\XePersian@thirtytwo=32\relax
\XePersian@temp=\XePersian@y
\advance\XePersian@temp by -17\relax
\XePersian@temptwo=\XePersian@temp
\divide\XePersian@temptwo by 33\relax
\multiply\XePersian@temptwo by 33\relax
\advance\XePersian@temp by -\XePersian@temptwo
\ifnum\XePersian@temp=\XePersian@thirtytwo\XePersian@kabisehfalse
\else
\XePersian@temptwo=\XePersian@temp
\divide\XePersian@temptwo by 4\relax
\multiply\XePersian@temptwo by 4\relax
\advance\XePersian@temp by -\XePersian@temptwo
\ifnum\XePersian@temp=\z@\XePersian@kabisehtrue\else\XePersian@kabisehfalse\fi
\fi
\XePersian@tempthree=\XePersian@y % Number of Leap years
\advance\XePersian@tempthree by -1
\XePersian@temp=\XePersian@tempthree % T := (MY-1) div 4
\divide\XePersian@temp by 4\relax
\XePersian@temptwo=\XePersian@tempthree % T := T - ((MY-1) div 100)
\divide\XePersian@temptwo by 100\relax
\advance\XePersian@temp by -\XePersian@temptwo
\XePersian@temptwo=\XePersian@tempthree % T := T + ((MY-1) div 400)
\divide\XePersian@temptwo by 400\relax
\advance\XePersian@temp by \XePersian@temptwo
\advance\XePersian@tempthree by -611 % Number of Kabise years
\XePersian@temptwo=\XePersian@tempthree % T := T - ((SY+10) div 33) * 8
\divide\XePersian@temptwo by 33\relax
\multiply\XePersian@temptwo by 8\relax
\advance\XePersian@temp by -\XePersian@temptwo
\XePersian@temptwo=\XePersian@tempthree %
\divide\XePersian@temptwo by 33\relax
\multiply\XePersian@temptwo by 33\relax
\advance\XePersian@tempthree by -\XePersian@temptwo
\ifnum\XePersian@tempthree=32\advance\XePersian@temp by 1\fi % if (SY+10) mod 33=32 then Inc(T);
\divide\XePersian@tempthree by 4\relax % T := T - ((SY+10) mod 33) div 4
\advance\XePersian@temp by -\XePersian@tempthree
\advance\XePersian@temp by -137 % T := T - 137 Adjust the value
\XePersian@persiani=31
\advance\XePersian@persiani by -\XePersian@temp % now 31 - T is the persiani
\XePersian@persianii = 30\relax
\ifXePersian@kabiseh
\XePersian@persianiii = 30\relax
\else
\XePersian@persianiii = 29\relax
\fi
\XePersian@persianiv = 31\relax
\XePersian@persianv = 31\relax
\XePersian@persianvi = 31\relax
\XePersian@persianvii = 31\relax
\XePersian@persianviii= 31\relax
\XePersian@persianix = 31\relax
\XePersian@persianx = 30\relax
\XePersian@persianxi = 30\relax
\XePersian@persianxii = 30\relax
\XePersian@persianxiii= 30\relax
\XePersian@dn= 0\relax
\XePersian@sn= 0\relax
\XePersian@mminusone=\XePersian@m
\advance\XePersian@mminusone by -1\relax
\XePersian@i=0\relax
\ifnum\XePersian@i < \XePersian@mminusone
\loop
\advance \XePersian@i by 1\relax
\advance\XePersian@dn by \csname XePersian@latin\romannumeral\the\XePersian@i\endcsname
\ifnum\XePersian@i<\XePersian@mminusone \repeat
\fi
\advance \XePersian@dn by \XePersian@d
\XePersian@i=1\relax
\XePersian@sn = \XePersian@persiani
\ifnum \XePersian@sn<\XePersian@dn
\loop
\advance \XePersian@i by 1\relax
\advance\XePersian@sn by \csname XePersian@persian\romannumeral\the\XePersian@i\endcsname
\ifnum \XePersian@sn<\XePersian@dn \repeat
\fi
\ifnum \XePersian@i < 4
\XePersian@m = 9 \advance\XePersian@m by \XePersian@i
\advance \XePersian@y by -622\relax
\else
\XePersian@m = \XePersian@i \advance \XePersian@m by -3\relax
\advance \XePersian@y by -621\relax
\fi
\advance\XePersian@sn by -\csname XePersian@persian\romannumeral\the\XePersian@i%
\endcsname
\ifnum\XePersian@i = 1
\XePersian@d = \XePersian@dn \advance \XePersian@d by 30 \advance\XePersian@d by -\XePersian@persiani
\else
\XePersian@d = \XePersian@dn \advance \XePersian@d by -\XePersian@sn
\fi%
\rl{\persiantoday}%
}
\makeatother
بدین ترتیب، شما با استفاده از این کد به راحتی میتوانید از تمامی دستوراتی که در سوال خود ذکر کردید در فایل تک خود استفاده نمایید.
\documentclass{article}
\usepackage{advdate}
\usepackage{xepersian}
\settextfont{Yas}
%(در اینجا کد مربوط به محاسبات تاریخ اضافه گردد)
\begin{document}
\today\\
\DayAfter[7]\\
\today\\
\end{document}
که خروجی آن به شکل زیر خواهد بود:
پ. ن. امیدوارم آقا وفا این موضوع رو در نسخ بعدی XePersian
لحاظ کنند.