چرا گنو لینوکس رو دوست دارم؟

یه بازی/مسابقه وبلاگی راه افتاده با عنوان این که چرا گنو/لینوکس رو دوست دارم؟

خوب من دلایل زیادی دارم برای دوست داشتن گنو/لینوکس. اما می‌خوام تو این پست روی یکی از اون‌ها تمرکز کنم: فرمان‌پذیری. قبلش بگم که همه کارایی که من تو این پست می‌کنم رو با ویندوز/مک/داس هم می‌شه انجام داد. اما گنو/لینوکس انگار واسه این کارا طراحی شده. فرقش مث اینه که سر یه پیچ تند با سرعت ۱۲۰ کیلومتر در ساعت بخوای با موتور گازی بپیچی یا با یکی از این ماشین آمریکایی پت و پهن‌ها.

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

این شد که این دفعه لپ‌تاپ رو با اوبونتو بالا آوردم.

مشکل اول این بود که کلی تو ورد تایپ کرده بودم و الان می‌خواستم همه رو ببرم تو لتک. پس باید فایل ورد رو تبدیل به متن می‌کردم. با یه سرچ تو synaptic به یه ابزار ساده برخوردم: docx2txt. مشکل حل شده بود.

خوشبختانه livetex2011 رو از یکی از دوستان گرفته بودم. خیلی راحت نصبش کردم. فونت‌ها رو هم کافیه سرچ کنید ubuntu install font تا بی‌نهایت راهنما برای نصبش داشته باشید. ناگفته نماند برای حروف‌چینی فارسی از بسته xepersian استفاده می‌کنم.

بعد رفتم که فایل لتک رو با gedit ویرایش کنم. سینتکس لتک رنگی نبود. کافی بود بسته gedit-plugins رو نصب کنم.

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

حالا می‌خواستم فایل latex فقط با یه دستور کامپایل بشه. چه ابزاری بهتر از یه makefile؟ با کمی جستجو چند تا پست عالی (+ و + و +) پیدا کردم و makefile خودم رو ساختم:
[bash]
# This makefile works with png files.
# For a different directory structure one need to change only next four lines.
MAIN = proposal
SRC_DIR = .
PIC_DIR = pics
BUILD_DIR = build

VPATH = $(SRC_DIR) $(PIC_DIR) $(BUILD_DIR)

