.\" -*- mode: troff; coding: utf-8 -*- .\" Automatically generated by Pod::Man v6.0.2 (Pod::Simple 3.45) .\" .\" Standard preamble: .\" ======================================================================== .de Sp \" Vertical space (when we can't use .PP) .if t .sp .5v .if n .sp .. .de Vb \" Begin verbatim text .ft CW .nf .ne \\$1 .. .de Ve \" End verbatim text .ft R .fi .. .\" \*(C` and \*(C' are quotes in nroff, nothing in troff, for use with C<>. .ie n \{\ . ds C` "" . ds C' "" 'br\} .el\{\ . ds C` . ds C' 'br\} .\" .\" Escape single quotes in literal strings from groff's Unicode transform. .ie \n(.g .ds Aq \(aq .el .ds Aq ' .\" .\" If the F register is >0, we'll generate index entries on stderr for .\" titles (.TH), headers (.SH), subsections (.SS), items (.Ip), and index .\" entries marked with X<> in POD. Of course, you'll have to process the .\" output yourself in some meaningful fashion. .\" .\" Avoid warning from groff about undefined register 'F'. .de IX .. .nr rF 0 .if \n(.g .if rF .nr rF 1 .if (\n(rF:(\n(.g==0)) \{\ . if \nF \{\ . de IX . tm Index:\\$1\t\\n%\t"\\$2" .. . if !\nF==2 \{\ . nr % 0 . nr F 2 . \} . \} .\} .rr rF .\" .\" Required to disable full justification in groff 1.23.0. .if n .ds AD l .\" ======================================================================== .\" .IX Title "BT_MACROS 1" .TH BT_MACROS 1 2025-07-14 "btparse, version 0.91" btparse .\" For nroff, turn off justification. Always turn off hyphenation; it makes .\" way too many mistakes in technical documents. .if n .ad l .nh .SH "نام (NAME)" bt_macros \- دسترسی به جدول ماکروهای btparse و دستکاری آن .SH "خلاصه دستور (SYNOPSIS)" .IX Header "SYNOPSIS" .Vb 6 \& void bt_add_macro_value (AST * assignment, \& btshort options); \& void bt_add_macro_text (char * macro, \& char * text, \& char * filename, \& int line); \& \& void bt_delete_macro (char * macro); \& void bt_delete_all_macros (void); \& \& int bt_macro_length (char *macro); \& char * bt_macro_text (char * macro, \& char * filename, \& int line); .Ve .SH "توضیحات (DESCRIPTION)" .IX Header "DESCRIPTION" \&\fBbtparse\fR یک جدول واحد از تمامی ماکروهای (کوته‌نوشت‌های) دیده‌شده هنگام تجزیه مدخل‌های BibTeX نگهداری می‌کند. این جدول هر زمان که با یک مدخل «تعریف ماکرو» (\f(CW@string\fR) مواجه شود به‌روزرسانی شده و هر زمان که ماکرویی در یک مدخل به کار رود و نیاز به بسط داشته باشد، به آن ارجاع داده می‌شود. (ماکروها لزوماً در ورودی بسط داده نمی‌شوند، اگرچه این حالت پیش‌فرض است. به bt_postprocess مراجعه کنید.) تعاریف ماکروها تنها زمانی پاک می‌شوند که تابع پاک‌سازی سراسری \fBbtparse\fR، یعنی \f(CWbt_cleanup()\fR، فراخوانی شود. بنابراین، مگر اینکه صراحتاً \f(CWbt_delete_macro()\fR یا \&\f(CWbt_delete_all_macros()\fR را فراخوانی کنید، تعاریف ماکرو تا زمانی که از کتابخانه استفاده می‌کنید \-\-\- معمولاً طول عمر فرایند شما \-\-\- باقی می‌مانند. .SH "توابع (FUNCTIONS)" .IX Header "FUNCTIONS" می‌توانید از توابع زیر برای افزودن ماکروها، حذف آن‌ها، و پرس‌وجوی مقادیرشان استفاده کنید \-\-\- و در نتیجه، در حین اجرا در عملکرد عادی \fBbtparse\fR مداخله نمایید. .IP "bt_add_macro_text ()" 4 .IX Item "bt_add_macro_text ()" .Vb 4 \& void bt_add_macro_text (char * macro, \& char * text, \& char * filename, \& int line); .Ve .Sp یک ماکروی جدید تعریف می‌کند، یا ماکروی قدیمی را مجدداً تعریف می‌نماید. \f(CW\*(C`macro\*(C'\fR نام ماکرو است، و \f(CW\*(C`text\*(C'\fR متنی است که ماکرو باید به آن بسط یابد. \f(CW\*(C`filename\*(C'\fR و \&\f(CW\*(C`line\*(C'\fR صرفاً برای ایجاد هرگونه هشدار درباره تعریف ماکرو به کار می‌روند؛ اگر کاربردی ندارند، مقدار \f(CW\*(C`NULL\*(C'\fR را برای \f(CW\*(C`filename\*(C'\fR و \&\f(CW0\fR را برای \f(CW\*(C`line\*(C'\fR مشخص کنید. تنها هشداری از این دست زمانی رخ می‌دهد که یک ماکروی قدیمی را مجدداً تعریف کنید: مقدار آن بازنویسی می‌شود و \f(CWbt_add_macro_text()\fR هشداری مبنی بر این موضوع صادر می‌کند. .Sp برای نمونه، هنگام تجزیه این مدخل تعریف ماکرو: .Sp .Vb 1 \& @string{fubar = "Fouled Up Beyond All Recognition"} .Ve .Sp کتابخانه (به‌ویژه کد پس‌پردازشی که پس از تجزیه موفق یک مدخل فراخوانی می‌شود) در نهایت این کار را انجام می‌دهد: .Sp .Vb 2 \& bt_add_macro_text ("fubar", "Fouled Up Beyond All Recognition", \& filename, line); .Ve .Sp این امر به نوبه خود باعث می‌شود که هر زمان کد پس‌پردازش ماکروی \f(CW\*(C`fubar\*(C'\fR را در مدخل‌های بعدی ببیند، آن را به درستی بسط دهد. .IP "bt_add_macro_value ()" 4 .IX Item "bt_add_macro_value ()" .Vb 2 \& void bt_add_macro_value (AST * assignment, \& btshort options); .Ve .Sp این تابع عمدتاً برای استفاده داخلی کتابخانه است، اما اگر زمانی تکه‌ای از AST در دست داشتید که نمایانگر یک تعریف ماکرو است و می‌خواستید خودتان ماکرو را تنظیم کنید (به‌جای اینکه اجازه دهید کد پس‌پردازش کتابخانه این کار را برایتان انجام دهد)، برای شما در دسترس است. \f(CW\*(C`assignment\*(C'\fR باید یک گره AST باشد همان‌طور که توسط \&\f(CWbt_next_field()\fR برگردانده می‌شود. برخلاف بیشتر توابع دیگر \fBbtparse\fR که یک آرگومان \&\f(CW\*(C`options\*(C'\fR می‌پذیرند، \f(CW\*(C`options\*(C'\fR در اینجا مشخص می‌کند که مقدار موجود در \&\f(CW\*(C`assignment\*(C'\fR چگونه پس‌پردازش شده است. این امر به این دلیل لازم است که مقادیر ماکرو باید به شیوه‌ای ویژه پردازش شوند تا در بسط‌های آینده معتبر باشند؛ اگر این مقدار به آن شیوه پردازش نشده باشد، \f(CWbt_add_macro_value()\fR آن را برایتان انجام خواهد داد. اگر نمی‌دانید مقدار چگونه پس‌پردازش شده است، کافی است مقدار \f(CW0\fR را برای \f(CW\*(C`options\*(C'\fR ارائه دهید \-\-\- این کار تضمین می‌کند مقداری متفاوت از «شیوه درست» برای ماکروها توصیف شود، بنابراین پس‌پردازش به‌درستی انجام خواهد شد. .Sp پردازش انجام‌شده روی مقادیر ماکرو عمدتاً برای اطمینان از این است که بتوانیم تنها به ذخیره یک رشته در جدول ماکرو اکتفا کنیم: ماکروهایی که درون این ماکرو فراخوانی شده‌اند خودشان بسط داده می‌شوند و تمامی زیررشته‌ها به هم متصل (الحاق) می‌شوند. برای نمونه، اگر \fBbtparse\fR این مدخل‌ها را تجزیه کند: .Sp .Vb 2 \& @string{and = " and "} \& @string{jim_n_bob = "James Smith" # and # "Bob Jones"} .Ve .Sp آنگاه مقداری که برای \f(CW\*(C`jim_n_bob\*(C'\fR ذخیره می‌شود آشکارا باید رشتهٔ \&\f(CW"James Smith and Bob Jones"\fR باشد. برای اطمینان از این موضوع، \fBbtparse\fR باید مقدار \f(CW\*(C`and\*(C'\fR را متفاوت از بیشتر رشته‌های BibTeX پردازش کند: به‌ویژه، فاصله‌های خالی پیش از ذخیره شدن رشته ادغام \fIنمی‌شوند\fR. بدین ترتیب، مقدار صحیح یعنی \f(CW" and "\fR درون مقدار \f(CW\*(C`jim_n_bob\*(C'\fR درج می‌شود. بنابراین، تمام مقادیر ماکرو پیش از ذخیره شدن، زیرماکروهایشان بسط داده شده و رشته‌هایشان به هم متصل می‌شوند، اما فاصله‌های خالی تا زمانی که ماکرو در یک مدخل معمولی به کار نرود، ادغام نمی‌شوند. .Sp این تابع \f(CWbt_add_macro_text()\fR را فراخوانی می‌کند، بنابراین همان هشدار درباره بازتعریف ماکروهای قدیمی اعمال می‌شود \-\-\- هشداری صادر شده و مقدار قدیمی از بین می‌رود. .IP "bt_delete_macro ()" 4 .IX Item "bt_delete_macro ()" .Vb 1 \& void bt_delete_macro (char * macro); .Ve .Sp یک ماکرو را از جدول ماکروها حذف می‌کند. اگر \f(CW\*(C`macro\*(C'\fR تعریف نشده باشد، هیچ عملی انجام نمی‌گیرد. .IP "bt_delete_all_macros ()" 4 .IX Item "bt_delete_all_macros ()" .Vb 1 \& void bt_delete_all_macros (void); .Ve .Sp تمام ماکروها را از جدول ماکروها حذف می‌کند. .IP "bt_macro_length ()" 4 .IX Item "bt_macro_length ()" .Vb 1 \& int bt_macro_length (char *macro); .Ve .Sp طول متن بسط‌یافته یک ماکرو را برمی‌گرداند. اگر ماکرو تعریف نشده باشد، مقدار 0 را برمی‌گرداند؛ هیچ هشداری صادر نمی‌شود. .IP "bt_macro_text ()" 4 .IX Item "bt_macro_text ()" .Vb 3 \& char * bt_macro_text (char * macro, \& char * filename, \& int line); .Ve .Sp متن بسط‌یافته یک ماکرو را برمی‌گرداند. اگر ماکرو تعریف نشده باشد، هشداری صادر کرده و \f(CW\*(C`NULL\*(C'\fR برمی‌گرداند. \f(CW\*(C`filename\*(C'\fR و \f(CW\*(C`line\*(C'\fR برای ایجاد این هشدار استفاده می‌شوند؛ اگر کاربردی ندارند (یعنی ماکرو را در نتیجه یافتن آن در فایلی بسط نمی‌دهید)، برای \f(CW\*(C`filename\*(C'\fR مقدار \&\f(CW\*(C`NULL\*(C'\fR و برای \f(CW\*(C`line\*(C'\fR مقدار \f(CW0\fR را مشخص کنید. .SH "همچنین ببینید (SEE ALSO)" .IX Header "SEE ALSO" btparse .SH "نویسنده (AUTHOR)" .IX Header "AUTHOR" Greg Ward