در این نوشتار قصد داریم در مورد نحوه وارد کردن و نمایش کد در لاتک و بسته زی‌پرشین با استفاده از بسته listings صحبت کنیم. فرض کنید یک برنامه به زبانی مانند C یا JAVA یا MATLAB یا … نوشته‌اید که می‌خواهید به هر علتی کد آن را در داخل متن حروف‌چینی‌شده با لاتک وارد کنید. احتمالاً قبل از آشنایی با بسته listings، شما کد خود را در متن از طریق روش بردار و بچسبان (copy and paste) وارد می‌کردید و زمان زیادی را صرف این می‌کردید که شکل و شمایل آن به مانند حالتی گردد که در محیط‌های برنامه‌نویسی می‌بینید؛ اما توسط بسته listings‌ به راحتی و به سادگی هر چه تمام‌تر می‌توانید فایل کد خود را در متن با همان فرمتی که شما در نرم‌افزارهای برنامه‌نویسی می‌بینید، قشنگ و مرتب وارد کنید. در این نوشتار قصد داریم تا شما را با نحوه کارکرد این بسته آشنا سازیم. مثالی از این مبحث در این فایل قرار دارد.

وارد کردن کد در متن

وارد کردن کد در متن

فراخوانی بسته listings

در شروع کار بسته listings را با دستور \usepackage فراخوانی کنید. دقت کنید که این بسته را با بسته listing اشتباه نگیرید. به نکات زیر دقت کنید:

  1. اگر در حال نوشتن یک متن فارسی با استفاده از بسته xepersian هستید، دقت کنید که بسته زی‌پرشین حتماً باید آخرین بسته‌ای باشد که فراخوانی می‌شود. این قانون کاملاً کلی است و در هر متنی که شما قصد نوشتن آن را با استفاده از زی‌پرشین دارید، باید رعایت شود.
  2. بسته hyperref جزو آخرین بسته‌هایی باید باشد که فراخوانی می‌شود. این قانون هم کلی است.
  3. بسته listings قبل از دو بسته یادشده باید فراخوانی شود.
  4. به صورت پیش‌فرض کدهای واردشده توسط بسته listings به صورت سیاه و سفید وارد متن می‌شوند. اگر می‌خواهید کدهای شما در متن به صورت رنگی باشد، مثلاً کامنت‌ها به رنگ سبز باشند، باید بسته color‌ و xcolor را وارد کنید. البته تنها وارد کردن این دو بسته کافی نیست و باید یک‌ سری تنظیماتی که در قسمت‌های بعدی بیان خواهد شد را نیز انجام دهید.

پس خواهیم داشت:

 
\usepackage[usenames,dvipsnames]{color,xcolor}
\usepackage{listings}
\usepackage{hyperref}
\usepackage{xepersian} 

وارد کردن کد در متن

فرض کنید که یک کد MATLAB در فایلی به نام myFun.m نوشته‌اید که می‌خواهید آن را در متن وارد کنید. با استفاده از بسته listings کد خود را به دو روش می‌توانید در لاتک وارد کنید:

  1. وارد کردن فایل کد
  2. وارد کردن کد به صورت خام

وارد کردن فایل کد

در هر جایی از متن که می خواهید، کد شما وارد گردد، از دستور \lstinputlisting استفاده کنید. به عنوان مثال برای وارد کردن همان فایل myFun.m باید به صورت زیر عمل کنید:

 
\begin{latin}
\lstinputlisting[language=Matlab]{myFun.m}
\end{latin} 

چند نکته:

  • لاتک به دنبال فایل myFun.m در پوشه فعلی (پوشه ای که فایل tex در آن قرار دارد) می‌گردد. اگر فایل myFun.m در مسیر دیگری قرار دارد باید مسیر کامل را در آرگومان ورودی دستور \lstinputlisting مشخص کنید. به عنوان مثال اگر فایل شما در شاخه‌ای به نام Code در پوشه فایل tex شما وجود دارد، باید به صورت زیر عمل کنید.
     
    \begin{latin}
    \lstinputlisting[language=Matlab]{Code/myFun.m}
    \end{latin}  
  • تنظیمات بسته listings را می‌توانید در زمان فراخوانی \lstinputlisting وارد کنید. برای مثال در این جا من فقط از کلید تعیین زبان (language) استفاده کرده‌ام  و آن را بر روی زبان Matlab قرار داده‌ام. این کلید به listings‌ کمک می‌کند تا کد شما را در قالب زبان MATLAB نمایش دهد.
  • اگر می خواهید کد در داخل یک متن فارسی وارد کنید، حتما آن را درون محیط latin قرار دهید. یعنی آن را در بین \begin{latin} و \end{latin} قرار دهید.
  • در صورتی که می خواهید کد را در یک متن انگلیسی وارد کنید، باید خطوط ‍\begin{latin} و \end{latin} را حذف کنید.
  • دقت کنید که به همراه اسم فایل، پسوند فایل را نیز وارد کنید.

