BT_MISC(1) btparse BT_MISC(1)

bt_misc - ابزارهای متفرقه پردازش رشته به سبک BibTeX

void bt_purify_string (char * string, btshort options);
void bt_change_case (char transform, char * string, btshort options);

void bt_purify_string (char * string, btshort options);

یک "string" را به شیوهٔ BibTeX «پاک‌سازی» (purify) می‌کند (معمولاً برای ایجاد کلیدهای مرتب‌سازی استفاده می‌شود). "string" به صورت درجا (in-place) تغییر داده می‌شود. گزینهٔ "options" در حال حاضر استفاده نمی‌شود؛ برای سازگاری در آینده مقدار آن را صفر قرار دهید. پاک‌سازی شامل رونوشت کاراکترهای حرفی‌عددی، تبدیل خط‌های فاصله و فاصله‌های نشکن (ties) به فاصله، رونوشت فاصله‌ها، و نادیده گرفتن (تقریباً) بقیهٔ موارد است.

«تقریباً»، زیرا با «کاراکترهای ویژه» (که برای حروف دارای اکسان و غیرانگلیسی استفاده می‌شوند) به شکل ویژه‌ای رفتار می‌شود. به یاد داشته باشید که یک کاراکتر ویژه در BibTeX، هر گروه احاطه‌شده با آکولاد است که از عمق صفر آکولاد آغاز شده و نخستین کاراکتر آن یک بک‌اسلش باشد. برای نمونه، رشتهٔ

{\foo bar}Herr M\"uller went from {P{\r r}erov} to {\AA}rhus

شامل دو کاراکتر ویژه است: "{\foo bar}" و "\AA". نه "\"u" و نه "\r r" کاراکتر ویژه نیستند، زیرا در عمق آکولاد مناسب قرار ندارند.

با کاراکترهای ویژه بدین شکل رفتار می‌شود: اگر توالی کنترلی (دستور TeX که پس از بک‌اسلش می‌آید) به عنوان یکی از «حروف خارجی» لاتک ("\oe"، "\ae"، "\o"، "\l"، "\ae"، "\ss"، به همراه نگارش بزرگ آن‌ها) شناخته شود، با حذف بک‌اسلش و تبدیل کاراکتر دوم (در صورت وجود) به حروف کوچک، به یک معادل تقریبی انگلیسی منطقی تبدیل می‌شود؛ بنابراین، "{\AA}" در مثال بالا صرفاً به "Aa" تبدیل می‌شود. تمام توالی‌های کنترلی دیگر در یک کاراکتر ویژه، همانند تمام کاراکترهای غیرالفبایی، حذف می‌شوند.

برای نمونه، رشتهٔ بالا پس از «پاک‌سازی» به شکل زیر درمی‌آید:

barHerr Muller went from Pr rerov to Aarhus

