اولین بار است که به اینجا می‌آیید؟ راهنمای سایت را بخوانید!
Close Sidebar
وب‌سایت پرسش و پاسخ پارسی‌لاتک جایی برای پرسش و پاسخ درباره سیستم حروف‌چینی لاتک و بسته زی‌پرشین است. در اینجا می‌توانید سوال‌های خود را بپرسید و به سوال‌های دیگران پاسخ دهید.

محبوب‌ترین برچسب‌ها

رفع خطا جدول مراجع xepersian ریاضی‌نویسی شکل فونت فهرست مطالب شماره‌گذاری منابع bidi پانویس بیب‌تک tikz تک‌لایو parsilatex بیمر اسلاید زی‌پرشین پاورقی bibtex سربرگ نماد رسم شکل فرمول‌نویسی قالب ارجاع‌دهی biditexmaker هدر ویرایشگر beamer واژه‌نامه اندازه فونت texstudio عنوان فصل ماتریس اعمال نشدن تغییرات در پی‌دی‌اف رسم جدول bidipresentation شماره صفحه حاشیه رنگ عنوان شکل اسلاید فارسی محیط قضیه گراف مکان شکل tikzpicture حروف‌چینی کد شماره فصل enumerate tabriz_thesis نمایه align زیرنویس شکل کادر itemize فهرست اشکال الگوریتم listings عدم اجرا نیم‌فاصله متن لاتین و فارسی بسته فاصله بین خطوط قالب پایان‌نامه فرمول نصب تک‌لایو فارسی‌تک hyperref شماره فرمول glossaries کپشن نمودار خروجی لاتک حروف‌چینی چندستونی فونت فارسی و انگلیسی ماکرونویسی biditools شماره پاورقی پیوست‌ سوال امتحانی فاصله‌گذاری فرمول چندضابطه‌ای subfigure extrafootnotefeatures header texmaker pdf tex biditufte-book longtable تصویر شمارنده texlive2015 زیرنویس خطا رسم نمودار شماره‌گذاری صفحات پایان نامه دیاگرام فهرست جداول میک‌تک texlive2016 تنظیم جدول آکولاد kashida texworks caption اندیس lollipop iust-thesis multicol فصل‌نویسی شعر سوال چهارگزینه‌ای بولد تورفتگی اعداد فارسی فاصله عمودی xindy چپ‌چینی اوبونتو میکروسافت ورد قاب geometry texlive fancyhdr وسط‌چینی تک لایو 2015 عنوان بخش شماره گذاری به‌روزرسانی بسته aimc46 صفر توخالی فرمول طولانی بیرون‌زدگی xelatex کاما tcolorbox پوستر فاصله سطرها نوشتافت شکست خط tex-programming فونت اعداد pgfplots قرآن tabriz-thesis ایتالیک winedt جستجوی معکوس فلش جایابی تصویر قالب کتاب پاراگراف‌بندی بازیابی اطلاعات هایپرلینک فهرست نمادها شمارنده فصل font محیط ریاضی رسم کادر جداکننده جدول طولانی فهرست تصاویر شماره‌گذاری فرمول algorithm2e فونت بولد proof equation bidipoem eps جدول افقی عکس به‌روزرسانی پانویس چندستونی کمک مالی فاصله خطوط حروف‌چینی شعر زیرشکل minipage قلم پانویس پاراگرافی ltrfootnote پیوست computeautoilg متن فارسی و انگلیسی فرمول چندخطی neveshtuft غلط‌گیری املایی تک‌پارسی پیکان لاتکس tabular baselineskip شماره قسمت قسمت عنوان جدول
82 نفر آنلاین
0 عضو و 82 مهمان در سایت حاضرند
بازدید امروز: 56248
بازدید دیروز: 73184
بازدید کل: 25221355

ارتباط بین متن شکل و فهرست اشکال

0 رای
1,042 بازدید

چرا هنگام استفاده‌ی همزمان از متن فارسی و محیط لاتین باید گزینه‌ی [متن شکل در فهرست اشکال] پس از \caption فراخوانی شود؟