وارد کردن به صورت خام

در روش دوم، شما می‌توانید اصل کد را در متن وارد کنید. در این جا نیز به مانند حالت قبل، خود بسته listings تمامی تنظیمات مربوط به استایل کد را انجام می‌دهد. به عنوان مثال خطوط زیر را در نظر بگیرید:

 
\begin{lstlisting}[language=C]
#include <stdio.h>;
#define N 10
/* Block
 * comment */
 
int main()
{
    int i;
 
    // Line comment.
    puts("Hello world!");
 
    for (i = 0; i < N; i++)
    {
        puts("LaTeX is also great for programmers!");
    }
 
    return 0;
}
\end{lstlisting}
   

اگر به فایل خروجی pdf نگاهی بیاندازید، خواهید دید که کدی در قالب زبان C در متن وارد شده است:

چند نکته:

  • کد در محیطی به نام lstlisting وارد می‌شود. یعنی کد شما باید بین \begin{lstlisting} و \end{lstlisting} قرار گیرد.
  • به مانند حالت قبل، اگر می‌خواهید کد را در متن فارسی وارد کنید، حتماً در محیط latin قرار دهید.
  • تنظیمات بسته listings در این روش به دو صورت انجام می شود:
    1. توسط دستور \lstset. این دستور را باید قبل از محیط lstlisting وارد کنید. برای مثال ذکرشده خواهیم داشت:
       
      \begin{latin}
      \lstset{language=C}
      \begin{lstlisting}
      ...
      ...
      \end{lstlisting}
      \end{latin} 

      شما می توانید دستور lstset‌ را قبل از \begin{document} نیز قرار دهید. تنظیمات تا زمانی که شما دوباره \lstset‌ را بکار نبرید، پابرجا خواهد ماند.

    2. به عنوان تنظیمات محیط lstlisting در داخل []. برای مثال ذکرشده خواهیم داشت:
       
      \begin{latin}
      \begin{lstlisting}[language=C]
      ...
      ...
      \end{lstlisting}
      \end{latin} 

تنظیمات بسته listings

نحوه وارد کردن تنظیمات

همان طور که پیشتر ذکر شد، شما دو روش برای وارد کردن تنظیمات بسته listings دارید:

  • استفاده از دستور \lstset
  • وارد کردن به عنوان تنظیمات محیط lstlisting

در مثال زیر از هر دو شیوه استفاده شده است:

 
\lstset{emph={pMax,pMin,transP,waitingUser,waitQueue},emphstyle=\color{red},backgroundcolor=\color{codeColor},lineskip=.2cm}
\lstinputlisting[language=Java]{Code/threadQueue.java} 

همچنین با استفاده از دستور \lstdefinestyle می‌توانید چندین استایل برای وارد کردن کد تعریف کنید و به فراخور کد از یکی از آن‌ها استفاده کنید. برای مثال در کد زیر دو نوع استایل تعریف شده است:

 
\lstdefinestyle{customc}{
  belowcaptionskip=1\baselineskip,
  breaklines=true,
  frame=L,
  xleftmargin=\parindent,
  language=C,
  showstringspaces=false,
  basicstyle=\footnotesize\ttfamily,
  keywordstyle=\bfseries\color{green!40!black},
  commentstyle=\itshape\color{purple!40!black},
  identifierstyle=\color{blue},
  stringstyle=\color{orange},
}
 
\lstdefinestyle{customasm}{
  belowcaptionskip=1\baselineskip,
  frame=L,
  xleftmargin=\parindent,
  language=[x86masm]Assembler,
  basicstyle=\footnotesize\ttfamily,
  commentstyle=\itshape\color{purple!40!black},
} 

و بعد می‌توانید در هر جایی که می‌خواهید کد خود را وارد کنید، هر یک از استایل‌ها را فراخوانی کنید:

 
\lstinputlisting[style=customasm]{sched.s} 

