علی شکیبا

دفتر یادداشت دیجیتال برای هر چیز مفید!

۹ مطلب با موضوع «LaTeX» ثبت شده است

برای تایپ از TeX Studio استفاده می‌کنم، اما تایپ متن فارسی با آن زجرآور است! به همین دلیل، ترجیح می‌دهم تا متن فارسی را در gedit تایپ کنم و خروجی آن را هم در evince ببینم. اما اجرای دستی xelatex زجرآور است، گرچه خیلی کمتر از زجر تایپ فارسی در TeX Studio است! اولین تلاش برای خودکار کردن به صورت زیر بود که هر دقیقه یکبار xelatex را اجرا می‌کرد!

while $( sleep 60s )
do
xelatex -synctex=-1 -interaction=nonstopmode report.tex
   bibtex report
   xelatex -synctex=-1 -interaction=nonstopmode report.tex
   xelatex -synctex=-1 -interaction=nonstopmode report.tex
done

این موضوع خوب بود تا اینکه زمان پایان اجرای xelatex کمی بیش از یک دقیقه شد! این بار دست به دامن اینترنت شدم! بسته inotify-tools دقیقا این کار را انجام می‌دهد!

while inotifywait -e close_write report.tex
do
xelatex -synctex=-1 -interaction=nonstopmode report.tex
   bibtex report
   xelatex -synctex=-1 -interaction=nonstopmode report.tex
   xelatex -synctex=-1 -interaction=nonstopmode report.tex
done

البته طبق آنچه که در اینجا آمده است، در صورتی که ویرایشگر شما به جای تغییر فایل، کل فایل را بازنویسی کند، gedit این گونه نیست!، باید از راهکار زیر استفاده کنید و پوشه را تحت مانیتور قرار دهید.

while true
do
change = $( inotifywait -e close_write,moved_to,create . )
change = ${change#./ *}
if [ "$change" = "report.tex" ]
then
xelatex -synctex=-1 -interaction=nonstopmode report.tex
    bibtex report
   xelatex -synctex=-1 -interaction=nonstopmode report.tex
   xelatex -synctex=-1 -interaction=nonstopmode report.tex
fi
done
۰ نظر موافقین ۰ مخالفین ۰ ۰۱ ارديبهشت ۹۴ ، ۱۱:۱۴
علی شکیبا

از آنجا که دانشگاه یزد در ایران، آینه TeX است، به همین دلیل دریافت و نصب بسته های آن از داخل دانشگاه با سرعتی بسیار بیشتر از سرعت اینترنت، در حدود 11 MB/s، امکان پذیر است! اما مشکل اینجا است که بعد از اینکه TeXLive را با این روش نصب کردید، apt-get از آن بی خبر است و برای نصب الباقی بسته ها به مشکل بر می خورید! برای این که بتوانیم به apt-get بگوییم که یک بسته را به صورت دستی نصب کرده ایم، روش زیر را از اینجا پیدا کردم! مراحلی که برای من کار کردند، به شرح زیر است:

1- TeXLive را با استفاده از رویه معمول از ایزوی دانلود شده نصب کردم.

2- سپس مسیرهای نصب را به فایل .bashrc اضافه می‌کنم.

3- حالا نوبت به آن رسیده است تا تعدادی بسته تقلبی بسازیم!!! برای این منظور از ابزار equivs استفاده کردم

sudo apt-get install equivs --no-install-recommends
mkdir /tmp/tl-equivs && cd /tmp/tl-equivs
equivs-control texlive-local

سپس فایل ساخته شده را ویرایش می‌کنیم. برای مثال من با استفاده از اینجا، فایل را به صورت زیر ویرایش کردم (فقط نام و ایمیل خود را به عنوان Package Maintainer اضافه کردم :) ) بدیهی است اگر نسبت به این مجموعه، بسته ای را کمتر یا اضافه تر نصب کرده‌اید، لازم است تا تغییرات لازم را بدهید.

