groff_font(5) File Formats Manual groff_font(5)

groff_font - فرمت فایلهای توصیف قلم و دستگاه groff

فرمت‌های توصیف قلم و دستگاه خروجی groff گسترش‌یافته‌های جزئی از فرمت‌های استفاده‌شده توسط troff مستقل از دستگاه AT&T هستند. برخلاف پیاده‌سازی AT&T، groff فاقد فرمت باینری است؛ تمام فایل‌ها متنی هستند. (همچنین troff در Plan 9 فرمت باینری را کنار گذاشته است.) فایل‌های توصیف دستگاه و قلم برای یک دستگاه به نام name در دایرکتوری devname ذخیره می‌شوند. فایل توصیف دستگاه DESC نامیده می‌شود، و برای هر قلمی که دستگاه پشتیبانی می‌کند، یک فایل توصیف قلم به نام f وجود دارد، که در آن f معمولاً مخفف نام قلم و/یا سبک آن است. به عنوان مثال، دستگاه ps (PostScript) دارای فایل‌های توصیف قلم groff برای Times roman (TR) و Zapf Chancery Medium italic (ZCMI) در میان موارد بسیار دیگر است، در حالی که دستگاه utf8 (برای ترمینال‌ها) دارای توصیف قلم برای سبک‌های roman، italic، bold و bold-italic (به ترتیب R، I، B و BI) است.

فایل‌های توصیف دستگاه و قلم توسط قالب‌بند، troff، و توسط درایورهای خروجی خوانده می‌شوند. برنامه‌ها معمولاً پردازش این فایل‌ها را به یک کتابخانه داخلی، libgroff، محول می‌کنند تا تفسیر یکدست آن‌ها تضمین شود.

فایل DESC شامل مجموعه‌ای از دستورالعمل‌ها (directives) است؛ هر دستورالعمل در ابتدای یک خط آغاز می‌شود. ترتیب آن‌ها مهم نیست، به استثنای دو مورد: (۱) دستورالعمل res باید پیش از هر دستورالعمل papersize قرار گیرد؛ و (۲) دستورالعمل charset باید در انتها بیاید (در صورت وجود). اگر نام یک دستورالعمل تکرار شود، مدخل‌های بعدی در فایل جایگزین موارد قبلی می‌شوند (به جز اینکه ابعاد کاغذ بر اساس دستورالعمل res که پیش از برخورد با papersize دیده شده محاسبه می‌شود). فاصله‌ها و/یا تب‌ها کلمات را از هم جدا می‌کنند و در مرزهای خط نادیده گرفته می‌شوند. توضیحات (کامنت‌ها) با نویسه “#” آغاز شده و تا انتهای خط ادامه می‌یابند. خطوط خالی نادیده گرفته می‌شوند.

