من فرض میکنم شما از کلاس book
استفاده میکنید.
روش اول
مسئول چینش و چاپ کلمه «فصل»، شماره فصل و عنوان فصل در کلاس book
بر عهده دستور \@makechapterhead
است؛ پس به سراغ تعریف این دستور توی فایل book-xetex-bidi.def
میریم:
\def\@makechapterhead#1{%
\vspace*{50\p@}%
{\parindent \z@ \if@RTL\raggedleft\else\raggedright\fi \normalfont
\ifnum \c@secnumdepth >\m@ne
\if@mainmatter
\huge\bfseries \@chapapp\space \thechapter
\par\nobreak
\vskip 20\p@
\fi
\fi
\interlinepenalty\@M
\Huge \bfseries #1\par\nobreak
\vskip 40\p@
}}
توی این کد، مسئول چاپ کلمه «فصل» و شماره فصل، به ترتیب، \@chapapp
و \thechapter
است؛ پس کل خط حاوی این دو دستور رو با گذاشتن علامت %
در پشت خط کامنت میکنیم؛ یعنی این جوری
% \huge\bfseries \@chapapp\space \thechapter
حالا میریم سراغ حذف کردن شماره فصل از فهرست مطالب. مسئول چاپ شماره فصل در فهرست مطالب، دستور \@chapter
است؛ پس میریم سراغ تعریف این دستور توی فایل book.cls
:
\def\@chapter[#1]#2{\ifnum \c@secnumdepth >\m@ne
\if@mainmatter
\refstepcounter{chapter}%
\typeout{\@chapapp\space\thechapter.}%
\addcontentsline{toc}{chapter}%
{\protect\numberline{\thechapter}#1}%
\else
\addcontentsline{toc}{chapter}{#1}%
\fi
\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}
توی این کد، شماره فصل و عنوان فصل توسط دستور
\addcontentsline{toc}{chapter}%
{\protect\numberline{\thechapter}#1}%
به فهرست مطالب اضافه شدن؛ پس چون ما فقط میخوایم شماره فصل رو حذف کنیم، کافیه تکه
\protect\numberline{\thechapter}
رو برداریم.
با این توضیحات، فایل نهایی به این صورت خواهد بود:
\documentclass{book}
\usepackage{xepersian}
\settextfont{Yas}
\makeatletter
\def\@makechapterhead#1{%
\vspace*{50\p@}%
{\parindent \z@ \if@RTL\raggedleft\else\raggedright\fi \normalfont
\ifnum \c@secnumdepth >\m@ne
\if@mainmatter
% \huge\bfseries \@chapapp\space \thechapter
\par\nobreak
\vskip 20\p@
\fi
\fi
\interlinepenalty\@M
\Huge \bfseries #1\par\nobreak
\vskip 40\p@
}}
\def\@chapter[#1]#2{\ifnum \c@secnumdepth >\m@ne
\if@mainmatter
\refstepcounter{chapter}%
\typeout{\@chapapp\space\thechapter.}%
\addcontentsline{toc}{chapter}{#1}%
\else
\addcontentsline{toc}{chapter}{#1}%
\fi
\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}
\makeatother
\begin{document}
\tableofcontents
\chapter{یک عنوان فصل آزمایشی}
\section{مقدمه}
\end{document}
روش دوم
بسته زیپرشین همیشه بسته bidi
رو فراخوانی میکنه و این بسته هم بسته biditools
رو. این بسته، دستور خیلی مفیدی به اسم \bidi@patchcmd
داره که شکل کلیش به این صورته:
\bidi@patchcmd{command}{wanted code}{new code}{success msg}{failure msg}
کاربرد این دستور در وصله کردن دستورهاست؛ یعنی دستور command
رو میگیره؛ توش دنبال تکهکد wanted code
میگرده و بعد اون رو با new code
جایگزین میکنه. دو آرگومان آخر هم اجباری نیستن و میشه خالیشون گذاشت. در واقع کارشون صدور پیغام موفقیت یا شکست در وصله کردن دستور command
در فایل .log
است.
برای شروع فرض کنید میخوایم همین روش بالا رو با این دستور انجام بدیم؛ پس طبق توضیحاتی که دادم، باید به صورت زیر عمل کنیم
\documentclass{book}
\usepackage{xepersian}
\settextfont{Yas}
\makeatletter
\bidi@patchcmd{\@makechapterhead}%
{\huge\bfseries\@chapapp\space\thechapter}%
{}%
{}
{}
\bidi@patchcmd{\@chapter}%
{\addcontentsline{toc}{chapter}{\protect\numberline{\thechapter}#1}}%
{\addcontentsline{toc}{chapter}{#1}}%
{}
{}
\makeatother
\begin{document}
\tableofcontents
\chapter{یک عنوان فصل آزمایشی}
\section{مقدمه}
\subsection{تست یک}
\end{document}
دقت داشته باشید که در وصله کردن دستور \@makechapterhead
، تککد
\huge\bfseries\@chapapp\space\thechapter
رو با هیچ جایگزین کردیم.