اولین بار است که به اینجا می‌آیید؟ راهنمای سایت را بخوانید!
+9 رای
1.2k بازدید

بسته biditools چه امکاناتی برای نویسندگان بسته‌ها/کلاس‌ها در اختیار قرار می‌دهد؟

به عنوان مثال فرض کنیم که کلاسی به نام myclass.cls نوشته‌ایم:

...
\LoadClass{article}
\RequirePackage{xepersian}
\settextfont{XB Yas}
...

از آن‌جایی که بسته xepersian در این کلاس فراخوانی شده است، اگر کاربر بسته color را فراخوانی کند:

\documentclass{myclass}
\usepackage{color}
\begin{document}
...
\end{document}

به خطا برمی‌خوریم زیرا که بسته color بعد از بسته xepersian فراخوانی شده است. در اینگونه موارد و بصورت کلی اگر بخواهیم کدی را قبل/بعد از یک بسته/کلاس قرار دهیم چه امکاناتی در بسته biditools وجود دارد؟

2 پاسخ

+11 رای

این جواب ناقص است و در آینده در صورت داشتن زمان کافی تکمیل خواهد شد.

بسته biditools در گذشته هم امکانات بسیار زیادی در اختیار نویسندگان بسته‌ها/کلاس‌ها در اختیار قرار می‌داد که منتها به علت محدودیت زمانی، در راهنما این امکانات توضیح داده نشده‌اند.

به علاوه، همچنین نسخه 16.7 بسته bidi که به تازگی به CTAN داده شده است که در این نسخه امکانات بسیاری به بسته biditools برای نویسندگان بسته‌ها/کلاس‌ها افزوده شده است. این امکانات شامل دستورات زیر است:

\bidi@BeforeFile{<file>}{<instructions>}
\bidi@AfterFile{<file>}{<instructions>}
\bidi@BeforeClass{<class>}{<instructions>}
\bidi@BeforePackage{<package>}{<instructions>}
\bidi@AfterClass{<class>}{<instructions>}
\bidi@AfterClass*{<class>}{<instructions>}
\bidi@AfterClass+{<class>}{<instructions>}
\bidi@AfterClass!{<class>}{<instructions>}
\bidi@AfterAtEndOfClass{<class>}{<instructions>}
\bidi@AfterPackage{<package>}{<instructions>}
\bidi@AfterPackage*{<package>}{<instructions>}
\bidi@AfterPackage+{<package>}{<instructions>}
\bidi@AfterPackage!{<package>}{<instructions>}
\bidi@AfterAtEndOfPackage{<package>}{<instructions>}
\bidi@BeforeClosingMainAux{<instructions>}
\bidi@AfterReadingMainAux{<instructions>}
\bidi@ReplaceInput{<source file name>}{<replacement file name>}
\bidi@ReplaceClass{<source class>}{<replacement package>}
\bidi@ReplacePackage{<source package>}{<replacement package>}
\bidi@UnReplaceInput{<file name>}
\bidi@UnReplacePackage{<package>}
\bidi@UnReplaceClass{<class>}
\bidi@PreventPackageFromLoading[<instead code>]{<package list>}
\bidi@PreventPackageFromLoading*[<instead code>]{<package list>}
\bidi@StorePreventPackageFromLoading{<\command>}
\bidi@ResetPreventPackageFromLoading
\bidi@UnPreventPackageFromLoading{<package list>}
\bidi@UnPreventPackageFromLoading*{<package list>}
\bidi@patch@AfterPackage{<package>}{<patch code>}

به عنوان یک مثال از چگونگی استفاده از این دستورات فرض کنید کلاسی دارید می‌نویسید که در آن کلاس article فراخوانی شده است. در کلاس خود می‌خواهید تعریف دستور \l@section را به طور مثال تغییر دهید اما از آن‌جایی که در فایل .tex بسته xepersian و بنابراین بسته bidi فراخوانی می‌شود، بسته bidi تعریف دستور \l@section شما را به تعری خودش تغییر می‌دهد و تغییرات شما در کلاستان ناپدید می‌شود. برای حل این مشکل چه باید کنید؟

راه‌حل ساده است و آن این است که در کلاس خود تعریف دستور \l@section را به این صورت تغییر دهید:

\bidi@patch@AfterPackage{bidi}{%
\renewcommand*\l@section[2]{%
...
}}

بنابراین کاری که انجام می‌شود این است که دستور \l@section فقط بعد از فراخوانی بسته bidi از نو تعریف می‌شود و بدین ترتیب تغییرات شما دیگر ناپدید (یا بهتر رونویسی) نمی‌شوند.

بدیهی است که این تنها گوشه‌ای از امکانات بسته biditools است و نسخه 16.7 بسته bidi (نسخه 0.4 بسته biditools) امکانات بسیار زیادی را در اختیار نویسندگان بسته‌ها/کلاس‌ها در اختیار قرار می‌دهد و به این ترتیب نویسندگان بسته‌ها/کلاس‌ها آزادی کامل دارند.