خانواده قلم پیش‌فرض fam است.
قلم‌های F1, ..., Fn در موقعیت‌های قلم m+1, ..., m+n مستقر (mount) می‌شوند، که در آن m تعداد styles است (به زیر مراجعه کنید). این دستورالعمل می‌تواند در بیش از یک خط ادامه یابد. نام قلم برابر 0 باعث می‌شود هیچ قلمی در موقعیت مربوطه مستقر نشود.
میزان حرکت افقی برابر با n واحد پایه است. اندازه‌گیری‌های افقی به مضارب از n گرد می‌شوند.
استفاده از program برای تولید تصاویر PNG از ورودی PostScript. در GNU/Linux، این معمولاً gs(1) است، اما در سیستم‌های دیگر (به‌ویژه Cygwin) ممکن است به نام دیگری تنظیم شود. درایور grohtml(1) از این دستورالعمل استفاده می‌کند.
بُعد عمودی رسانه خروجی n واحد پایه است (منسوخ‌شده: به جای آن از papersize استفاده کنید).
ابعاد رسانه خروجی بر اساس آرگومان مشخص می‌شود، که می‌تواند یک فرمت استاندارد کاغذ، یک جفت ابعاد، یا نام یک فایل متنی ساده حاوی هر یک از موارد فوق باشد. فرمت‌های کاغذ شناخته‌شده عبارتند از فرمت‌های ISO و DIN شامل A0–A7، B0–B7، C0–C7 و D0–D7؛ فرمت‌های ایالات متحده شامل letter، legal، tabloid، ledger، statement و executive؛ و فرمت‌های پاکت‌نامه شامل com10، monarch و DL. تطبیق بدون در نظر گرفتن بزرگی و کوچکی حروف انجام می‌شود.
در غیر این صورت، آرگومان می‌تواند یک فرمت کاغذ سفارشی به صورت length,width باشد (بدون فاصله قبل یا بعد از کاما). هر دو مقدار length و width باید دارای یک واحد پیوست باشند؛ واحدهای معتبر عبارتند از “i” برای اینچ، “c” برای سانتی‌متر، “p” برای پوینت، و “P” برای پایکا (pica). مثال: “12c,235p”. آرگومانی که با یک رقم آغاز شود همواره به عنوان فرمت سفارشی کاغذ در نظر گرفته می‌شود.
در نهایت، آرگومان می‌تواند نام یک فایل باشد (مانند /etc/papersize)؛ اگر فایل باز شود، خط نخست آن خوانده شده و برای تطبیق با اشکال دیگر تلاش می‌شود. هیچ ساختاری برای کامنت‌گذاری پشتیبانی نمی‌شود.
می‌توان بیش از یک آرگومان تعیین کرد؛ هر یک به نوبت بررسی شده و نخستین مشخصه معتبر کاغذ استفاده می‌شود.
بُعد افقی رسانه خروجی n واحد پایه است (منسوخ‌شده: به جای آن از papersize استفاده کنید).
دستور دادن به troff برای ارسال نام فایل منبعی که در حال پردازش است. این کار با دستور خروجی واسط “x F” انجام می‌شود، که grohtml آن را تفسیر می‌کند.
استفاده از program به عنوان پس‌پردازشگر (postprocessor).
استفاده از program به عنوان پیش‌پردازشگر (preprocessor). دستگاه‌های خروجی html و xhtml از این دستورالعمل استفاده می‌کنند.
استفاده از program به عنوان صف‌بندی‌کننده چاپ (print spooler). در صورت حذف، گزینه‌های -l و -L در groff نادیده گرفته می‌شوند.
تفکیک‌پذیری (رزولوشن) دستگاه n واحد پایه در هر اینچ است.
دستگاه دارای قلم‌ها در s1، ...، sn پوینت مقیاس‌شده (scaled points) است (به زیر مراجعه کنید). فهرست اندازه‌ها باید با یک عدد 0 خاتمه یابد. هر si می‌تواند یک بازه از اندازه‌ها به صورت m–n نیز باشد. این فهرست می‌تواند در بیش از یک خط ادامه یابد.
هر پوینت تایپوگرافی به n پوینت مقیاس‌شده تقسیم می‌شود. مقدار پیش‌فرض برابر 1 است.
تعداد نخستین m موقعیت استقرار قلم با سبک‌های S1، ...، Sm مرتبط می‌شوند.
پس‌پردازشگر می‌تواند دستورات خروجی واسط t و u را مدیریت کند.
دستگاه خروجی از مجموعه کامل یونیکد پشتیبانی می‌کند. این دستورالعمل تنها برای دستگاه‌هایی مفید است که به جای گلیف‌ها، موجودیت‌های نویسه‌ای (character entities) تولید می‌کنند.
اگر unicode حضور داشته باشد، هیچ بخش charset در فایل‌های توصیف قلم لازم نیست زیرا مدیریت یونیکد داخلی groff به کار گرفته می‌شود. با این حال، اگر مدخل‌هایی در بخش charset یک فایل توصیف قلم وجود داشته باشد، آن‌ها یا نگاشت‌های پیش‌فرض را برای آن نویسه‌های خاص بازنویسی می‌کنند یا نگاشت‌های جدید اضافه می‌نمایند (معمولاً برای نویسه‌های ترکیبی).
دستگاه‌های خروجی utf8، html و xhtml از این دستورالعمل استفاده می‌کنند.
پایه اختیاری که متریک‌های قلم هنگام رندر کردن گلیف‌ها در اندازه حروفچینیِ یک پوینت، متناسب با آن مقیاس‌بندی می‌شوند.
وادار کردن ماژول مدیریت قلم به بازگرداندن همیشگی پهنای گلیف بدون مقیاس‌بندی. درایور grohtml از این دستورالعمل استفاده می‌کند.
قالب‌بند troff باید نویسه‌های خاص را در آرگومان‌های ارسالی به دستورات افزونه دستگاه کدگذاری کند. درایور grohtml از این دستورالعمل استفاده می‌کند.
میزان حرکت عمودی برابر با n واحد پایه است. اندازه‌گیری‌های عمودی به مضارب از n گرد می‌شوند.
این دستورالعمل و بقیه فایل نادیده گرفته می‌شوند. این مورد برای سازگاری با سایر پیاده‌سازی‌های troff شناخته می‌شود. در troff گنو، رپرتوار مجموعه نویسه‌ها به ازای هر قلم توصیف می‌شود.

