در این پاسخ فرض میکنم که کلاس tabriz-thesis
از کلاس report
استفاده میکند (این در اصل موضوع تغییری اجاد نمیکند). اول اینکه همانطور که در نظرم در پایین پرسش شما گفتم احتیاجی به بسته etoolbox
نیست. بسته xepersian
از بسته bidi
استفاده میکند و بسته bidi
بسته biditools
را بصورت خودکار فراخوانی میکند. بسته biditools
بسیاری امکانات برنامهنویسی را در اختیار شما قرار میدهد که متأسفانه در راهنما برای آن توضیحی وجود ندارد. همانطور که گفتم به جای دستور \patchcmd
از دستور \bidi@patchcmd
استفاده میکنیم. دستور \bidi@patchcmd
ی که من قرار است در اینجا استفاده کنم شکل کلی زیر را دارد:
\bidi@patchcmd{command}{search}{replace}{success}{failure}
که آرگومانها آن را با ذکر مثال، توضیح خواهم داد. برای تغییری که شما مدنظر دارید، ما باید تعریف دستور \@chapter
را تغییر دهیم. این دستور در فایل report.cls
بصورت زیر تعریف شده است:
\def\@chapter[#1]#2{\ifnum \c@secnumdepth >\m@ne
\refstepcounter{chapter}%
\typeout{\@chapapp\space\thechapter.}%
\addcontentsline{toc}{chapter}%
{\protect\numberline{\thechapter}#1}%
\else
\addcontentsline{toc}{chapter}{#1}%
\fi
\chaptermark{#1}%
\addtocontents{lof}{\protect\addvspace{10\p@}}%
\addtocontents{lot}{\protect\addvspace{10\p@}}%
\if@twocolumn
\@topnewpage[\@makechapterhead{#2}]%
\else
\@makechapterhead{#2}%
\@afterheading
\fi}
برای تغییری که شما مدنظر دارید، ما باید در تعریف دستور \@chapter
\addcontentsline{toc}{chapter}%
{\protect\numberline{\thechapter}#1}%
را با
\addcontentsline{toc}{chapter}%
{\protect\numberline{\chaptername~\tartibi{chapter}}#1}%
جایگزین کنیم. یک راه تعریف دوباره دستور \@chapter
است که ممکن است خیلی طولانی باشد. بنابراین بسته biditools
دستور \bidi@patchcmd
را در اختیار شما قرار میدهد که در بالا شکل کلی آن ذکر شد. آرگومان اول یا همان command دستوری است که میخواهیم تعریفش را عوض کنیم. آرگومان دوم یا serach تکه کدی است در تعریف command که میخواهیم دنبالش بگردیم و آن را با آرگومان سوم جایگزین کنیم. آرگومان چهارم در صورتی اجرا خواهد شد که command به درستی از دوباره تعریف شده باشد و آرگومان پنجم در صورتی اجرا خواهد شد که command به درستی از نو تعریف نشده باشد. با همه این توضیحات پاسخ پرسش شما این خواهد بود:
\documentclass{report}
\usepackage{xepersian}
\settextfont{Yas}
\makeatletter
\bidi@patchcmd{\@chapter}{%
\addcontentsline{toc}{chapter}%
{\protect\numberline{\thechapter}#1}%
}{%
\addcontentsline{toc}{chapter}%
{\protect\numberline{\chaptername~\tartibi{chapter}}#1}%
}{\typeout{We succeded in redefining \string\@chapter}}
{\typeout{We failed in redefining \string\@chapter}}
\bidi@patchcmd{\l@chapter}{%
\setlength\@tempdima{1.5em}%
}{%
\setlength\@tempdima{4em}%
}{\typeout{We succeded in redefining \string\l@chapter}}
{\typeout{We failed in redefining \string\l@chapter}}
\makeatother
\begin{document}
\tableofcontents
\chapter{همینجوری}
\end{document}
همانطور که در بالا میبینید من تعریف دستور \l@chapter
را نیز تغییر دادهام تا «فصل اول» با «همینجوری» تداخل نداشته باشد. مقدار \@tempdima
برابر با 1.5em بوده است که من آن را به 4em افزایش دادهام. در ترمینال و فایل .log
متن زیر ظاهر میشود:
We succeded in redefining \@chapter
We succeded in redefining \l@chapter
که به ما میگوید ماکروهای \@chapter
و \l@chapter
به درستی تغییر یافتهاند.
کلاس tabriz-thesis
وقتی در نمونه بالا از کلاس tabriz-thesis
استفاده میکنیم:
\documentclass{tabriz-thesis}
\usepackage{xepersian}
\settextfont{Yas}
\makeatletter
\bidi@patchcmd{\@chapter}{%
\addcontentsline{toc}{chapter}%
{\protect\numberline{\thechapter}#1}%
}{%
\addcontentsline{toc}{chapter}%
{\protect\numberline{\chaptername~\tartibi{chapter}}#1}%
}{\typeout{We succeded in redefining \string\@chapter}}
{\typeout{We failed in redefining \string\@chapter}}
\bidi@patchcmd{\l@chapter}{%
\setlength\@tempdima{1.5em}%
}{%
\setlength\@tempdima{4em}%
}{\typeout{We succeded in redefining \string\l@chapter}}
{\typeout{We failed in redefining \string\l@chapter}}
\makeatother
\begin{document}
\tableofcontents
\chapter{همینجوری}
\end{document}
در ترمینال و فایل .log
پیغام زیر ظاهر میشود:
We failed in redefining \@chapter
We succeded in redefining \l@chapter
که گویای این است که دستور \@chapter
به درستی تعریف نشده است. مشکل از کجاست؟ کلاس tabriz-thesis
از بسته hyperref
استفاده میکند (بگذریم که این کار اشتباه است و این کلاس انتخاب خودش رو به کاربر تحمیل میکنه) و درایور بسته hyperref
برای xetex به نام hxetex.def
فراخوانی میشود. در این فایل تعریف \@chapter
تغییر یافته است و به همین خاطر نمونه ما برای کلاس tabriz-thesis
کار نمیکند. راهحل چیست؟ راهحل ساده است و آن اینکه از ماکروی معادل \@chapter
بسته hyperref
به جای \@chapter
استفاده کنیم و آن ماکرو \Hy@org@chapter\
است. بنابراین فایل زیر به خوبی کار میکند:
\documentclass{tabriz-thesis}
\usepackage{hyperref}
\usepackage{xepersian}
\settextfont{Yas}
\makeatletter
\bidi@patchcmd{\Hy@org@chapter}{%
\addcontentsline{toc}{chapter}%
{\protect\numberline{\thechapter}#1}%
}{%
\addcontentsline{toc}{chapter}%
{\protect\numberline{\chaptername~\tartibi{chapter}}#1}%
}{\typeout{We succeded in redefining \string\@chapter}}
{\typeout{We failed in redefining \string\@chapter}}
\bidi@patchcmd{\l@chapter}{%
\setlength\@tempdima{1.5em}%
}{%
\setlength\@tempdima{4em}%
}{\typeout{We succeded in redefining \string\l@chapter}}
{\typeout{We failed in redefining \string\l@chapter}}
\makeatother
\begin{document}
\tableofcontents
\chapter{همینجوری}
\end{document}