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

لاتک LATEX => اسلاید Beamer => نويسنده: ابوالفضل دیانت در ژوئن 30, 2012, 11:44:27 am

عنوان: چگونه می توان در sidebar بخش ها به صورت خودکار واردشوند.
رسال شده توسط: ابوالفضل دیانت در ژوئن 30, 2012, 11:44:27 am
با سلام
همان طور که در مثال کوچک زیر مشاهده می کنید من مجبورم برای وارد کردن در sidebar به صورت دستی همه را خودم hyperref‌ کنم. چگونه می شود این کار به صورت خودکار انجام شود و تمامی بخش ها و زیر بخش ها
به طور خودکار در وسط sidebar بیایند.
باتشکر
عنوان: پاسخ : چگونه می توان در sidebar بخش ها به صورت خودکار واردشوند.
رسال شده توسط: vafa در ژوئن 30, 2012, 04:37:20 pm
راحت‌ترین راه اینه که تعریف دستور \tableofcontennts رو تغییر بدی:
\renewcommand\tableofcontents{%
\begin{staticcontents*}{sidebar}
\begin{center}
    \@starttoc{toc}%
        \end{center}
\end{staticcontents*}
    }
از اونجایی که در side bar معمولاً احتیاجی به شماره \section یعنی همون \thsection نیست باید کاری کنی که این شماره در side bar نیاد:
\def\@sect#1#2#3#4#5#6[#7]#8{%
  \ifnum #2>\c@secnumdepth
    \let\@svsec\@empty
  \else
    \refstepcounter{#1}%
    \protected@edef\@svsec{\@seccntformat{#1}\relax}%
  \fi
  \@tempskipa #5\relax
  \ifdim \@tempskipa>\z@
    \begingroup
      #6{%
        \@hangfrom{\hskip #3\relax\@svsec}%
          \interlinepenalty \@M #8\@@par}%
    \endgroup
    \csname #1mark\endcsname{#7}%
    \addcontentsline{toc}{#1}{%
      #7}%
  \else
    \def\@svsechd{%
      #6{\hskip #3\relax
      \@svsec #8}%
      \csname #1mark\endcsname{#7}%
      \addcontentsline{toc}{#1}{%
        #7}}%
  \fi
  \@xsect{#5}}
همچنین در side bar احتیاجی به شماره صفحه \section هم نیست پس باید از شر شماره صفحه هم در side bar خلاص بشی:
\renewcommand*\l@section[2]{%
  \ifnum \c@tocdepth >\z@
    \addpenalty\@secpenalty
    \addvspace{0.1em \@plus\p@}%
    \setlength\@tempdima{1.5em}%
    \begingroup
      \parindent \z@ \if@RTL\leftskip\else\rightskip\fi \@pnumwidth
      \parfillskip -\@pnumwidth
      \leavevmode \bfseries
      \advance\if@RTL\rightskip\else\leftskip\fi\@tempdima
      \hskip -\if@RTL\rightskip\else\leftskip\fi
      \tiny#1\hfill\nobreak\par
    \endgroup
  \fi}
حالا فقط کافیه در شروع نوشتار از دستور \tableofcontents استفاده کنی.
عنوان: پاسخ : چگونه می توان در sidebar بخش ها به صورت خودکار واردشوند.
رسال شده توسط: ابوالفضل دیانت در ژوئیه 01, 2012, 07:41:05 am
با سلام و تشکر از زحمات شما
من کدی را که شما زحمت کشیده بودید اجرا کردم ولی با خطا مواجه شدم
و هر چه سعی کردم نتوانستم بفهمم خطا از چیست؟
عنوان: پاسخ : چگونه می توان در sidebar بخش ها به صورت خودکار واردشوند.
رسال شده توسط: vafa در ژوئیه 01, 2012, 07:50:58 am
این کد برای من خطا نمی‌ده. در ضمن با این کد من جواب دو تا از سوال‌های شما را می‌دهم.
\documentclass[12pt,oneside]{bidipresentation}
\usepackage[RL]{flowfram}
\geometry{paperwidth=225mm,paperheight=180mm,rmargin=40mm,lmargin=4mm,top=10mm,bottom=10mm}
\usepackage{hyperref}
\newstaticframe{30mm}{\paperheight}%
{\dimexpr(\paperwidth-40mm)}% Why minus 40mm? because your rmargin=40mm in your geometry setup
{0.5\paperheight}[sidebar]
\setstaticframe*{sidebar}{valign=b}
\usepackage{xepersian}
\makeatletter
\renewcommand\tableofcontents{%
\begin{staticcontents*}{sidebar}
    \@starttoc{toc}%
\end{staticcontents*}
    }
\def\@sect#1#2#3#4#5#6[#7]#8{%
  \ifnum #2>\c@secnumdepth
    \let\@svsec\@empty
  \else
    \refstepcounter{#1}%
    \protected@edef\@svsec{\@seccntformat{#1}\relax}%
  \fi
  \@tempskipa #5\relax
  \ifdim \@tempskipa>\z@
    \begingroup
      #6{%
        \@hangfrom{\hskip #3\relax\@svsec}%
          \interlinepenalty \@M #8\@@par}%
    \endgroup
    \csname #1mark\endcsname{#7}%
    \addcontentsline{toc}{#1}{%
      #7}%
  \else
    \def\@svsechd{%
      #6{\hskip #3\relax
      \@svsec #8}%
      \csname #1mark\endcsname{#7}%
      \addcontentsline{toc}{#1}{%
        #7}}%
  \fi
  \@xsect{#5}}
\renewcommand*\l@section[2]{%
  \ifnum \c@tocdepth >\z@
    \addpenalty\@secpenalty
    \addvspace{0.1em \@plus\p@}%
    \setlength\@tempdima{1.5em}%
    \begingroup
      \parindent \z@ \if@RTL\leftskip\else\rightskip\fi \@pnumwidth
      \parfillskip -\@pnumwidth
      \leavevmode \bfseries
      \advance\if@RTL\rightskip\else\leftskip\fi\@tempdima
      \hskip -\if@RTL\rightskip\else\leftskip\fi
      \footnotesize#1\hfill\nobreak\par
    \endgroup
  \fi}
\makeatother
\begin{document}
\tableofcontents
\section{مقدمه} \label{sec:Intro}\newpage
\section{لایه فیزیکی} \label{sec:section2}
\end{document}


عنوان: پاسخ : چگونه می توان در sidebar بخش ها به صورت خودکار واردشوند.
رسال شده توسط: vafa در ژوئیه 01, 2012, 07:53:46 am
با سلام و تشکر از زحمات شما
من کدی را که شما زحمت کشیده بودید اجرا کردم ولی با خطا مواجه شدم
و هر چه سعی کردم نتوانستم بفهمم خطا از چیست؟
برای اینکه دستوراتی که من به شما دادم از @ استفاده شد بنابراین باید دستورات من را بین \makeatletter و \makeatother قرار می‌دادی.
عنوان: پاسخ : چگونه می توان در sidebar بخش ها به صورت خودکار واردشوند.
رسال شده توسط: ابوالفضل دیانت در ژوئیه 01, 2012, 08:27:57 am
 با سلام
عرض پوزش به خاطر بی دقتی که از سوی من انجام گرفت.
با تشکر از زحمات شما
عنوان: پاسخ : چگونه می توان در sidebar بخش ها به صورت خودکار واردشوند.
رسال شده توسط: ابوالفضل دیانت در سپتامبر 27, 2012, 04:16:05 pm
با سلام و تشکر
سوال من این بود که با باز تعریف دستور tableofcontent دیگر نمی توانیم در ابتدای اسلایدها از این دستور برای آوردن فهرست مطالب استفاده کنیم، چرا که این دستور را برای سایدبار باز تعریف نمودیم.
من خیلی تلاش کردم یه جوری این ها را بکنم دو دستور ولی کاملا ناموفق بودم. به نظر شما راه حلی دارد؟
یعنی هم یک جوری این دستور را برای سایدبار طراحی کنیم و هم بتوانیم در ابتدای متن برای آوردن فهرست مطالب استفاده کنیم.
باتشکر
عنوان: پاسخ : چگونه می توان در sidebar بخش ها به صورت خودکار واردشوند.
رسال شده توسط: vafa در سپتامبر 27, 2012, 04:19:23 pm
با سلام و تشکر
سوال من این بود که با باز تعریف دستور tableofcontent دیگر نمی توانیم در ابتدای اسلایدها از این دستور برای آوردن فهرست مطالب استفاده کنیم، چرا که این دستور را برای سایدبار باز تعریف نمودیم.
من خیلی تلاش کردم یه جوری این ها را بکنم دو دستور ولی کاملا ناموفق بودم. به نظر شما راه حلی دارد؟
یعنی هم یک جوری این دستور را برای سایدبار طراحی کنیم و هم بتوانیم در ابتدای متن برای آوردن فهرست مطالب استفاده کنیم.
باتشکر
خیلی سادست دستور \tableofcontents  را از نو تعریف نکن در عوض یک دستور با نام متفاوت تعریف کن.
عنوان: پاسخ : چگونه می توان در sidebar بخش ها به صورت خودکار واردشوند.
رسال شده توسط: ابوالفضل دیانت در سپتامبر 27, 2012, 04:23:51 pm
با سلام
این کار را کردم. ولی نشد، چون ظاهرا دو قسمت بعدی که از دستورات لطف کرده بودید، خود محیط tableofcontent را تغییر می داد.
یک نکته جالب تر این که وقتی این کار را می کردم، فهرست مطالب را می گذاشت ولی سایدبار را نمی گذاشت.
سعی می کنم یک مثال کمینه برایتان اماده و اتچ نمایم.
باتشکر
عنوان: پاسخ : چگونه می توان در sidebar بخش ها به صورت خودکار واردشوند.
رسال شده توسط: vafa در سپتامبر 27, 2012, 04:49:35 pm
با سلام
این کار را کردم. ولی نشد، چون ظاهرا دو قسمت بعدی که از دستورات لطف کرده بودید، خود محیط tableofcontent را تغییر می داد.
یک نکته جالب تر این که وقتی این کار را می کردم، فهرست مطالب را می گذاشت ولی سایدبار را نمی گذاشت.
سعی می کنم یک مثال کمینه برایتان اماده و اتچ نمایم.
باتشکر
حتماً درست انجام ندادی. من وقت ندارم خودت مشکلتو حل کن.
عنوان: پاسخ : چگونه می توان در sidebar بخش ها به صورت خودکار واردشوند.
رسال شده توسط: هادی صفی‌اقدم در اكتبر 23, 2012, 10:55:23 pm
فایل جدیدی را که مشکلات بالا را ندارد را در اولین پست در موضوع «BidiPresentation + sidebar + background -- بی‌دی پرزنتیشن+نوار کناری+ پس‌زمینه (http://www.parsilatex.com/forum/SMF/index.php?topic=1637.0)» آپلود کردم.
باز تشکر می‌کنم از آقای نکومهر که این اسلایدها و استایلش را آماده کردند و همچنین از دکتر کارن‌پهلو که اگر راهنمایی‌های ایشون نبود، نمیشد.