مشخصاً برای کلمهٔ "P{\r r}erov" (شهری در جمهوری چک) مشکلی پیش آمده است. حرف دارای اکسان `r´ باید یک کاراکتر ویژه باشد که از عمق صفر آکولاد شروع می‌شود. اگر رشتهٔ اصلی در عوض به صورت زیر بود:

{\foo bar}Herr M\"uller went from P{\r r}erov to {\AA}rhus

آنگاه خروجی پاک‌سازی‌شده معقول‌تر می‌شد:

barHerr Muller went from Prerov to Aarhus

به استفاده از کاراکتر ویژهٔ «بی‌معنی» "{\foo bar}" توجه کنید: این ترفند اغلب برای قرار دادن متنی خاص در رشته صرفاً به منظور ایجاد کلیدهای مرتب‌سازی استفاده می‌شود؛ سپس این متن در هنگام پردازش سند توسط TeX نادیده گرفته می‌شود (تا زمانی که "\foo" به عنوان یک ماکروی بی‌اثر TeX تعریف شده باشد). البته این موضوع مستلزم این است که خروجی در نهایت توسط TeX پردازش شود؛ در غیر این صورت، این ترفند اثر معکوس خواهد داشت.

همچنین، bt_purify_string() برای ایجاد کلیدهای مرتب‌سازی بر اساس قراردادهای زبان انگلیسی مناسب است. با این حال، برای تبعیت از قراردادهای زبان‌های دیگر، به روش پیچیده‌تری نیاز خواهد بود؛ امید است که نگارش‌های آیندهٔ btparse این کمبود را برطرف کنند.

void bt_change_case (char transform, char * string, btshort options);

یک رشته را با توجه خاص به کاراکترهای ویژهٔ BibTeX و سایر گروه‌های آکولادی، به حروف کوچک، حروف بزرگ یا «بزرگ‌نویسی عنوان غیرکتابی» (non-book title capitalization) تبدیل می‌کند. نوع تبدیل توسط تک‌کاراکتر "transform" مشخص می‌شود: 'u' برای تبدیل به حروف بزرگ، 'l' برای حروف کوچک، و 't' برای «بزرگ‌نویسی عنوان». "string" به صورت درجا تغییر داده می‌شود، و "options" در حال حاضر استفاده نمی‌شود؛ برای سازگاری در آینده آن را روی صفر تنظیم کنید.

تبدیل به حروف کوچک و بزرگ بدیهی است، با این قید که متن داخل آکولادها به شیوهٔ متفاوتی پردازش می‌شود (در ادامه توضیح داده شده است). بزرگ‌نویسی عنوان صرفاً بدین معناست که همه چیز به حروف کوچک تبدیل می‌شود، مگر حرف اولِ کلمهٔ اول و کلماتی که مستقیماً پس از دونقطه یا نشانه‌های پایان جمله می‌آیند. برای نمونه:

Flying Squirrels: Their Peculiar Habits. Part One

به شکل زیر تبدیل خواهد شد:

Flying squirrels: Their peculiar habits. Part one

متن درون آکولادها به این صورت مدیریت می‌شود: نخست، در یک «کاراکتر ویژه» (تعریف بالا را ببینید)، توالی‌های کنترلی که یکی از حروف غیرانگلیسی لاتک را تشکیل می‌دهند به طور مناسبی تبدیل می‌شوند---برای نمونه، هنگام تبدیل به حروف کوچک، "\AE" به "\ae" تبدیل می‌شود. هر توالی کنترلی دیگری در کاراکتر ویژه (از جمله اکسان‌ها) حفظ می‌شود، و تمام متن درون یک کاراکتر ویژه، صرف‌نظر از عمق و نشانه‌گذاری، به حروف کوچک یا بزرگ تبدیل می‌شود. (برای «بزرگ‌نویسی عنوان»، تمام متن درون یک کاراکتر ویژه به حروف کوچک تبدیل می‌شود.)

گروه‌های آکولادی که کاراکتر ویژه نیستند کاملاً دست‌نخورده باقی می‌مانند: نه متن و نه توالی‌های کنترلی درون آکولادهای کاراکترهای غیرویژه تغییر داده نمی‌شوند.

برای نمونه، رشتهٔ

A Guide to \LaTeXe: Document Preparation ...

هنگامی که "transform" روی 't' باشد (بزرگ‌نویسی عنوان)، به صورت زیر تبدیل خواهد شد:

A guide to \latexe: Document preparation ...

که احتمالاً خروجی مدنظر نیست. تلاش بهتر این است:

A Guide to {\LaTeXe}: Document Preparation ...

که به شکل زیر درمی‌آید:

A guide to {\LaTeXe}: Document preparation ...

با این حال، اگر برگردید و توضیحات bt_purify_string() را دوباره بخوانید، درخواهید یافت که "{\LaTeXe}" در اینجا یک کاراکتر ویژه است، اما یک حرف غیرانگلیسی نیست: بنابراین توالی کنترلی حذف می‌شود. پس یک کلید مرتب‌سازی ساخته‌شده از این عنوان به صورت زیر خواهد بود:

A Guide to  Document Preparation

...اوه! راهکار درست (که برای هر عنوانی با دستور TeX که به متن واقعی تبدیل می‌شود به کار می‌رود) این است که توالی کنترلی را در عمق دوم آکولاد قرار دهید:

A Guide to {{\LaTeXe}}: Document Preparation ...

btparse

Greg Ward <gward@python.net>

2025-07-14 btparse, version 0.91