قالب‌بند troff دستورالعمل‌های spare1، spare2 و biggestfont را شناسایی اما نادیده می‌گیرد.

خطوط res، unitwidth، fonts و sizes اجباری هستند. دستورالعمل‌هایی که در بالا ذکر نشده‌اند توسط troff نادیده گرفته می‌شوند اما ممکن است توسط پس‌پردازشگرها برای کسب اطلاعات بیشتر درباره دستگاه مورد استفاده قرار گیرند.

در دستگاه‌های خروجی حروفچینی، هر قلم معمولاً در چندین اندازه در دسترس است. در حالی که اندازه‌گیری‌های کاغذ در فایل توصیف دستگاه در واحدهای مطلق بیان می‌شوند، اندازه‌گیری‌های مربوط به قلم‌ها باید متناسب با اندازه حروفچینی باشند. مقدار unit width (پهنای واحد) قلم یک مبنای عددی برقرار می‌سازد که امکان می‌دهد تمامی متریک‌های آن در صورت رندر شدن در اندازه یک پوینت، به صورت اعداد صحیح بیان شوند. هنگامی که قالب‌بند اندازه حروفچینی را پیکربندی می‌کند، متریک‌ها را به صورت خطی نسبت به آن مبنا مقیاس‌بندی می‌نماید. پهنای واحد هیچ ارتباط ذاتی با تفکیک‌پذیری دستگاه ندارد، و همین فرایند تقسیم برای تمامی متریک‌های قلم اعمال می‌شود. دقت کنید که هر واحدی برای پهنای واحد انتخاب شود، عمل تقسیم ناشی از مقیاس‌بندی آن را خنثی کرده و مقداری بدون بُعد بر جای می‌گذارد.

به عنوان مثال، دستگاه lbp در groff از یک دستورالعمل unitwidth با آرگومان 800 استفاده می‌کند. قلم Times roman آن یعنی TR دارای یک spacewidth برابر با 833 است؛ این همچنین پهنای ویرگول، نقطه، نقطه مرکزی و علامت ستاره ریاضی آن است، در حالی که “M” آن پهنایی برابر با 2,963 دارد. بنابراین، یک “M” روی دستگاه lbp برابر با 2,963 ÷ 800 برابر پهنای واحد، یا تقریباً 3.7 است. در یک اندازه حروفچینی 10 پوینتی، یک “M” قلم Times roman بنابراین 37 واحد پهنا دارد.

یک فایل توصیف قلم دارای دو بخش است. بخش نخست دنباله‌ای از دستورالعمل‌ها است، و همانند فایل DESC که در بالا شرح داده شد، تجزیه می‌شود. به جز نام‌های دستورالعمل‌هایی که بخش دوم را آغاز می‌کنند، ترتیب قرارگیری آن‌ها اهمیتی ندارد. دستورالعمل‌های بعدی با نام یکسان، موارد قبلی را بازنویسی می‌کنند، فاصله‌ها و تب‌ها به همان شکل مدیریت می‌شوند، و ساختار توضیحات یکسانی پشتیبانی می‌گردد. خطوط خالی در سرتاسر فایل نادیده گرفته می‌شوند.