Section: misc
Priority: optional
Standards-Version: 3.9.4
Package: texlive-local
Version: 2014-1
Maintainer: A. Shakiba <ali@shakiba.id.ir>
Provides: chktex, biblatex, biblatex-dw, cm-super, cm-super-minimal, context,
dvidvi, dvipng, feynmf, fragmaster, jadetex, lacheck, latex-beamer,
latex-cjk-all, latex-cjk-chinese, latex-cjk-chinese-arphic-bkai00mp,
latex-cjk-chinese-arphic-bsmi00lp, latex-cjk-chinese-arphic-gbsn00lp,
latex-cjk-chinese-arphic-gkai00mp, latex-cjk-common, latex-cjk-japanese,
latex-cjk-japanese-wadalab, latex-cjk-korean, latex-cjk-thai, latexdiff,
latexmk, latex-sanskrit, latex-xcolor, lcdf-typetools, lmodern, luatex,
musixtex, passivetex, pgf, preview-latex-style, prosper, ps2eps, psutils,
purifyeps, t1utils, tex4ht, tex4ht-common, tex-gyre, texlive, texlive-base,
texlive-bibtex-extra, texlive-binaries, texlive-common, texlive-extra-utils,
texlive-fonts-extra, texlive-fonts-extra-doc, texlive-fonts-recommended,
texlive-fonts-recommended-doc, texlive-font-utils, texlive-formats-extra,
texlive-games, texlive-generic-extra, texlive-generic-recommended,
texlive-humanities, texlive-humanities-doc, texlive-lang-african,
texlive-lang-all, texlive-lang-arabic, texlive-lang-cjk, texlive-lang-cyrillic,
texlive-lang-czechslovak, texlive-lang-english, texlive-lang-european,
texlive-lang-japanese, texlive-lang-chinese, texlive-lang-korean,
texlive-lang-french, texlive-lang-german, texlive-lang-greek,
texlive-lang-indic, texlive-lang-italian, texlive-lang-other,
texlive-lang-polish, texlive-lang-portuguese, texlive-lang-spanish,
texlive-latex-base, texlive-latex-base-doc, texlive-latex-extra,
texlive-latex-extra-doc, texlive-latex-recommended,
texlive-latex-recommended-doc, texlive-luatex, texlive-math-extra,
texlive-metapost, texlive-metapost-doc, texlive-music,
texlive-omega, texlive-pictures, texlive-pictures-doc, texlive-plain-extra,
texlive-pstricks, texlive-pstricks-doc, texlive-publishers,
texlive-publishers-doc, texlive-science, texlive-science-doc, texlive-xetex,
thailatex, tipa, tipa-doc, xindy, xindy-rules, xmltex
Architecture: all
Description: My local installation of TeX Live 2014.
A full "vanilla" TeX Live 2014
http://tug.org/texlive/debian#vanilla

حال وقت آن است تا فایل .deb را بسازیم که با دستور زیر انجام می‌شود

equivs-build texlive-local

و بعد آن را مثل آب خوردن نصب کنیم.

sudo dpkg -i texlive-local_2014-1_all.deb

تمام است. 

پی‌نوشت: نوشته شده مبتنی بر این آدرس

۰ نظر موافقین ۰ مخالفین ۰ ۱۷ اسفند ۹۳ ، ۱۵:۴۹
علی شکیبا

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

Theorems \ref{thm.begin} to \ref{thm.last} and Lemma \ref{lem.some}

اما این دفعه یه مقدار فرصت برای جستجوی بیشتر داشتم! باید راه ساده‌تری وجود داشته باشد و وجود داشت! بسته cleveref این کار رو به سادگی بیشتر انجام می‌دهد. فقط به جای دستور \ref از \cref باید استفاده کرد.

\cref{thm.begin,thm.last,lem.some}

نکته قابل ذکر اینکه این بسته به صورت خودکار نوع محیط رو هم تشخیص می‌دهد، یعنی برای قضیه، عبارت Theorem و برای لم عبارت Lemma رو به کار می‌برد. همچنین به زیبایی، در صورت امکان برچسب‌های پشت سر هم رو ادغام می‌کند، یعنی به جای Theorems 1,2,3,5 خروجی به صورت Theorems 1 to 3 and 5 خواهد بود! البته مراقب باشید بین برچسب‌ها و کاما، فاصله قرار ندهید و الا خطا خواهید گرفت! مستندات این بسته از اینجا قابل مشاهده است. البته معارفه بنده با این بسته در اینجا صورت گرفت!

۰ نظر موافقین ۰ مخالفین ۰ ۲۹ آبان ۹۳ ، ۰۹:۰۸
علی شکیبا