سوال شده آبان 18, 1393 توسط مسهر باقری (4,717 امتیاز)
منظورتون را نفهمیدم. مثال می‌فرستید؟
درواقع این پرسش برمی‌گرده به پاسخی که در مورد <<چگونگی چپ‌چین کردن متن در زیرنویس شکل>> مطرح شده بود.
@مسهر باقری: چند نکته:
۱. عنوان سوال، گویا نیست. مثلاً مفهوم «متن شکل» اصلاً معلوم نیست. اگر من بودم، عنوان «چرا در صورت استفاده از محیط latin در آرگومان اجباری دستور caption خطا می‌گیرم؟» رو انتخاب می‌کردم.
۲. برای نوشتن کد یا دستور داخل‌خطی، بهتره که اون رو بین دو ‍ علامت ` بنویسید تا چپ‌چین و زیبا نمایش داده بشن.
۳. توضیحات سوال به هیچ‌وجه گویا نیست؛ همون‌طور که آقای ترابی هم اشاره کردند. برداشت کاربران (مخصوصاً تازه‌کار) از توضیحات این هست که گزینه‌ای به اسم [متن شکل در فهرست اشکال] در لاتک وجود دارد. عنوانی که من در نکته ۱ پیشنهاد دادم، اون‌قدر گویاست که حتی نیازی به توضیح سوال نیست.
۴. برای پرسیدن یک سوال مشابه با یک پاسخ موجود در سایت، باید از گزینه «پرسیدن سوال مشابه» در زیر اون پاسخ استفاده کرد.
۵. برچسب انتخاب‌شده هم گویا نیست. در چنین سوال‌هایی که تخصصی هستن، برچسب‌هایی عمومی مثل «عنوان شکل»، «کپشن»، «caption» و «زیرنویس شکل» کفایت می‌کنه.
همه این موارد در قوانین و راهنمای سایت ذکر شده. امیدوارم با رعایت این موارد، محتوای باکیفیت‌تری ایجاد کنیم.

1 پاسخ

+1 رای

مشکل به استفاده از محیط داخل دستور \caption بر می‌گردد. اگر فایل تک زیر را اجرا کنید:

\documentclass{article}
\newenvironment{dumbenv}{}{}
\begin{document}
This is a test
\begin{figure}
\caption{%
This is a test.
\begin{dumbenv}
This is a test
\end{dumbenv}
}
\end{figure}
\end{document}

دقیقاً همان خطا را می‌گیرید:

./test.tex:11: Argument of \@caption has an extra }.
<inserted text> 
                \par 
l.11 }

? 

برای اینکه متوجه بشویم چه چیزی باعث خطا می‌شود، زمانی که خطا را در ترمینال دید یک r وارد می‌کنیم و سپس return را می‌زنیم. حالا محتویات فایل .aux را باز می‌کنیم. در این فایل باید همچین خطی وجود داشته باشد:

\@writefile{lof}{\contentsline {figure}{\numberline {1}{\ignorespaces This is a test. \def \par }}{1}}

همانطور که می‌بینید دستور \par به شکل نامتعارفی تعریف شده است. همچنین هنگامی که ‍r و return را وارد کردیم، در ترمینال خطوط زیر ظاهر می‌شود:

Runaway argument?
\@captype {\def \@currenvir {dumbenv}\edef \@currenvline {\on@line }\csname \ET
C.
./test.tex:11: Paragraph ended before \@caption was complete.
<to be read again> 
                   \par 
l.11 }

برای روشن شدن موضوع، بهتر است تعریف دستور \caption را در فایل latex.ltx ببینیم:

\def\caption{%
   \ifx\@captype\@undefined
     \@latex@error{\noexpand\caption outside float}\@ehd
     \expandafter\@gobble
   \else
     \refstepcounter\@captype
     \expandafter\@firstofone
   \fi
   {\@dblarg{\@caption\@captype}}%
}

پس در واقع ارگومان‌های دستور \caption در دستور \@caption تعریف شده است که آرگومان اولش در خط آخر تعریف دستور \caption داده شده است و این آرگومان \@captype است. \@captype در واقع نوع caption است. به عنوان مثال، زمانی که در محیط figure هستیم، \@captype در واقع figure است و زمانی که در محیط table هستیم \@captype در واقع table است. تعریف دستور \@caption بصورت زیر است:

\long\def\@caption#1[#2]#3{%
  \par
  \addcontentsline{\csname ext@#1\endcsname}{#1}%
    {\protect\numberline{\csname the#1\endcsname}{\ignorespaces #2}}%
  \begingroup
    \@parboxrestore
    \if@minipage
      \@setminipage
    \fi
    \normalsize
    \@makecaption{\csname fnum@#1\endcsname}{\ignorespaces #3}\par
  \endgroup}

قسمت اصلی تعریف که ما علاقه‌مند به آن هستیم این بخش است:

  \addcontentsline{\csname ext@#1\endcsname}{#1}%
    {\protect\numberline{\csname the#1\endcsname}{\ignorespaces #2}}%

دستور \addcontentsline باید برای شما آشنا باشد. پس در واقع چه شما از دستور \listoftables یا \listoffigures استفاده کرده باشید یا نبایشد فهرست اشکال و جدواول شما در فایل .aux نوشته می‌شود. برای اینکه مشکل را به مشکل کوچکتری بشکافیم و علت خطا را پیدا کنیم، فایل تک زیر را درست می‌کنیم:

\documentclass{article}
\newenvironment{dumbenv}{}{}
\begin{document}
This is a test
  \addcontentsline{lof}{figure}%
    {\protect\numberline{\thefigure}{\ignorespaces This is a test 
    \begin{dumbenv}
    This is a test
    \end{dumbenv}
    }}
\end{document}

که خطای زیر را می‌گیریم:

! Incomplete \iffalse; all text was ignored after line 10.
<inserted text> 
                \fi 
<*> test.tex

?

با فایل زیر چه اتفاقی می‌افتد؟

\documentclass{article}
\newenvironment{dumbenv}{}{}
\begin{document}
This is a test

\numberline{\thefigure}{\ignorespaces This is a test 
    \begin{dumbenv}
    This is a test
    \end{dumbenv}
    }

%  \addcontentsline{lof}{figure}%
%    {\protect\numberline{\thefigure}{\ignorespaces This is a test 
%    \begin{dumbenv}
%    This is a test
%    \end{dumbenv}
%    }}
\end{document}

هیچ مشکلی وجود ندارد. پس مشکل باید در دستور \addcontentsline باشد. این دستور با استفاده از دستور بدوی \write نوشته شده است و محتویاتش را در فایل .aux می‌نویسند. در واقع چیزی مانند:

\documentclass{article}
\newenvironment{dumbenv}{}{}
\begin{document}
This is a test

\makeatletter
\write\@auxout{This is a test \begin{dumbenv}This is a test\end{dumbenv}}
\makeatother
\end{document}

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

اگر دوباره r بزنیم و سپس return را و به فایل .aux نگاه کنیم، خط زیر را می‌بینیم:

This is a test \def document{\def document{dumbenv}\edef { on input line 9}}\global \let

می‌توانید این خط را با

  \@writefile{lof}{\contentsline {figure}{\numberline {1}{\ignorespaces This is a test. \def \par }}{1}}

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

\documentclass{article}
\newenvironment{dumbenv}{}{}
\begin{document}
This is a test

\makeatletter
\write\@auxout{This is a test \string\begin{dumbenv}This is a test \string\end{dumbenv}}
\makeatother
\end{document}

ولی نکته اصلی این است که لاتک آرگومان دستور \caption را چک نمی‌کند که ببیند چه چیزی در دستور بدوی \write مجاز است و چه چیزی نیست.

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

\documentclass{article}
\newenvironment{dumbenv}{}{}
\begin{document}
This is a test
\begin{figure}
\caption{%
This is a test.
\string\begin{dumbenv}
This is a test
\string\end{dumbenv}
}
\end{figure}
\end{document}
پاسخ داده شده آبان 18, 1393 توسط وفا (24,432 امتیاز)
ویرایش شده آبان 18, 1393 توسط وفا
جالب، جامع و عالی. بسیار سپاسگزارم.
...