بسته listings‌ تنظیمات زیادی دارد. ما در این مجال به برخی از مهم‌ترین آن ها اشاره می‌کنیم:

  • language: زبان برنامه‌ای که می‌خواهید وارد کنید. لیست کاملی از زبان‌های برنامه‌نویسی‌ای که listings‌ پشتیبانی می‌کند در لینک LaTeX/Source Code Listings ارایه شده است.
  • emph: کلماتی که به عنوان emph در تنظیمات تعریف می شود، با استایل تعیین شده توسط emphstyle در کد وارد می شوند. به عنوان مثال کد زیر را در نظر بگیرید:
     
    \lstset{emph={pMax,pMin,transP,waitingUser,waitQueue},emphstyle=\color{red}}
    \lstinputlisting[language=Java]{threadQueue.java} 

    در مثال فوق، در صورتی که کلمات pMax, pMin, transP, waitingUser, waitQueue در فایل threadQueue.java یافت شوند، این کلمات به رنگ قرمز نمایش داده خواهند شد:

  • numbers: که می‌تواند یکی از مقادیر none و left و right را به خود بگیرد. در صورتی که مقادیر left یا right را انتخاب کنید، خطوط برنامه شماره گذاری می‌شود و شماره ها در سمت چپ یا راست خواهد آمد.
  • numbersep: تعیین فاصله افقی شماره ها از کد
  • numberstyle: تعیین استایل شماره ها. مثلا numberstyle=\tiny\color{mygray} شماره ها به رنگ mygray و به اندازه tiny نمایش داده می شوند.
  • stepnumber: برای مثال اگر مقدار stepnumber=2 باشد، آن‌گاه یک خط در میان شماره گذاری انجام می‌شود.
  • lineskip: فاصله خطوط به مقدار lineskip از یکدیگر افزایش خواهد یافت.
  • backgroundcolor: رنگ پیش زمینه کادری که در آن کدها وارد می‌شوند.
  • basicstyle: اندازه کدها در متن. برای مثال: basicstyle=\footnotesize
  • commentstyle: استایل وارد کردن کامنت در کد. به عنوان مثال commentstyle=\color{mygreen} رنگ کامنت های وارد شده در کد را به رنگ mygreen تبدیل می کند.
  • showspaces: فاصله ها (space) در کد را با کاراکتری معین، تعیین می کند. مقدار این تنظیم می تواند true یا false باشد.
  • showtabs:  tabها را در متن مشخص می کند. مقدار این تنظیم می تواند true یا false باشد.
  • morekeywords: در هر زبان برنامه نویسی یکسری از واژه ها به عنوان keywordstyle آن زبان محسوب می شود. در این بسته morekeywords استاندارد هر زبان قرار داده شده است. شما می توانید به دلخواه خود یک سری keyword جدید به keyword‌های استاندارد اضافه کنید.
  • deletekeywords: کلمه‌ای که در این تنظیم مشخص می کنید از بین کلمات کلیدی زبان انتخاب شده حذف می شود. به عنوان مثال اگر شما زبان MATLAB را انتخاب کرده باشید، و deletekeywords={clear} باشد، آن‌گاه کلمه کلیدی clear از بین کلمات کلیدی MATLAB در وارد کردن کد به صورت موقت حذف می شود.
  • frame: اضافه کردن یک کادر به دور کد. این تنظیم می تواند یکی از مقادیر none|leftline|topline|bottomline|lines|single|shadowbox را داشته باشد.

بسته Listings تنظیمات زیادی برای تنظیم کادر دور محیط کد فراهم آورده است که با مراجعه به راهنمای آن می توانید از آن ها استفاده کنید.

وارد کردن فرمول ریاضی در کد

فرض کنید می خواهید در قسمت کامنت کدی که در متن وارد کرده اید، یک عبارت در mathmode داشته باشید. مثلا بنویسید \alpha + d_{i}؛ ولی می‌خواهید این عبارت به صوررت درست یعنی $\alpha + d_{i}$ در متن ظاهر شود. برای این کار کافی است که کلیدهای texcl یا mathescape را فعال کنید:

 
\begin{lstlisting}[mathescape=true]
// calculate  $a_{ij}$
$a_{ij} = a_{jj}/a_{ij} + \alpha$;
\end{lstlisting}

با پردازش فایل tex، خروجی به صورت شکل زیر خواهد بود:

نویسنده: ابوالفضل دیانت