به طور معمول، هنگامی که مقاله‌ای را برای داوری ارسال می‌کنم، سعی می‌کنم همه اثبات‌ها (حتی برخی موارد که بسیار ساده هستند و فقط نوشتن آن‌ها طولانی است) را در متن مقاله ذکر کنم. به این شیوه فرایند داوری کمی برای داور ساده‌تر می‌شود و تعداد دورهای داوری به حداقل می‌رسد (البته امیدوارم :) ). اما برای اینکه متن خیلی شلوغ نشود و داور یا ویراستار فکر نکنند (!) که قصد ماست‌مالی کردن و افزایش تعداد صفحات را داشته‌ام، دو کار را انجام می‌دهم:

  1. همه اثبات‌ها، اعم از ساده یا دشوار یا آن‌هایی که لازم است پس از چاپ در متن اصلی ذکر شوند را به پیوست منتقل می‌کنم.
  2. این نکته که همه اثبات ها در پیوست آمده اند را هم در Cover Letter و هم در قسمت Introduction مقاله به صراحت ذکر می‌کنم!

تا قبل از این، این کار را کاملا به صورت زجرآوری به شیوه‌ای دستی انجام می دادم! اما امشب یک راهکار خوب در اینجا پیدا کردم که برای ارجاع‌های بعدی خودم، آن را در اینجا عینا ذکر می‌کنم. کافی  است قطعه کد لاتک زیر در ابتدای فایل پس از \usepackage ها بیاید.

\usepackage{etex,etoolbox}
\makeatletter
\providecommand{\@fourthoffour}[4]{#4}
\def\fixstatement#1{%
    \AtEndEnvironment{#1}{%
        \xdef\pat@label{\expandafter\expandafter\expandafter
            \@fourthoffour\csname#1\endcsname\space\@currentlabel}}}
\globtoksblk\prooftoks{1000}
\newcounter{proofcount}
\long\def\proofatend#1\endproofatend{%
    \edef\next{\noexpand\begin{proof}[Proof of \pat@label]}%
        \toks\numexpr\prooftoks+\value{proofcount}\relax=\expandafter{\next#1\end{proof}}
    \stepcounter{proofcount}}
\def\printproofs{%
    \count@=\z@
    \loop
    \the\toks\numexpr\prooftoks+\count@\relax
    \ifnum\count@<\value{proofcount}%
    \advance\count@\@ne
    \repeat}
\makeatother

همچنین پس از تعریف محیط‌های مورد نظر، لازم است تا بگوییم که برای چه محیط‌هایی می‌خواهیم چنین فرایندی رخ دهد!

\fixstatement{theorem}
\fixstatement{lemma}
\fixstatement{proposition}
\fixstatement{conjecture}
\fixstatement{corollary}

حال، به جای

\begin{proof}
 Now, I am going to show some world shaking result! P = NP! ;) (This is a joke!)
\end{proof}

به این صورت اثبات ها را می‌نویسیم

\proofatend
 Now, I am going to show some world shaking result! P = NP! ;) (This is a joke!)
\endproofatend

پس از آن قسمت پیوست به صورت زیر خواهد بود (به طور معمول، پیوست را بعد از مراجع قرار می‌دهم)

\appendix
  \section{Proofs}
  \printproofs

کار تمام است!

۰ نظر موافقین ۰ مخالفین ۰ ۲۵ آبان ۹۳ ، ۲۳:۵۳
علی شکیبا

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

\usepackage{showlabels}
۱ نظر موافقین ۰ مخالفین ۰ ۱۵ مهر ۹۳ ، ۱۱:۲۰
علی شکیبا

به طور معمول، وقتی که گزارش یا مقاله‌ای را برای استاد راهنما ارسال می‌کنم، حداقل چندبار بخش‌هایی از آن مورد حذف یا بازنویسی قرار می‌گیرد. یکی از ساده‌ترین راه‌ها برای مشخص نمودن اینگونه موارد، که تا به حال از آن استفاده می‌کردم و هنوز هم برای نسخه‌هایی که نیاز به تهیه نسخه چاپی نداشته باشند نیز استفاده خواهم کرد، استفاده از رنگ‌ها یا یادداشت‌های PDF البته در LaTeX است. اما امروز دیدم که یکی از دوستان که از Microsoft Word برای تهیه متون خود استفاده می‌کند، روی متن‌های حذف شده، خط می‌کشد (Strike through). با دیدن این موضوع، من هم علاقه‌مند شدم که از این روش استفاده کنم. به همین دلیل دست به دامن گوگل شدم. راهکار بسیار ساده است. کافی است تا از بسته

\usepackage{ulem}

استفاده کنیم و بعد متن مورد نظر را به صورت زیر مشخص کنیم

\sout{The text to strike through.}

نتیجه دلخواه به‌دست می‌آید. البته فراخوانی بسته ، منجر به ایجاد تغییراتی در عملکرد دستور \emph می‌شود که برای بازگرداندن آن به حالت عادی، لازم است تا پس از فراخوانی بسته، دستور زیر نیز قرار داده شود!

\normalem

نتیجه رضایت بخش است.

۰ نظر موافقین ۰ مخالفین ۰ ۱۹ شهریور ۹۳ ، ۲۳:۱۰
علی شکیبا

من برای کنترل نسخه مقالات، برنامه‌ها و نظایر اون که بخش عمده‌ای به صورت متن ساده هستند، از git استفاده می‌کنم و طبعا برای پشتیبانی اون هم از یکی از سرویس‌های رایگان ابری استفاده می‌کنم (نسخه آکادمیک github). تا این جای کار که خوبه!

داشتن یه نسخه پشتیبان روی یک سیستم دیگه که کنترلش دست خود آدم باشه، یه کار خوب به نظر می رسد، به همین دلیل، روی یکی از سرورهای آزمایشگاه که برای سرویس دهی مخازن debian و python ازش استفاده می کنیم، github رو نصب کردم.

# apt-get install git-core

و بعد از اون با نام کاربری خودم به سرور مزبور لاگین کردم و یک پوشه برای نگهداری همه مخازن مورد نیازم به اسم git درست کردم (وقتی مدیریت سرور دست خود آدم باشه، معلومه که برای خودش quota در نظر نمی گیره ;-) )

