اولین بار است که به اینجا می‌آیید؟ راهنمای سایت را بخوانید!
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 تصویر شمارنده texlive2015 longtable زیرنویس خطا رسم نمودار شماره‌گذاری صفحات پایان نامه دیاگرام فهرست جداول میک‌تک texlive2016 تنظیم جدول kashida texworks caption اندیس lollipop iust-thesis multicol فصل‌نویسی شعر سوال چهارگزینه‌ای بولد تورفتگی آکولاد اعداد فارسی فاصله عمودی xindy چپ‌چینی اوبونتو میکروسافت ورد قاب geometry texlive fancyhdr تک لایو 2015 عنوان بخش به‌روزرسانی بسته aimc46 صفر توخالی فرمول طولانی بیرون‌زدگی کاما وسط‌چینی پوستر شماره گذاری فاصله سطرها نوشتافت شکست خط tex-programming فونت اعداد pgfplots قرآن tabriz-thesis ایتالیک winedt جستجوی معکوس xelatex فلش جایابی تصویر tcolorbox قالب کتاب پاراگراف‌بندی بازیابی اطلاعات هایپرلینک فهرست نمادها شمارنده فصل font محیط ریاضی رسم کادر جداکننده جدول طولانی فهرست تصاویر شماره‌گذاری فرمول algorithm2e فونت بولد proof equation bidipoem eps جدول افقی عکس به‌روزرسانی پانویس چندستونی کمک مالی فاصله خطوط حروف‌چینی شعر زیرشکل minipage قلم پانویس پاراگرافی ltrfootnote پیوست computeautoilg متن فارسی و انگلیسی فرمول چندخطی neveshtuft غلط‌گیری املایی تک‌پارسی پیکان لاتکس tabular baselineskip شماره قسمت قسمت عنوان جدول
7 نفر آنلاین
0 عضو و 7 مهمان در سایت حاضرند
بازدید امروز: 11098
بازدید دیروز: 15572
بازدید کل: 21014523

ایجاد کشف‌الابیات در یک مجموعه شعر

+3 رای
1,510 بازدید

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

فایل‌های پیوست
سوال شده خرداد 7, 1394 توسط سيدسعيد موسوی‌ندوشنی (1,174 امتیاز)
برچسب گذاری دوباره اردیبهشت 6, 1396 توسط وحید دامن‌افشان

3 پاسخ

+2 رای
 
بهترین پاسخ

ای کاش این مشکل را قبل از شروع کار مطرح می‌کردید. در این صورت کافی بود مثلاً سه کلمه اول هر بیت را با دستور

\index*{سینه خواهم شَرحه}

تایپ می‌کردید و بعد مثل سندهای معمولی از سیستم نمایه‌سازی لاتک استفاده می‌کردید. لازم به ذکر است که تفاوت دستور \index{} با \index*{} این است که دستور آخری، متن نمایه‌شده را در خود متن هم چاپ می‌کند.

حالا که کار تمام شده است، من یک راه‌حل پیشنهاد می‌کنم که با وجود اینکه کاملاً خودکار نیست، اما با صرف کمی وقت می‌توانید به چیزی که می‌خواهید برسید.

فایل زیر را در نظر بگیرید.

\documentclass[a4paper,12pt,twoside]{article}
\usepackage[top=25mm, bottom=25mm, left=25mm, right=25mm]{geometry}
\usepackage{bidipoem}
\usepackage{makeidx}
\makeindex
\usepackage{ghab}
\usepackage{color}
\usepackage{fancyhdr}
\usepackage{fontspec} % package for new fonts
\usepackage[localise]{xepersian}
\settextfont[Scale=1.2]{Yas}
%\settextfont[Scale=1.2]{HM XNiloofar}
\renewcommand\poemcolsepskip{1cm}
%فرمان \poemcolsepskip فاصلهٔ بین مصراع اشعار را تغییر می‌دهد.
\AtBeginDocument{\setlength{\baselineskip}{25pt}}
%فرمان \baselineskip فاصلهٔ بین ابیات را تغییر می‌دهد.
\makeatletter
\newcount\LineNumber \newcount\templinenumber
%در دستور \linenumberskip اگر مقدار مثبت باشد فاصله عدد و بیت کم می‌شود و اگر مقدار منفی باشد فاصله عدد و بیت زیاد می‌شود.
 \newdimen\linenumberskip \linenumberskip=-2em
 \chardef\linestep=5
