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

لاتک LATEX => حروف‌چینی مستندات => نويسنده: ابوالفضل دیانت در سپتامبر 30, 2012, 09:54:01 am

عنوان: سوالی در مورد بازنویسی دستورات
رسال شده توسط: ابوالفضل دیانت در سپتامبر 30, 2012, 09:54:01 am
با سلام
من می خواهم یک دستور مثلا مثل دستور زیر را بازنویسی کنم:
\newglossaryentry{Hello}{
type=english,
name={\lr{Hello}},
plural={سلام},
description={
واژه‌ای است که معمولا هنگامی که دو فرد به هم می‌رسند بیان می‌شود، و به عنوان شروعی برای مکالمه انتهاب می‌گردد. }
}

قاعدتا باید بنویسم:
\let\oldnewglossaryentry\newglossaryentry
\renewcommand{\newglossaryentry}[2]{
\oldnewglossaryentry{#1}{type = ...., description= ........, name= .........}
}

سوال اول: مثلا می‌خواهم یک تغییری روی type‌ و یا plural بدهیم، چگونه می‌توانم این مقادیر را استخراج کنم. چگونه باید مقدار type را که کاربر اختصاص داده است و یا مقدار plural که کاربر وارد کرده را استخراج کنم، و خودم با یکسری تغییرات آن ها را در دستور بازنویسی شده قرار دهم.
اگر دستور من آرگومان هایش از هم جدا بود خیلی ساده با #num این کار انجام می‌شد.

سوال دوم: اگر دستور من option داشته باشد چگونه می‌توانم بفهمم که کاربر option ها را وارد کرده یا نه و این option‌ها چه هستند؟
باتشکر




عنوان: پاسخ : سوالی در مورد بازنویسی دستورات
رسال شده توسط: vafa در سپتامبر 30, 2012, 10:08:32 am
برای سوال اول، بسته glossaries از بسته xkeyval استفاده می‌کنه و این چیزهایی که می‌خواهی تعریفشون رو تغییر بدهی key value هستند مثلاً type اینگونه تعریف شده:
\define@key{glossentry}{type}{%
\def\@glo@type{#1}}
این تعریف‌ها در فایل glossaries.sty هست.

سوا دوم ، اگر دستور با \newcommand تعریف شده باشه فقط می‌تونه یک option داشته باشه و پیدا کردنش خیلی راحته. به هر حال باز هم بستگی داره.
عنوان: پاسخ : سوالی در مورد بازنویسی دستورات
رسال شده توسط: ابوالفضل دیانت در سپتامبر 30, 2012, 06:52:13 pm
با سلام و تشکر

من وقتی طبق مطلبی که شما گفتید تابع را بازنویسی می‌کنم به صورت زیر:
\makeatletter
\let\oldnewglossaryentry\newglossaryentry
\renewcommand{\newglossaryentry}[2]{
\oldnewglossaryentry{#1}{type=persian , name={\@glo@name} , plural={سلام}, description ={سلام}}
}
\makeatother

به نظر می‌رسد که تابع در داخل یک حلقه بی نهایت گیر می‌کند. این مورد نیز شاید به دلیل این است که ما متغیر name را داریم به name دوباره می‌دهیم، چگونه می‌توان در این مورد از این مورد پرهیز نمود؟

البته طبق راهنمایی‌های بسته xkeyval ظاهرا چنین دستوراتی را باید نوشت، اما با نوشتن دستورات زیر با خطا مواجه می‌شوم؟!

\makeatletter
\let\oldnewglossaryentry\newglossaryentry
\renewcommand{\newglossaryentry}[2]{
\gsavekeys{glossentry}{name}
\oldnewglossaryentry{#1}{type=persian , name=\usevalue{name} , plural={سلام}, description ={سلام}}
}
\makeatother
باتشکر



عنوان: پاسخ : سوالی در مورد بازنویسی دستورات
رسال شده توسط: ابوالفضل دیانت در اكتبر 01, 2012, 10:19:07 pm
با سلام
من در این مورد به مولف بسته glossaries ایمیل زدم. جواب ایشان را برای شما نقل می‌کنم شاید مفید باشد:
نقل قول
The following commands are expandable, but depending on whether you've used the sanitize option, some of them might not be usable in the actual document: \glsentryname{label}, \glsentryfirst{label}, \glsentrytext{label}, \glsentrytype{label}, \glsentryfirstplural{label}, \glsentryplural{label}, \glsentrydesc{label}. For example \glsentrytext{en-Encoding} or \glsentrytext{pa-Encoding}.
I hope that helps.
Regards
Nicola Talbot

فقط  من هنوز با یک مشکل مواجه هستم که امیدوارم کمکم کنید تا آن را حل کنم:
من دستور را به صورت زیر بازنویسی کردم:
\let\oldnewglossaryentry\newglossaryentry
\renewcommand{\newglossaryentry}[2]{
      \oldnewglossaryentry{en-#1}{type = english,  name = {\glsentryname{#1}} , plural = {\glsentryplural{#1}} , description = {---------} }
      \oldnewglossaryentry{fa-#1}{type = persian, name= {\glsentryplural{#1}} , plural = {\glsentryname{#1}}  , description = {---------}}
}

اما این مورد کار نمی کند؟ چرا که وقتی من مثلا یک واژه به صورت زیر وارد می‌کنم:
\newglossaryentry{Cell}{
name={‌سلول},
plural={\lr{Cell}},
description={تلفن همراه}
}

چون دستور را بازنویسی کردم اصلا glossaryentry مثلا با نام Cell هنوز تعریف نشده است. چرا که با بازنویسی دستور newglossaryentry دو entry با کلید en-Cell‌ و fa-Cell تعریف می‌شود.
اگر هم به جای #1 از en-#1 استفاده کنم برنامه در داخل یک حلقه گیر می‌کند.
به نظر می‌رسد که راه‌حل این باشد که ما قبل از تعریف دو دستور newglossaryentry در قسمت بازنویسی یه جوری مقادیر را بیرون بکشیم. اما نمی دانم چگونه این مورد را به صورت کد بنویسم؟
باتشکر