$ mkdir git

حالا نوبت به ساختن یک مخزن برای نگهداری مثلا مقالاتم می رسه!

$ cd ~/git
$ git init --bare MyPapers.git

و حالا کافیه که روی سیستم خودم (یا هر جای دیگه) به محل ذخیره مقالاتم بروم (که البته قبلا یک مخزن git در اون ایجاد شده). اولین گام اینه که آدرس مخزن رو روی سرور به سیستم بدم

$ git remote add lqip shakiba@lqip-s3:/home/shakiba/git/MyPapers.git


۰ نظر موافقین ۰ مخالفین ۰ ۱۷ ارديبهشت ۹۳ ، ۱۶:۴۳
علی شکیبا

آیین نامه نگارش رساله در دانشگاه، الزام می کند که اولین صفحه از هر فصل فاقد شماره باشد. برای اینکه این امر در $\LaTeX$ محقق شود، از دستورات ذیل باید قبل از

 \begin{document} 

استفاده کنیم.

\makeatletter
\renewcommand\chapter{\if@openright\cleardoublepage\else\clearpage\fi
    \thispagestyle{empty}%
    \global\@topnum\z@
    \@afterindentfalse
    \secdef\@chapter\@schapter}
\makeatother

این راهکار برگرفته از این آدرس است.

۱ نظر موافقین ۰ مخالفین ۰ ۰۳ دی ۹۲ ، ۱۴:۳۶
علی شکیبا

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

\usepackage{pdfpages}

سپس در محلی که تمایل داریم تا صفحاتی از فایل pdf را درج کنیم، از دستورات زیر استفاده می‌کنیم.

\includepdf{mypaper}

این دستور منجر به درج اولین صفحه از فایل mypaper.pdf در خروجی می‌شود. اگر بخواهیم همه صفحات فایل mypaper.pdf را در خروجی درج کنیم، از دستور زیر استفاده می‌کنیم.

\includepdf[pages=-]{file}

ممکن است بخواهیم برخی از صفحات را درج کنیم، برای مثال صفحه اول و صفحه آخر از یک فایل pdf هفت صفحه ای.

\includepdf[pages={1, 7}]{file}

برای مثال‌های بیشتر از این دستور می‌توانید به راهنمای بسته pdfpages مراجعه کنید.

۰ نظر موافقین ۰ مخالفین ۰ ۰۱ دی ۹۲ ، ۲۰:۵۹
علی شکیبا