در این پاسخ فرض میکنم که کلاس 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}