نام قلم برابر با F است. “DESC” یک نام نامعتبر برای قلم است. اعداد صحیح ساده معتبر هستند، اما استفاده از آن‌ها توصیه نمی‌شود. (درخواست‌ها و دنباله‌های گریز groff اعداد صحیح غیرمنفی را در عوض به عنوان موقعیت‌های استقرار تفسیر می‌کنند. علاوه بر این، قلمی به نام “0” نمی‌تواند به صورت خودکار توسط دستورالعمل fonts در فایل DESC مستقر شود.)
پهنای یک فاصله بین کلمات تنظیم‌نشده (unadjusted) برابر با n نسبت به پهنای واحد دستگاه است.

دستورالعمل‌های فوق باید در بخش نخست قرار گیرند؛ موارد زیر اختیاری هستند.

گلیف‌های قلم دارای شیب (slant) به میزان n درجه هستند؛ یک n مثبت در جهت جریان متن شیب ایجاد می‌کند.
گلیف‌های lig1، ...، lign لیگاتور (حروف متصل / دوحرفی) هستند؛ لیگاتورهای ممکن عبارتند از ff، fi، fl، ffi و ffl. برای سازگاری با سایر پیاده‌سازی‌های troff، فهرست لیگاتورها می‌تواند با یک عدد 0 خاتمه یابد. فهرست لیگاتورها نباید در بیش از یک خط امتداد یابد.
این قلم special (ویژه) است: هنگامی که سند تلاش می‌کند گلیفی را قالب‌بندی کند که در قلمِ فعلیِ انتخاب‌شده در قالب‌بند وجود ندارد، گلیف در هر قلم مستقرشده‌ای که دارای این ویژگی باشد جستجو می‌شود. اغلب، چنین قلم‌هایی unstyled (بدون سبک) هستند، و فاقد گونه‌های پررنگ (bold) یا شیب‌دار (italic یا oblique) می‌باشند.

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

بخش دوم شامل یک تا سه زیربخش است، که می‌توانند با هر ترتیبی بیایند، و هر کدام از آن‌ها می‌تواند بخش دوم را آغاز کند. هر یک با دستورالعملی در یک خط مجزا آغاز می‌شود. یک زیربخش charset اجباری است مگر اینکه فایل DESC مربوطه حاوی دستورالعمل unicode باشد. زیربخش دیگر، kernpairs، اختیاری است.

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

name metrics type index [entity-name] [-- comment]

فیلد name گلیف را مشخص می‌کند: یک نویسه c قابل چاپ با نویسه معمولی  c در troff مطابقت دارد، و یک دنباله چندنویسه‌ای که با \ شروع نمی‌شود، با دنباله گریز نویسه خاص troff گنو “\[name]” مطابقت دارد. نامی متشکل از سه علامت منفی، “---”، نشان می‌دهد که گلیف بی‌نام است: به چنین گلیف‌هایی فقط از طریق دنباله گریز \N در troff می‌توان دسترسی پیدا کرد. یک نویسه خاص با نام “---” هنوز هم می‌تواند با استفاده از .char و درخواست‌های مشابه تعریف شود. مقدار name به صورت “\-” گلیف علامت منها را تعریف می‌کند. در نهایت، name می‌تواند دنباله‌های گریز حرکت افقی \| و \^ (به ترتیب فاصله‌های “نازک (thin)” و “مویی (hair)”) باشد، که در این حالت تنها متریک پهنا که در زیر شرح داده شده اعمال می‌شود؛ بنابراین یک قلم می‌تواند پهنای این فاصله‌ها را سفارشی‌سازی کند.

ساختار فیلد metrics به صورت زیر است (در یک خط؛ در اینجا برای خوانایی شکسته شده است).

width[,[height[,[depth[,[italic-correction[,[left-italic-correction[,[subscript-correction]]]]]]]]]]

فاصله‌ها، تب‌ها و خطوط جدید میان این زیرفیلدها، که به صورت اعداد صحیح ده‌دهی بیان می‌شوند، ممنوع است. واحد اندازه‌گیری همان واحد تعیین‌شده توسط دستورالعمل unitwidth است و بر اساس اندازه حروفچینی مقیاس‌بندی می‌شود. زیرفیلدهای نامشخص به طور پیش‌فرض 0 هستند. از آنجا که فرمت باینری مرتبطی وجود ندارد، نیازی نیست این مقادیر مانند troff مستقل از دستگاه AT&T در نوع داده زبان سی char بگنجند.

