به دلیل قطعی اینترنت و نبود دسترسی به ایمیل‌های خارجی، می‌توانید بدون نیاز به تایید ایمیل، ثبت‌نام کنید و پرسش‌های خود را بپرسید.

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

بسته 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.2k پرسش

6.6k پاسخ

23.7k نظر

11.7k کاربر

basket cart icon

محصولات مرتبط با LaTeX

در فروشگاه پارسی‌لاتک


basket cart icon

حمایت مالی از پارسی‌لاتک

برای تامین هزینه‌های نگه‌داری و به‌روزرسانی

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

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