\def\poemlinenumber{%
    \advance\LineNumber1
    \templinenumber=\LineNumber
   \computelinenumber
   }
 \def\computelinenumber{%
    \ifnum\templinenumber>\linestep
      \advance\templinenumber-\linestep
      \expandafter\computelinenumber
    \else
     \ifnum\templinenumber=\linestep
       \leavevmode\rlap{\kern\linenumberskip\footnotesize\the\LineNumber}%
      \fi
    \fi
   }
 \newenvironment{numberedtraditionalpoem}
   {\everypar{\poemlinenumber}%
     \begin{traditionalpoem}}
    {\end{traditionalpoem}}
%\makeatother
\defpersianfont\nastaliq{IranNastaliq}
\newsavebox\mybox
\newenvironment{storytitle}[1]{%
\noalign{%
\vskip10pt%
\everypar{}%
\darghab[\dimexpr(\poem@width+\poemcolsepskip+\poem@width)]{\centering\nastaliq\Large #1}%
\vskip10pt
}%
}

\makeatother
%مقادیر \vskip10pt فاصله بالا و پایین قاب را از ابیات تعیین می‌کند.
\بگذار\تیتر\storytitle
\title{\nastaliq\LARGE دفتر اوّل}
\date{}
%define the header
\fancypagestyle{mypagestyle}{%
\fancyhf{}% Clear header/footer
  \fancyhead[OC]{\سیاه  دفتر اوّل} % Author on Odd page, Centred
  \fancyhead[EC]{\سیاه مثنوی معنوی } % Title on Even page, Centred
  \fancyfoot[C]{\thepage}%
}
\pagestyle{mypagestyle}
\renewcommand{\headrulewidth}{0pt}
\newcommand{\myindex}[1]{#1\index{#1}}
\let\textsf\myindex
\renewcommand{\indexname}{نمایه بیت‌ها}
\begin{document}
\maketitle
\begin{numberedtraditionalpoem}


\textsf{بشنو، این نی} چون شکایت می‌کند&از جدایی‌ها حکایت می‌کند\\
\textsf{کز نیستان تا} مرا بُبْریده‌اند&در نفیرم مرد و زن نالیده‌اند\\
\textsf{سینه خواهم شَرحه} شَرحه از فراق&تا بگویم شرح درد اشتیاق\\
\textsf{هر کسی کو} دور ماند از اصل خویش&باز جوید روزگار وصل خویش\\
\textsf{من به‌هر جمعیّتی} نالان شدم&جفت بدحالان و خوش‌حالان شدم\\
\textsf{هر کسی از} ظنّ خود شد یار من&از درون من نجُست اسرار من\\  
\textsf{سِرّ من از} نالهٔ من دور نیست&لیک چشم و گوش را آن نور نیست\\
\textsf{تن ز جان} و جان ز تن مستور نیست&لیک کس را دیدِ جان دستور نیست\\
\textsf{آتش‌ست این بانگ} نای و {\رنگ{قرمز}نیست باد}&هر که این آتش ندارد {\رنگ{قرمز}نیست‌باد}\\
\end{numberedtraditionalpoem}
\printindex
\end{document}

در این فایل، من دو خط

\usepackage{makeidx}
\makeindex

را در ابتدای فایل و دستور

\printindex

را در انتهای آن برای استفاده از سیستم نمایه‌سازی لاتک اضافه کرده‌ام. بعد از آن، دستوری به اسم \myindex به صورت

\newcommand{\myindex}[1]{#1\index{#1}}

تعریف کردم و بعد دستور

\let\textsf\myindex

را بعد از آن قرار دادم که کارش این است که دستور \textsf را برابر \myindex قرار می‌دهد. دلیل استفاده از دستور \textsf این است که (۱) این دستور در متن فارسی و یا حداقل در متن شما به کار نمی‌رود. (۲) میان‌بر این دستور، Ctrl+Shift+A است که در ویرایشگرهایی مثل تک‌میکر و تک‌استودیو تعریف شده است و بنابراین سرعت عمل شما را بالا می‌برد.

حال تنها کاری که شما باید بکنید، این است که مثلاً سه کلمه اول هر بیت را با موس انتخاب کنید و بعد کلیدهای Ctrl+Shift+A را بزنید تا آن کلمه‌ها نمایه شوند. بعد از آن، کافی است مثل متن‌های عادی، دستور ایجاد نمایه را اجرا کنید تا این کلمه‌ها به انتهای کتاب اضافه شوند.

بدیهی است که برای بیت‌هایی که از امروز به بعد تایپ می‌کنید، می‌توانید مستقیماً از دستور \myindex استفاده کنید. برای تغییر کلمه «نمایه» هم می‌توانید از دستور

\renewcommand{\indexname}{نمایه بیت‌ها}

استفاده کنید. خروجی من به صورت زیر است. بدیهی است که می‌توانید سرواژه‌ها را هم حذف کنید؛ هر چند بودن آن مفید است.
enter image description here

پاسخ داده شده خرداد 9, 1394 توسط وحید دامن‌افشان (6,497 امتیاز)
انتخاب شده خرداد 11, 1394 توسط سيدسعيد موسوی‌ندوشنی
+2 رای

با سلام
احتراماً به آگاهی خوانندگان گرامی می‌رسانم که هر شش دفتر مثنوی مولانا جلال‌الدین بلخی به زیور زی‌پرشین آراسته شد. بعد از شکر خداوند، جا دارد که از افراد زیر تشکر و قدردانی شود.
۱) از جناب آقای وفا کارن‌پهلو (خلیقی) که سهم عظیمی در این کار داشتند. اول برای فراهم نمودن بستر فارسی‌نویسی در محیط لاتک و دوم جهت کمک‌های ویژه به حقیر در این کار. اگر تلاش‌های ایشان نبود بدون تعارف این کار به بار نمی‌نشست.
۲) از جناب آقای سیدرضی علوی‌زاده که در نرم‌افزار ساغر امکانی را فراهم نموده‌اند که اشعار فارسی را می‌توان در قالب زی‌پرشین ریخت و به آن شهد شکل آمیخت.
۳) از جناب آقای وحید دامن‌افشان که با تذکرهای مفید و به موقع، در تسریع کار، کارساز بودند.
۴) و بالاخره از جناب آقای حسین کُرد (ساکن آمریکا) که زحمت بارگذاری فایل‌های pdf سه دفتر را روی سایت خود کشیده‌اند. علاقه‌مندان می‌توانند به لینک سایت نامبرده مراجعه نمایند.
http://rumisite.com/masnavi
البته اکنون (۲۲ آذر ۹۴) می‌توان فایل‌ها را از اینـــــــــجــــــــا نیز بارگیری نمود.
با سپاس مجدد از نیکخواهان یاد شده، ذکر این نکته لازم است که اگر در این کار نکته و یا نکات مثبتی راه یافته است، از آنِ آنان است و اگر در آن خللی ورود پیدا کرده است، باید آنرا به حساب بنده گذاشت.
پیروز باشید.

