.\" -*- 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_FORMAT_NAMES 1" .TH BT_FORMAT_NAMES 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_format_names \- قالب‌بندی و بازترکیب نام‌ها برای خروجی یکدست در کتابخانه btparse .SH "خلاصه دستور (SYNOPSIS)" .IX Header "SYNOPSIS" .Vb 10 \& bt_name_format * bt_create_name_format (char * parts, \& boolean abbrev_first); \& void bt_free_name_format (bt_name_format * format); \& void bt_set_format_text (bt_name_format * format, \& bt_namepart part, \& char * pre_part, \& char * post_part, \& char * pre_token, \& char * post_token); \& void bt_set_format_options (bt_name_format * format, \& bt_namepart part, \& boolean abbrev, \& bt_joinmethod join_tokens, \& bt_joinmethod join_part); \& char * bt_format_name (bt_name * name, bt_name_format * format); .Ve .SH "توضیحات (DESCRIPTION)" .IX Header "DESCRIPTION" پس از تفکیک یک نام به بخش‌های سازنده آن (که به‌صورت یک ساختار \&\f(CW\*(C`bt_name\*(C'\fR نمایش داده می‌شود)، معمولاً می‌خواهید دوباره آن را به‌شکل یک رشته واحد و با قالبی یکدست بازسازی کنید. کتابخانه \&\fBbtparse\fR روشی بسیار انعطاف‌پذیر برای این کار فراهم می‌کند که معمولاً در دو مرحله انجام می‌پذیرد: نخست، یک «قالب نام» (name format) ایجاد می‌کنید که نحوه بازترکیب توکن‌ها و بخش‌های مختلف هر نام را مشخص می‌کند، و سپس این قالب را بر روی یک نام مشخص اعمال می‌نمایید. .PP «قالب نام» در قالب ساختار \&\f(CW\*(C`bt_name_format\*(C'\fR کپسوله‌سازی شده است که با تابع \&\f(CWbt_create_name_format()\fR ساخته می‌شود. این تابع شامل منطقی هوشمندانه است که باعث می‌شود در بیشتر موارد تنها فراخوانی همین تابع کافی باشد و نیازی به سفارشی‌سازی بیشتر قالب نداشته باشید. با این حال اگر نیاز به سفارشی‌سازی داشته باشید، توابع \&\f(CWbt_set_format_text()\fR و \&\f(CWbt_set_format_options()\fR این قابلیت را فراهم می‌کنند. .PP این قالب موارد زیر را کنترل می‌کند: .IP \(bu 4 کدام بخش‌های نام چاپ شوند و به چه ترتیبی (مثلاً "first von last jr" یا "von last jr first") .IP \(bu 4 متنی که قبل و بعد از هر بخش قرار می‌گیرد (مثلاً اگر نام کوچک پس از نام خانوادگی بیاید، معمولاً قبل از بخش \`first\` به یک کاما نیاز دارید: "Smith, John" به‌جای "Smith John") .IP \(bu 4 متنی که قبل و بعد از هر توکن قرار می‌گیرد (مثلاً اگر نام کوچک مخفف شده باشد، ممکن است بعد از هر توکن یک نقطه بخواهید: "J. R. Smith" به‌جای "J R Smith") .IP \(bu 4 روشی که برای پیوند دادن توکن‌های مربوط به یک بخش به یکدیگر استفاده می‌شود .IP \(bu 4 روشی که برای پیوند دادن هر بخش به بخش بعدی استفاده می‌شود .PP تمام این موارد به‌جز فهرست بخش‌های مورد نظر برای قالب‌بندی، در آرایه‌هایی نگهداری می‌شوند که اندیس آن‌ها بخش‌های نام است؛ برای مثال، این ساختار دارای فیلدی به‌شکل زیر است: .PP .Vb 1 \& char * post_token[BT_MAX_NAMEPARTS] .Ve .PP و مقدار \&\f(CW\*(C`post_token[BTN_FIRST]\*(C'\fR (که \&\f(CW\*(C`BTN_FIRST\*(C'\fR از نوع شمارشی \&\f(CW\*(C`bt_namepart\*(C'\fR است) رشته‌ای است که پس از هر توکن در نام کوچک اضافه می‌شود\-\-\-برای نمونه، اگر نام کوچک به روش مرسوم مخفف شود، مقدار آن \&\f(CW"."\fR خواهد بود. .PP نوع شمارشی دیگری به نام \&\f(CW\*(C`bt_joinmethod\*(C'\fR روش‌های موجود برای پیوند دادن توکن‌ها به یکدیگر را مشخص می‌کند. توجه داشته باشید که \fIدو\fR دسته روش پیوند در قالب نام وجود دارد: پیوند بین توکن‌های درون یک بخش واحد، و پیوند بین توکن‌های دو بخش متفاوت. دسته نخست به شما امکان می‌دهد برای نمونه \&\f(CW"J R Smith"\fR (نام کوچک مخفف بدون متن پس‌توکن ولی با توکن‌های جدا شده با فاصله) را به \&\f(CW"JR Smith"\fR (همان حالت، اما با توکن‌های چسبیده به هم در نام کوچک) تبدیل کنید. دسته دوم عمدتاً برای اطمینان از این استفاده می‌شود که بخش‌های "von" و "last" با یک نیم‌فاصله نشکن (tie) به هم پیوند داده شوند: \&\f(CW"de~Roche"\fR به‌جای \&\f(CW"de Roche"\fR. .PP روش‌های پیوند توکن‌ها عبارتند از: .IP BTJ_MAYTIE 4 .IX Item "BTJ_MAYTIE" درج یک نیم‌فاصله اختیاری (discretionary tie) بین توکن‌ها؛ یعنی بسته به زمینه، یک فاصله معمولی یا یک فاصله نشکن (tie) درج می‌شود. (فاصله نشکن که در TeX با \&\f(CW"~"\fR شناخته می‌شود، فعلاً به‌صورت پیش‌فرض هاردکد شده است.) .Sp سپس این قالب توسط تابع \&\f(CWbt_format_name()\fR بر روی یک نام خاص اعمال می‌شود و یک رشته جدید برمی‌گرداند. .IP BTJ_SPACE 4 .IX Item "BTJ_SPACE" همیشه یک فاصله بین توکن‌ها درج می‌کند. .IP BTJ_FORCETIE 4 .IX Item "BTJ_FORCETIE" همیشه یک فاصله نشکن (\f(CW"~"\fR) بین توکن‌ها درج می‌کند. .IP BTJ_NOTHING 4 .IX Item "BTJ_NOTHING" هیچ چیزی بین توکن‌ها درج نمی‌کند\-\-\-توکن‌ها مستقیماً به هم می‌چسبند. .PP پیوند دادن توکن‌ها و در نتیجه تصمیم‌گیری درباره درج فاصله نشکن اختیاری، در دو موقعیت انجام می‌شود: درون یک بخش و بین دو بخش. طبیعتاً این قاعده تنها زمانی اعمال می‌شود که مقدار \&\f(CW\*(C`BTJ_MAYTIE\*(C'\fR به‌عنوان روش پیوند انتخاب شده باشد؛ مقادیر \&\f(CW\*(C`BTJ_SPACE\*(C'\fR و \&\f(CW\*(C`BTJ_FORCETIE\*(C'\fR همواره به ترتیب فاصله یا نیم‌فاصله نشکن درج می‌کنند، و \&\f(CW\*(C`BTJ_NOTHING\*(C'\fR همیشه هیچ کاراکتری بین توکن‌ها اضافه نمی‌کند. در درون یک بخش، در صورتی که توکن اول کمتر از سه نویسه طول داشته باشد بعد از آن، و همچنین قبل از توکن آخر فاصله نشکن اضافه می‌شود. در میان دو بخش، فاصله نشکن تنها زمانی اضافه می‌شود که بخش قبلی از یک توکن منفرد با طول کمتر از سه نویسه تشکیل شده باشد. در تمامی موارد دیگر، فاصله معمولی درج می‌شود. (این پیاده‌سازی دقیقاً از رفتار BibTeX پیروی می‌کند.) .SH "توابع (FUNCTIONS)" .IX Header "FUNCTIONS" .IP \fBbt_create_name_format()\fR 4 .IX Item "bt_create_name_format()" .Vb 2 \& bt_name_format * bt_create_name_format (char * parts, \& boolean abbrev_first) .Ve .Sp یک قالب نام برای مجموعه‌ای از بخش‌ها ایجاد می‌کند، همراه با تنظیمات متداول برای سفارشی‌سازی\-\-\-ترتیب بخش‌ها و مخفف‌سازی نام کوچک. .Sp پارامتر \&\f(CW\*(C`parts\*(C'\fR مشخص می‌کند که چه بخش‌هایی در نام قالب‌بندی‌شده گنجانده شوند و ترتیب قرارگیری آن‌ها چگونه باشد. \&\f(CW\*(C`parts\*(C'\fR باید رشته‌ای شامل حداکثر چهار نویسه باشد که هر یک نشان‌دهنده یکی از چهار بخش نام است: برای نمونه، \&\f(CW"vljf"\fR به معنای قالب‌بندی هر چهار بخش به ترتیب "von last jr first" است. استفاده از نویسه‌هایی خارج از مجموعه \&\f(CW"fvlj"\fR مجاز نیست و هیچ نویسه‌ای نباید تکرار شود. پارامتر \&\f(CW\*(C`abbrev_first\*(C'\fR تعیین می‌کند که آیا بخش \`first\` مخفف شود یا خیر (یعنی فقط حرف اول هر توکن چاپ شود). .Sp علاوه بر تنظیم فهرست بخش‌ها و فلگ مخفف‌سازی نام کوچک، تابع \&\f(CWbt_create_name_format()\fR کل ساختار قالب را به‌گونه‌ای مقداردهی اولیه می‌کند که نیاز به سفارشی‌سازی‌های بعدی به حداقل برسد: .RS 4 .IP \(bu 4 «روش پیوند توکن‌ها»\-\-\-آنچه بین توکن‌های یک بخش درج می‌شود\-\-\-برای تمام بخش‌ها روی \&\f(CW\*(C`BTJ_MAYTIE\*(C'\fR (فاصله نشکن اختیاری) تنظیم می‌شود. .IP \(bu 4 «روش پیوند بخش‌ها»\-\-\-آنچه پس از آخرین توکن یک بخش خاص (با فرض وجود بخش‌های بعدی) درج می‌شود\-\-\-برای بخش‌های \`first\`، \`last\` و \`jr\` روی \&\f(CW\*(C`BTJ_SPACE\*(C'\fR تنظیم می‌شود. اگر بخش \`von\` وجود داشته باشد و بلافاصله قبل از بخش \`last\` قرار گیرد (که تقریباً همیشه همین‌طور است)، از \&\f(CW\*(C`BTJ_MAYTIE\*(C'\fR برای اتصال \`von\` به \`last\` استفاده می‌شود؛ در غیر این صورت، برای \`von\` نیز از \&\f(CW\*(C`BTJ_SPACE\*(C'\fR به‌عنوان روش پیوند بین‌بخشی استفاده خواهد شد. .IP \(bu 4 فلگ مخفف‌سازی برای بخش‌های \`von\`، \`last\` و \`jr\` برابر با \&\f(CW\*(C`FALSE\*(C'\fR قرار داده می‌شود؛ برای بخش \`first\`، این فلگ برابر با مقداری تنظیم می‌شود که در آرگومان \&\f(CW\*(C`abbrev_first\*(C'\fR ارسال کرده‌اید. .IP \(bu 4 در ابتدا، تمام متون احاطه‌کننده (متن پیش‌بخش، پس‌بخش، پیش‌توکن و پس‌توکن) برای تمامی بخش‌ها رشته خالی تنظیم می‌شوند. سپس بسته به فلگ \&\f(CW\*(C`abbrev_first\*(C'\fR و ترتیب توکن‌ها چند تغییر اعمال می‌شود: نخست، اگر \&\f(CW\*(C`abbrev_first\*(C'\fR برابر با \&\f(CW\*(C`TRUE\*(C'\fR باشد، متن پس‌توکن برای نام کوچک روی \&\f(CW"."\fR تنظیم می‌شود\-\-\-این کار \&\f(CW"J R Smith"\fR را به \&\f(CW"J. R. Smith"\fR تبدیل می‌کند که معمولاً شکل مطلوب است. (اگر نقطه‌ها را \fIنمی‌خواهید\fR، باید خودتان متن پس‌توکن را با \&\f(CWbt_set_format_text()\fR تنظیم کنید.) .Sp سپس، اگر \`jr\` وجود داشته باشد و بلافاصله پس از \`last\` قرار گیرد (تقریباً همیشه چنین است)، متن پیش‌بخش برای \`jr\` برابر با \&\f(CW", "\fR تنظیم شده و روش پیوند بین‌بخشی برای \`last\` روی \&\f(CW\*(C`BTJ_NOTHING\*(C'\fR قرار می‌گیرد. این تنظیم باعث می‌شود عبارت \&\f(CW"John Smith Jr"\fR (که در آن فاصله پس از \&\f(CW"Smith"\fR ناشی از قالب‌بندی نام خانوادگی با روش پیوند بین‌بخشی \&\f(CW\*(C`BTJ_SPACE\*(C'\fR بوده) به \&\f(CW"John Smith, Jr"\fR تبدیل شود (که در آن \&\f(CW", "\fR اکنون به \&\f(CW"Jr"\fR وابسته است\-\-\-به این ترتیب اگر بخش \`jr\` وجود نداشته باشد، \&\f(CW", "\fR نیز چاپ نخواهد شد). .Sp در نهایت، اگر \`first\` وجود داشته باشد و بلافاصله پس از \`jr\` یا \`last\` بیاید (که در قالب‌های «نام خانوادگی در ابتدا» معمولاً چنین است)، همین منطق اعمال می‌شود: متن پیش‌بخش برای \`first\` روی \&\f(CW", "\fR تنظیم شده و روش پیوند بخش برای بخش قبلی (خواه \`jr\` باشد یا \`last\`) روی \&\f(CW\*(C`BTJ_NOTHING\*(C'\fR قرار می‌گیرد. .RE .RS 4 .Sp اگرچه تمامی این قواعد تا حدی پیچیده به نظر می‌رسند، اما باعث می‌شوند که معمولاً از انجام هرگونه سفارشی‌سازی دستی قالب نام بی‌نیاز شوید. این موضوع به‌ویژه زمانی صادق است که تنها به ترتیب‌های \f(CW"fvlj"\fR و \f(CW"vljf"\fR نیاز داشته باشید، فقط بخواهید نام کوچک را مخفف کنید، بعد از توکن‌های مخفف نقطه بگذارید، فاصله‌های نشکن در جای مناسب قرار گیرند و کاماها مطابق عرف درج شوند. .Sp اگر به قالبی غیرمعمول نیاز دارید\-\-\-برای مثال توکن‌های مخففِ چسبیده به هم بدون علامت‌گذاری نگارشی، یا مخفف کردن نام خانوادگی\-\-\-باید قالب نام را با استفاده از توابع \&\f(CWbt_set_format_text()\fR و \&\f(CWbt_set_format_options()\fR سفارشی‌سازی کنید. .RE .IP \fBbt_free_name_format()\fR 4 .IX Item "bt_free_name_format()" .Vb 1 \& void bt_free_name_format (bt_name_format * format) .Ve .Sp حافظه اختصاص‌یافته به قالب نام ایجادشده توسط \&\f(CWbt_create_name_format()\fR را آزاد می‌کند. .IP \fBbt_set_format_text()\fR 4 .IX Item "bt_set_format_text()" .Vb 6 \& void bt_set_format_text (bt_name_format * format, \& bt_namepart part, \& char * pre_part, \& char * post_part, \& char * pre_token, \& char * post_token) .Ve .Sp به شما امکان می‌دهد بخشی از متون احاطه‌کننده یا تمامی آن‌ها را برای یک بخش منفرد از نام سفارشی‌سازی کنید. برای هر بخشی از متن که مایل به تغییر آن نیستید، مقدار \&\f(CW\*(C`NULL\*(C'\fR ارسال کنید. .Sp برای مثال، فرض کنید می‌خواهید قالبی بسازید که نام کوچک را مخفف کند، اما بدون درج هیچ‌گونه علامت نگارشی پس از توکن‌های مخفف. می‌توانید قالب را به شکل زیر ایجاد و سفارشی‌سازی کنید: .Sp .Vb 5 \& format = bt_create_name_format ("fvlj", TRUE); \& bt_set_format_text (format, \& BTN_FIRST, /* name\-part to customize */ \& NULL, NULL, /* pre\- and post\- part text */ \& NULL, ""); /* empty string for post\-token */ .Ve .Sp بدون فراخوانی \&\f(CWbt_set_format_text()\fR، متغیر \&\f(CW\*(C`format\*(C'\fR نام‌ها را به‌صورت \&\f(CW"J. R. Smith"\fR قالب‌بندی می‌کرد. پس از تنظیم متن پس‌توکن برای نام کوچک روی \&\f(CW""\fR، این نام به \&\f(CW"J R Smith"\fR تبدیل می‌شود. .IP \fBbt_set_format_options()\fR 4 .IX Item "bt_set_format_options()" .Vb 5 \& void bt_set_format_options (bt_name_format * format, \& bt_namepart part, \& boolean abbrev, \& bt_joinmethod join_tokens, \& bt_joinmethod join_part) .Ve .Sp امکان سفارشی‌سازی بیشتر قالب نام را فراهم می‌کند: می‌توانید فلگ مخفف‌سازی و دو روش پیوند توکن را تنظیم کنید. متأسفانه سازوکاری برای بدون تغییر گذاشتن یک مقدار وجود ندارد؛ باید همه گزینه‌ها را با \&\f(CWbt_set_format_options()\fR مقداردهی کنید. .Sp به‌عنوان مثال، فرض کنید حذف نقطه‌ها از توکن‌های مخفف در نام کوچک کافی نیست و \fIواقعاً\fR می‌خواهید با چسباندن توکن‌های مخفف به یکدیگر فضا را ذخیره کنید: \&\f(CW"JR Smith"\fR به‌جای \&\f(CW"J R Smith"\fR. با فرض اینکه دو فراخوانی مثال قبلی انجام شده باشند، دستورات زیر کار را تکمیل می‌کنند: .Sp .Vb 4 \& bt_set_format_options (format, BTN_FIRST, \& TRUE, /* keep same value for abbrev flag */ \& BTJ_NOTHING, /* jam tokens together */ \& BTJ_SPACE); /* space after final token of part */ .Ve .Sp توجه داشته باشید که متأسفانه مجبور بودیم مقادیر فعلی فلگ مخفف‌سازی و روش پیوند پس‌بخش را بدانیم (و ارسال کنیم)، هرچند که فقط قصد تغییر روش پیوند درون‌بخشی را داشتیم. .IP \fBbt_format_name()\fR 4 .IX Item "bt_format_name()" .Vb 1 \& char * bt_format_name (bt_name * name, bt_name_format * format) .Ve .Sp پس از ایجاد قالب نام و سفارشی‌سازی کامل آن مطابق نیاز خود، می‌توانید از آن برای قالب‌بندی هر تعداد نامی که با \&\f(CW\*(C`bt_split_name\*(C'\fR تفکیک شده‌اند استفاده کنید (به bt_split_names مراجعه کنید). کافی است ساختار نام و ساختار قالب نام را ارسال کنید تا یک رشته تازه تخصیص‌یافته حاوی نام قالب‌بندی‌شده به شما بازگردانده شود. آزادسازی این رشته با تابع \&\f(CWfree()\fR بر عهده شماست. .SH "همچنین ببینید (SEE ALSO)" .IX Header "SEE ALSO" btparse, bt_split_names .SH "نویسندگان (AUTHORS)" .IX Header "AUTHORS" Greg Ward