زیرفیلد width پهنای گلیف را مشخص می‌کند. زیرفیلد height ارتفاع گلیف را مشخص می‌کند (رو به بالا مثبت است)؛ اگر یک گلیف فراتر از خط پایه امتداد نیابد، به آن ارتفاع صفر بدهید، نه یک ارتفاع منفی. زیرفیلد depth عمق گلیف را مشخص می‌کند—یعنی فاصله‌ای زیر خط پایه که گلیف تا آن امتداد می‌یابد (رو به پایین مثبت است)؛ اگر گلیف به زیر خط پایه امتداد نیابد، به آن عمق صفر بدهید، نه یک عمق منفی. تصحیح‌های خوابیده (italic corrections) زمانی اعمال می‌شوند که سبک‌های عمودی (upright) و شیب‌دار (italic یا oblique) در کنار یکدیگر حروفچینی شوند. مقدار italic-correction میزان فاصله‌ای است که باید پس از یک گلیف شیب‌دار که بلافاصله با یک گلیف عمودی دنبال می‌شود، اضافه گردد. مقدار left-italic-correction میزان فاصله‌ای است که باید پیش از یک گلیف شیب‌دار که بلافاصله قبل از آن یک گلیف عمودی قرار دارد، اضافه گردد. مقدار subscript-correction میزان فاصله‌ای است که باید پس از یک گلیف شیب‌دار که با یک زیرنویس دنبال می‌شود، اضافه گردد؛ این مقدار باید کمتر از تصحیح خوابیده (italic correction) باشد.

برای قلم‌های مورداستفاده با دستگاه‌های حروفچینی، فیلد type توصیفی از ویژگی‌های ساختاری گلیف ارائه می‌دهد: این یک ماسک بیتی (bit mask) است که ثبت می‌کند آیا گلیف یک بالاآمده (ascender)، پایین‌آمده (descender)، هر دو، یا هیچ‌کدام است. هنگامی که یک دنباله گریز \w درون‌یابی می‌شود، این مقادیر برای هر گلیف به صورت بیتی OR می‌شوند و در ثبات ct ذخیره می‌گردند. در توصیف‌های قلم برای ترمینال‌ها، تمامی گلیف‌ها صرف‌نظر از ظاهرشان ممکن است مقداری برابر با صفر داشته باشند.

0
بدین معناست که گلیف به طور کامل میان خط پایه و یک خط افقی در “x-height” قلم قرار می‌گیرد، مانند “a”، “c” و “x”؛
1
بدین معناست که گلیف به زیر خط پایه فرود می‌آید، مانند “p”؛
2
بدین معناست که گلیف به بالای x-height قلم صعود می‌کند، مانند “A” یا “b”؛ و
3
بدین معناست که گلیف هم بالاآمده و هم پایین‌آمده است—این در مورد پرانتزها در برخی قلم‌ها صدق می‌کند.

فیلد index یک عدد صحیح است که گلیف را به صورت یکتا در قلم مشخص می‌سازد؛ هر عدد صحیحی به عنوان ورودی پذیرفته می‌شود، (یعنی هر عدد صحیحی که توسط تابع strtol(3) کتابخانه استاندارد زبان C قابل تجزیه باشد) اما هیچ قلم کاربردی از تمام مقادیر ممکن استفاده نمی‌کند. یک index محدود به دامنه نوع داده int زبان C در سیستم است. در یک سند troff، از دنباله گریز نویسه نمایه‌گذاری‌شده \N برای تعیین یک گلیف از طریق نمایه آن استفاده کنید.

فیلد entity-name شناسه‌ای را برای گلیف تعریف می‌کند که پس‌پردازشگر از آن برای چاپ نام گلیف name در troff استفاده می‌کند. این فیلد اختیاری است؛ این فیلد معرفی شد تا درایور خروجی grohtml بتواند مجموعه نویسه‌های خود را کدگذاری کند. به عنوان مثال، گلیف \[Po] در HTML 4.0 با “£” نمایش داده می‌شود. برای کارایی بیشتر، این داده‌ها اکنون مستقیماً درون grohtml کامپایل شده‌اند. ابزار grops از این فیلد برای ساخت آرایه‌های زیرکدگذاری برای قلم‌های PostScript حاوی بیش از ۲۵۶ گلیف استفاده می‌کند.