پاسخ داده شده شهریور 17, 1394 توسط سيدسعيد موسوی‌ندوشنی (1,174 امتیاز)
ویرایش شده بهمن 4, 1394 توسط سيدسعيد موسوی‌ندوشنی
+1 رای

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

کد نوشته شده به زبان جاوا است

import java.io.BufferedWriter;
import java.io.FileWriter;
import java.io.IOException;
import java.nio.charset.StandardCharsets;
import java.nio.file.Files;
import java.nio.file.Paths;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class Convert {
    public static final String DESIRED_TAG = "numberedtraditionalpoem";

    public static final int WORD_TO_INDEX = 3;

    public static final String TAG_TO_ADD = "کشف" ;

    public static void main(String[] args) throws IOException {

        byte[] enc = Files.readAllBytes(Paths.get(args[0]));
        String s = new String(enc, StandardCharsets.UTF_8);
        String beginReg = "\\\\(\\s*)begin(\\s*)\\{(\\s*)" + DESIRED_TAG
                + "(\\s*)\\}";
        String endReg = "\\\\(\\s*)end(\\s*)\\{(\\s*)" + DESIRED_TAG
                + "(\\s*)\\}";
        Pattern poemEnv = Pattern.compile(beginReg + "(.*)" + endReg,
                Pattern.DOTALL);
        Matcher m1 = poemEnv.matcher(s); // get a matcher object

        Pattern poemReg = Pattern.compile("([^&]*)&(.*)\\\\\\\\");
        String out = "";
        int idx = 0;
        while (m1.find()) {
            out = out + s.substring(idx, m1.start(5)) + "\n";
            String poems = m1.group(5);
            Matcher m2 = poemReg.matcher(poems);
            while (m2.find()) {
                String firstPart = m2.group(1);
                Pattern storytitle = Pattern
                        .compile("\\\\(\\s*)storytitle([^\\}]*)\\}");
                Matcher m3 = storytitle.matcher(firstPart);
                if (m3.find()) {
                    out += m3.group() + "\n";
                }
                String[] words = m2.group(1)
                        .replaceAll("\\\\(\\s*)storytitle([^\\}]*)\\}", "")
                        .trim().split("\\s+|,\\s*|\\.\\s*");

                out = out + "\\" + TAG_TO_ADD + "{";
                for (int j = 0; j < WORD_TO_INDEX; j++) {
                    out += words[j] + " ";
                }
                out = out.trim();
                out += "} ";
                for (int j = WORD_TO_INDEX; j < words.length; j++)
                    out += words[j] + " ";
                out += "&";
                out += m2.group(2) + "\\\\ \n";
            }
            out += s.substring(m1.end(5), m1.end());
            idx = m1.end() ; 
        }
        out += s.substring(idx, s.length()) ;
        FileWriter fo = new FileWriter(args[1]);
        BufferedWriter fw = new BufferedWriter(fo);
        fw.write(out);
        fw.flush();
        fw.close(); 
    }
}