+5 رای

یک نکته دیگر (اما در پاسخی جداگانه) که می‌خواستم اضافه کنم این است که با امکانات اضافه شده در بسته biditools می‌توان کل بسته bidi و xepersian را از نو بازنویسی کرد (متأسفانه این کار وقت زیادی می‌]واهد و از آن‌جایی که من دانشجو هستم نمی‌توانم همچین زمانی هزینه کنم) تا یکی از محدودیت‌های مهم بسته xepersian و bidi را از بین برد.

این محدودیت این است که به عنوان یک قانون تا به امروز بسته bidi و xepersian باید آخرین بسته‌ای بود که استفاده می‌کردید و اگر اینگونه نبود خطا می‌گرفتید. این به این خاطر است که بسته bidi و xepersian باید بداند که چه بسته/کلاسی فراخوانی شده است تا در صورت فراخوانی یک بسته/کلاس خاص، تغییرات مناسب در آن کلاس/بسته داده شود.

با وجود امکاناتی که به بسته biditools اضافه شده است می‌توان بسته bidi و xepersian را از نو بازنویسی کرد تا:

  1. محدودیت فراخوانی بسته xepersian یا bidi به عنوان آخرین بسته از بین برود. این به این معنی است که می‌توانید بسته xepersian یا bidi را هر جایی که در Preamble خواستید فراخوانی کنید و حتماً نیازی نیست که آخرین بسته باشد.
  2. خطاهایی که یک بسته بعد از بسته xepersian یا bidi فراخوانی شده باشند، هم حذف می‌شوند.

با وجود امکانات جدید در بسته biditools مهم نیست که یک بسته کجا (قبل از xepersian یا bidi یا بعد از آن) فراخوانی شده باشد چون با وجود امکانات جدید براحتی می‌توان، اگر بسته فراخوانی شده باشد، تغییرات لازم را بده و اگر بسته هنوز فراخوانی نشده است، فعلاً صبر کن و هر زمانی که بسته فراخوانی شد، تغییرات لازم را در آن بده.

جای بسی تأسف است که قبل از نوشتن بسته‌های bidi و xepersian به فکر اضافه کردن این امکانات مفید نیفتادم!

پرسیدن سوال
وب‌سایت پرسش و پاسخ پارسی‌لاتک جایی برای پرسش و پاسخ درباره سیستم حروف‌چینی لاتک و بسته زی‌پرشین است. در اینجا می‌توانید سوال‌های خود را بپرسید و به سوال‌های دیگران پاسخ دهید.

7.1k پرسش

6.6k پاسخ

23.5k نظر

7.3k کاربر

محبوب‌ترین برچسب‌ها

رفع خطا جدول xepersian مراجع ریاضی‌نویسی شکل bidi فونت فهرست مطالب شماره‌گذاری منابع پانویس بیب‌تک tikz تک‌لایو parsilatex بیمر اسلاید زی‌پرشین پاورقی bibtex سربرگ نماد رسم شکل فرمول‌نویسی ارجاع‌دهی biditexmaker هدر ویرایشگر قالب beamer واژه‌نامه اندازه فونت texstudio عنوان فصل ماتریس اعمال نشدن تغییرات در پی‌دی‌اف رسم جدول شماره صفحه bidipresentation حاشیه رنگ عنوان شکل اسلاید فارسی محیط قضیه گراف مکان شکل tikzpicture enumerate حروف‌چینی کد شماره فصل tabriz_thesis نمایه align زیرنویس شکل کادر itemize فهرست اشکال الگوریتم عدم اجرا listings نیم‌فاصله متن لاتین و فارسی بسته فاصله بین خطوط قالب پایان‌نامه فرمول نصب تک‌لایو فارسی‌تک hyperref شماره فرمول glossaries کپشن نمودار خروجی لاتک حروف‌چینی چندستونی فونت فارسی و انگلیسی ماکرونویسی biditools شماره پاورقی پیوست‌ سوال امتحانی فاصله‌گذاری فرمول چندضابطه‌ای extrafootnotefeatures subfigure biditufte-book header texmaker pdf خطا tex longtable تصویر شمارنده زیرنویس texlive2015 دیاگرام رسم نمودار شماره‌گذاری صفحات پایان نامه فهرست جداول میک‌تک texlive2016 تنظیم جدول آکولاد شعر kashida بولد تورفتگی texworks caption اندیس اعداد فارسی lollipop iust-thesis multicol فصل‌نویسی سوال چهارگزینه‌ای فاصله عمودی pgfplots xindy چپ‌چینی اوبونتو میکروسافت ورد قاب geometry xelatex texlive fancyhdr وسط‌چینی تک لایو 2015 tcolorbox عنوان بخش شماره گذاری به‌روزرسانی بسته aimc46 صفر توخالی فرمول طولانی بیرون‌زدگی کاما پوستر فاصله سطرها نوشتافت شکست خط tex-programming فونت اعداد قرآن tabriz-thesis
...