TEX_FILES = $(wildcard $(SRC_DIR)/*.tex)
BIB_FILES = $(wildcard $(SRC_DIR)/*.bib)
EPS_FILES = $(patsubst %.png,%.eps,$(wildcard $(PIC_DIR)/*.png))

TEX = xelatex -interaction nonstopmode -output-directory=$(BUILD_DIR)
BIB = bibtex

$(MAIN).pdf: $(EPS_FILES) $(TEX_FILES) $(BIB_FILES)
$(TEX) $(MAIN).tex
cp -n $(SRC_DIR)/*.bib $(BUILD_DIR)/
cd $(BUILD_DIR);pwd;bibtex $(MAIN).aux;cd ..
$(TEX) $(MAIN).tex
$(TEX) $(MAIN).tex

clean:
cd $(PIC_DIR); rm *.eps; cd ..
cd $(BUILD_DIR); rm *; cd ..

%.eps: %.png
sam2p $< $(PIC_DIR)/basename $< .png.eps
[/bash]

قبلا یه پست دیگه در منقبت sam2p نوشتم البته.

حالا کافی بود که برای صدازدن makefile تو gedit یه کلید میانبر تعریف کنم. اما کلید محترم کار نمی‌کرد و این موجب شد یه چیز جدید از اینجا یاد بگیرم: اگر path به bashrc اضافه بشه فقط وقتی ترمینال باز می‌کنیم کار می‌کنه. اما اگه به profile اضافه بشه همه جا کار می‌کنه.

تو قدم بعد داشتم دنبال یه pdf reader‌می‌گشتم که وقتی فایل pdf جدید ساخته شد خود به خود آپدیت بشه. خوب اشتباه می‌کردم. اینجا ویندوز نیست و Document Viewer پیش‌فرض اوبونتو خودش این خاصیت رو داره.

و در آخر موند مدیریت مراجع. از قدیم JabRef رو می‌شناسم. اما با یه سرچ یه ابزار بهتر پیدا کردم: Zotero. این یه افزونست برای فایرفاکس که هم خروجی فایل bib می‌ده، هم موقع اینترنت گردی واقعا با یه کلیک مرجع رو ثبت می‌کنه و هم میشه آدم همه کارایی که رو چند تا کامپیوتر می‌کنه رو با هم (مث xmarks) سینک نگه داره.

زیبا نیست؟ هم کارام رو انجام دادم، هم یه اکو سیستم برای خودم به وجود آوردم که همه اجزاش رو می‌شناسم، هم کلی چیز یاد گرفتم، و هم -مهمتر از همه- کلی از کارم لذت بردم. تو کل مراحل کارم گنو/لینوکس گوش به فرمان من بود. نه کار اضافه می‌کرد و نه کار کمتر. اون دقیقا کاری رو که من می‌خواستم انجام می‌داد و برای همینه که گنو/لینوکس رو دوست دارم.

آپدیت: makefile رو برای کار با مراجع تغییر دادم. (با کمک از اینجا)

بعد التحریر: اگه جایزه از اول راسپبری بود چه بسا تو این پست آپولو هوا می‌کردیم. :دی

رسم خطوط افقی در Latex

در Latex انواع خطوط را می‌توان توسط تابع line ترسیم کرد. این تابع دو پارامتر می‌گیرد که تعیین کننده بردار نرمال عمود بر خط هستند.
در مورد خطوط افقی، مولفه افقی این بردار ۱ و مولفه قائم آن صفر است. علاوه بر این داخل کروشه باید طول این خط ذکر شود.
[tex light=”true”]line(nx,ny){length}[/tex]
مشکل استفاده از این دستور این است که نمی‌توان همراه با ماکروی textwidth از آن استفاده کرد (یا لااقل من نتوانستم.).
راه حل دیگر استفاده از یک جدول غیر واقعی است:
[tex light=”true”]begin{centerl}
begin{tabular*}{.5textwidth}{c}
hline
end{tabular*}
end{center}[/tex]
اشکال استفاده از این روش ناخوانایی آن است. بنابر این بهتر است همه این دستور به یک دستور تبدیل شود:
[tex light=”true”]newcommand{hseprate}[1]{
begin{center}
begin{tabular*}{#1}{c}
hline
end{tabular*}
end{center}
}[/tex]
و پس از آن هر جا که لازم بود می‌شود به راحتی از یک دستور استفاده کرد:
[tex light=”true”]hseprate{0.5textwidth}[/tex]

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

خوب. قضیه اینه که می‌خوام یه مقاله که با TeX نوشتم را منتشر کنم. اما تمامی تصاویری که تهیه کرده‌ام به فرمت png هست در صورتیکه ژورنال محترم این تصاویر رو به فرمت eps می‌خواد.
برای تبدیل فرمت تصاویر به فرمت eps برنامه sam2p رو باید نصب کنم:
[bash light=”true”]sudo apt-get install sam2p[/bash]
خوب. بعد نصب sam2p سعی میکنم فایل‌ها رو یکی یکی تبدیل کنم. اما این کار حوصله سر بر و زمانبره. واسه همین هم میرم سراغ سرچ برای اینکه بتونم همه فایل‌ها رو با یه دستور تبدیل کنم. چیزی که گیرم میاد دستور for do done هستش. مثلا
[bash light=”true”]for file in *; do echo $file; done[/bash]
شروع میکنه یکی یکی فایلهای دایرکتوری جاری رو میریزه تو متغیر فایل و بعد هم نمایششون میده. قبل اینکه مرحله بعد رو بگم، یه اشاره بکنم که sam2p دو تا پارامتر می‌گیره: اولی اسم فایلیه که باید تبدیل بشه (مثلا a.png( و دومی اسم فایل بعد تبدیل شدن (مثلا a.eps(.
با این اوصاف باید یه جوری حالی دستور for بکنم که بالام جان پارامتر دوم دستور sam2p باید پسوندش یه چیز دیگه باشه. مجدداگوگل میکنم و میرسم به دستور basename. این دستور اسم یه فایل رو بدون پسوند بر میگردونه. مثلا حاصل
[bash light=”true”]basename salam.txt .txt[/bash]
یه salam خالیه. و مثلا حاصل عبارت
[bash light=”true”]basename salam.txt .txt.jpg[/bash]
salam.jpg خواهد بود.
خوب حالا وقتشه که همه چیز رو با هم ترکیب کنم:
[bash light=”true”]for file in *.png;do sam2p $file basename $file .png.eps; done[/bash]
و با یه دستور کلی فایل به سادگی تغییر فرمت میدن.

جا داره از جادی هم تشکر کنم واسه اینکه با صمیمیت نوشته‌هاش شوق به اشتراک گذاشتن رو تو آدم ایجاد می‌کنه.