نحوه کار این برنامه بدین صورت است که ابتدا محیط شعری در متن مورد نظر که با متغیر DESIRED_TAG در متن معرفی شده است، از کل متن جدا می‌گردد. سپس در این محیط، ابیات را یکی، یکی جدا کرده و به تعداد WORD_TO_INDEXتا از کلمات اول هر بیت را در دستور TAG_TO_ADD محاط می‌کند.
برای سهولت کار و تغییر در استفاده می‌توانید سه متغیر DESIRED_TAG، ‍WORD_TO_INDEX و TAG_TO_ADD را، که در ابتدای برنامه تعریف شده است، تغییر دهید.

برای اجرای این فایل، ابتدا کد نوشته شده را در فایلی به نام ‍Convert.java ذخیره کنید و در کنار فایل تک مورد نظر خود قرار دهید. سپس کافی است با داشتن JRE در ترمینال (محیطهای پایه یونیکس) و یا cmd در محیط ویندوز،‌ دستورات زیر را اجرا کنید:

javac Convert.java
java Convert f1.tex f2.tex

که در آن f1.tex متنی است که باید سه کلمه اول هر بیت را در داخل محیط نمایه‌سازی قرار دهد و ‍f2.tex فایل پردازش شده است.

نکته پایانی، آنکه در برنامه فوق، سه کلمه اول را در داخل دستور فارسی \کشف قرار دادم تا ابیات به هم‌ریخته نگردیده و خواناتر‌باشد. بدین ترتیب، شما باید در فایل پردازش شده، این دستور را تعریف کنید تا برای حروف‌چینی به مشکلی برنخورید. برای تعریف، بهترین گزینه، تعریف ارائه شده توسط آقای دامن‌افشان است:

\newcommand{\کشف}[1]{#1\index{#1}}
پاسخ داده شده خرداد 11, 1394 توسط مسعود یزدانی (2,135 امتیاز)
ویرایش شده خرداد 11, 1394 توسط مسعود یزدانی
جناب آقای یزدانی
با سلام و احترام

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

پ.ن.: اگر کاربران و خوانندگان محترم اشکال تایپی یافتند (که در فایل first_daftar.pdf قطعاً وجود دارد.). بر بنده منت نهند و با ذکر شماره بیت(ها) آنها را به حقیر گزارش نمایند تا در نسخه بعدی ویرایش گردد.
@مسعودیزدانی
یعنی آیا واقعا تک راهی ندارد که سه کلمه ابتدای هر خط را خودش به صورت خودکار در یک index قرار دهد.
من تک بلد نیستم ولی حسی که دارم این است که نباید چنین محدودیتی داشته باشد زیرا که خود تک بگونه‌ای یک زبان برنامه‌نویسی است پس ... .
البته در اینجا آقای دکتر وفا باید نظر بدهند.
جواد: این امکان وجود دارد. وقتی شعری را در محیط traditionalpoem قرار می‌دهید در واقع این شعر داخل یک \halign قرار می‌گیرد و هر بیت شعر با استفاده از دستور \everycr قابل دسترسی است. کاری که شما باید انجام دهید تنها گرفتن سه کلمه اول در \everycr  و قرار دادن آن در نمایه است که کار مشکلی نیست. راه دیگر این است که کد بسته bidipoem را نگاه کنید و اگر این کار را کنید متوجه می‌شوید که مصرع اول هر بیت داخل کادر \verse@i که یک \hbox (کادر افقی) است قرار می‌گیرد.
ممنون؛ اگر در توانم باشد سعی می‌کنم راه کار شما را عملی کنم.
...