هر چیزی در خط پس از فیلد entity-name یا “--” نادیده گرفته می‌شود. هنگامی که afmtodit فایل‌های توصیف قلم را برای gropdf(1) و grops(1) تولید می‌کند، کد UTF-16 نویسه را در فیلد توضیح (comment) می‌نویسد.

یک خط در بخش charset همچنین می‌تواند شکلی به صورت

name "
داشته باشد که name را به عنوان نام دیگری برای گلیف ذکرشده در خط پیشین مشخص می‌کند. چنین نام‌های مستعاری می‌توانند زنجیره‌ای باشند.

زیربخش charset-range مشابه دستورالعمل charset کار می‌کند با این تفاوت که توصیف‌های گلیف از یک name به فرم uAAAA..uFFFF استفاده می‌کنند، که در آن AAAA و FFFF دنباله‌هایی از ارقام هگزادسیمال هستند؛ متریک‌های مشخص‌شده سپس به طور یکسان بر تمام گلیف‌های موجود در دامنه تعیین‌شده اعمال می‌شوند.

دستورالعمل kernpairs فهرستی از تنظیمات فاصله جفت‌حروف (kerning adjustments) را آغاز می‌کند که باید روی جفت گلیف‌های مجاور از این قلم اعمال شود. این بخش شامل دنباله‌ای از خطوط با ساختار زیر است:

g1 g2 n
عبارت فوق بدین معناست که وقتی گلیف g1 بلافاصله پیش از g2 حروفچینی می‌شود، فاصله میان آن‌ها باید به‌میزان n افزایش یابد. واحد اندازه‌گیری همان واحد تعیین‌شده توسط دستورالعمل unitwidth است و بر اساس اندازه حروفچینی مقیاس‌بندی می‌شود. بیشتر جفت‌های کرنینگ باید مقداری منفی برای n داشته باشند.

/usr/share/groff/1.24.1/font/devname/DESC
دستگاه خروجی name را توصیف می‌کند.
/usr/share/groff/1.24.1/font/devname/F
قلم شناخته‌شده با نام F روی دستگاه name را توصیف می‌کند.

Groff: The GNU Implementation of troff، نوشته Trent A. Fisher و Werner Lemberg، راهنمای اصلی groff است. می‌توانید آن را به صورت تعاملی با دستور “info groff” مرور کنید.

“Troff User's Manual” نوشته Joseph F. Ossanna، ۱۹۷۶ (بازبینی‌شده توسط Brian W. Kernighan، ۱۹۹۲)، گزارش فنی علوم رایانه شماره ۵۴ آزمایشگاه‌های بل AT&T، که به طور گسترده به سادگی “CSTR #54” نامیده می‌شود، زبان، فرمت‌های فایل توصیف دستگاه و قلم، و زبان مستقل از دستگاه شرح صفحه را که در مستندات groff به مجموع آن‌ها “AT&T troff” گفته می‌شود، مستند می‌کند.

“A Typesetter-independent TROFF” نوشته Brian W. Kernighan، ۱۹۸۲، گزارش فنی علوم رایانه شماره ۹۷ آزمایشگاه‌های بل AT&T، دیدگاه‌های بیشتری در مورد فرمت‌های فایل توصیف قلم و دستگاه و زبان مستقل از دستگاه شرح صفحه ارائه می‌دهد.

groff(1)، زیربخش “Utilities”، برنامه‌های موجود برای توصیف قلم‌ها در فرمت‌های گوناگون را فهرست می‌کند به گونه‌ای که درایورهای خروجی groff بتوانند از آن‌ها استفاده نمایند.

troff(1) مسیر پیش‌فرض جستجوی فایل‌های توصیف دستگاه و قلم را مستند می‌کند.

groff_out(5)، addftinfo(1)

2026-03-15 groff 1.24.1