msgbartop
Just another blog of mine
msgbarbottom

04 Jul 09 ฟอนท์ Inconsolata กับ LaTeX

Inconsolata เป็นฟอนท์สำหรับโปรแกรมเมอร์ (หมายถึงฟอนท์ความกว้างคงที่สำหรับแก้ไขโปรแกรม) ที่ออกแบบโดย Raph Levien ซึ่งผมใช้มาสักระยะหนึ่งแล้ว เนื่องจากชอบรูปร่าง สัดส่วนของตัวอักษร เมื่อไม่นานนี้มีคนใจดีนำฟอนท์นี้ไปทำเป็นแพคเกจสำหรับ LaTeX ซึ่งสามารถโหลดได้จาก http://ctan.org/pkg/inconsolata ทำให้ผมสามารถนำฟอนท์นี้มาใช้สำหรับแสดง code บนสไลด์ที่ใช้ประกอบการสอน (ผมใช้ LaTeX Beamer สำหรับทำสไลด์)

แต่เทอมนี้ผมสอนวิชา Computer Architecture ซึ่งพูดถึงพวก machine code และ assembly code เต็มไปหมด จึงคิดว่าการใช้เลขศูนย์แบบมี / คาด จะช่วยลดความกำกวมของเนื้อหาได้พอควร ผมจึงต้องแก้ไขแพคเกจเล็กน้อย เนื่องจาก Karl Berry ที่เป็นคนออกแบบแพคเกจ เลือกใช้ศูนย์แบบไม่มีคาดเป็นรูปร่างปกติสำหรับเลขศูนย์

พอลองดูข้อมูลรูปร่างของตัวอักษรต่างๆ ที่มากับฟอนท์แล้ว ก็พบว่ามีมาให้ทั้งสองแบบ คือ เลขศูนย์แบบปกติ กับเลขศูนย์แบบมี / คาดทับ ก็เลยลองไปดูไฟล์ fi4-ec.enc ซึ่งเป็นไฟล์ที่ใช้กำหนดว่า จะให้รหัสใดใช้รูปร่างตัวอักษรตัวไหนของฟอนท์ แล้วผมก็พบว่าไฟล์นี้ระบุว่า

/zero.noslash       %0x30

ผมก็เลยแก้เป็น

/zero               %0x30

ก็เป็นอันเรียบร้อย เพราะเป็นการบอกให้ LaTeX เลือกใช้เลขศูนย์แบบมี / คาดทับ สำหรับรหัส 0×30

จบแต่เพียงเท่านี้ :D

Tags: ,

22 May 09 PDFCrop

เวลาใช้ Tikz หรือ PGF สร้างภาพประกอบ หรือแผนภาพต่างๆ ผมจะพบปัญหาเวลา ต้องการนำรูปนั้นไปใช้ในสถานกรณ์อื่น เช่น เดิมเคยเขียนไว้สำหรับรายงาน แล้วอยากเปลี่ยนขนาดใหม่เอาไปใช้ประกอบสไลด์ อันที่จริง Tikz ก็มีตัวเลือก scale มาให้สำหรับปรับเปลี่ยนขนาดให้พอเหมาะ แต่ก็ยังมีปัญหาที่ขนาดตัวอักษรอีก (หรือผมทำไม่เป็นก็ไม่รู้) ต้องแก้ไขฟอนท์ ทำให้ยุ่งยากพอสมควร

ผมก็เลยคิดจะเปลี่ยนจากการแปะคำสั่งวาดภาพไปในไฟล์ตรงๆ เขียนไฟล์ LaTeX ต่างหากสำหรับรูปแต่ละรูป ทำเป็น PDF แล้วค่อยเอาไปแปะทีหลัง ซึ่งจะทำให้การปรับเปลี่ยนขนาด ทำได้ง่ายมากๆ ลองหาดูในที่ต่างๆ สุดท้าย ก็เจอโปรแกรม PDFCrop เป็นสคริปต์ที่มากับแพคเกจ texlive-extra-utils บน Ubuntu โปรแกรมนี้ทำหน้าที่ตัดขอบว่างๆ ทั้งหมดของรูปออก ทำให้สามารถใช้ includegraphics แปะเข้าไปในไฟล์อื่นได้ง่ายๆ วิธีใช้ก็คือ

$ pdfcrop myfig.pdf

Tags: ,

21 May 09 เพิ่มเลขหน้าให้ PDF

การใช้ LaTeX ทำสไลด์สำหรับใช้สอนหนังสือ จะมีความลำบากนิดหน่อยในการเตรียม handout สำหรับแจกนักศึกษา (จริงๆ แล้ว ไม่ค่อยอยากแจกเท่าไหร่ พอมีสไลด์ครบแล้ว ส่วนใหญ่ก็จะคุยกันเยอะ) ถ้าใช้ Beamer ก็จะมีแพคเกจ pgfpages มาให้ใช้สำหรับพิมพ์สไลด์หลายๆ หน้ารวมกันในหน้าเดียวอยู่แล้ว แต่ผมชอบใช้โปรแกรม pdfnup ที่มาพร้อมกับแพคเกจ pdfjam บน Ubuntu มากกว่า วิธีใช้ก็ง่ายๆ เช่น

$ pdfnup --nup 2x2 --frame true myslides.pdf

จะได้ผลลัพธ์เป็นไฟล์ PDF ชื่อ myslides-2×2.pdf วางสไลด์สี่หน้าต่อหนึ่งแผ่น แบบ 2 คูณ 2

ทีนี้ทุกเทอมก็ใช้อย่างนี้มาตลอด มาเทอมนี้อยากให้มีเลขหน้าเพิ่มเข้าไปด้วย จะได้เรียงลำดับหน้าต่างๆ ได้ไม่ยาก (ปกติร้านถ่ายเอกสารจะใช้มือเขียนเลขหน้าให้) วิธีที่ง่ายที่สุดก็คือไปหา Adobe Acrobat ตัวจริงมา จะมีฟังก์ชันให้ใส่เลขหน้าโดยอัตโนมัติ แต่เนื่องจากเราไม่อยากเสียตังค์ ก็เลยมานั่งดูโปรแกรม pdfnup ว่าจริงๆ เป็นสคริปต์ที่สร้างไฟล์สำหรับ pdfLaTeX ที่ใช้แพคเกจ pdfpages เพื่อเอาหน้าหลายๆ หน้ามาเรียงไว้ในหน้าเดียวกัน ซึ่งจะเรียงแบบหนึ่งหน้าต่อหนึ่งหน้าก็ได้ เลยลองเล่นดู ใช้แพคเกจ fancyhdr ของ LaTeX มาช่วยกำหนดตำแหน่งเลขหน้า สุดท้ายได้ไฟล์สำหรับใส่เลขหน้าอัตโนมัติมา

\documentclass{article}
 
\usepackage[final]{pdfpages}
\usepackage[paper=a4paper,landscape,tmargin=2cm,bmargin=2.3cm,lmargin=2.5cm,rmargin=1.5cm]{geometry}
\usepackage{fancyhdr}
 
\setcounter{page}{..PAGE..}
\pagestyle{fancy}
\lhead{My Course}
\cfoot{}
\rfoot{{\LARGE\thepage}}
\renewcommand {\headrulewidth}{0pt}
\renewcommand {\footrulewidth}{0pt}
 
\begin{document}
	\includepdfset{pages=-,pagecommand=\thispagestyle{fancy}}
	\includepdf[fitpaper=true,scale=1]{..FILE..}
\end{document}

และเพื่อให้เกิดความสะดวกในการทำงาน ก็เลยไปเขียนสคริปต์มาอีกอันหนึ่ง ใช้ sed แก้ไข ..PAGE.. และ ..FILE.. ใน LaTeX ให้เป็นเลขหน้าเริ่มต้น และชื่อไฟล์ PDF ที่ต้องการ

#!/bin/sh
 
filename=$1
pagenumber=$2
newname=${1%.pdf}-p.tex
sed -e "s/\.\.FILE\.\./"$filename"/g" -e "s/\.\.PAGE\.\./"$pagenumber"/g" < page.tex > $newname
 
pdflatex $newname
pdflatex $newname
rm $newname
rm ${newname%tex}log

สุดท้ายจะได้โปรแกรมง่ายๆ สำหรับเติมเลขหน้าได้ตามต้องการ ส่วนที่ผมยังงงๆ อยู่ก็คือ ไม่เข้าใจว่าทำไมฟอนท์ใน LaTeX มันมีขนาดเล็กกว่าปกติ เลยต้องกำหนดให้ใช้ \LARGE สำหรับเลขหน้า คิดว่าอาจจะมีปัญหาอะไรบางอย่างเกี่ยวกับขนาดกระดาษ หรืออะไรซักอย่าง เลยแก้แบบง่ายๆ ไปก่อน ขี้เกียจไปค้นดูละเอียดๆ ส่วนคนอื่นถ้าจะเอาไปใช้ ก็สามารถปรับแต่งตำแหน่งๆ หรือระยะขอบกระดาษได้โดยแก้ที่ geometry ครับ

Tags: , , , ,

05 Jan 09 ลองเล่น TikZ #1

PGF และ TikZ เป็นแพคเกจของ LaTeX ซึ่งใช้ในการวาดภาพ (เช่น แผนภาพแบบต่างๆ) ในลักษณะเดียวกับ PSTricks แต่ PGF/TikZ ถูกออกแบบมาให้สนับสนุน pdfTeX ซึ่งทำให้ได้ผลที่ได้ออกมาเป็น PDF อันที่จริง PGF/TikZ นี้พัฒนาจากคนๆ เดียวกับคนพัฒนาแพคเกจ Beamer เพื่อให้เป็นแพคเกจพื้นฐานของในการแสดงผลรูปต่างๆ

เนื่องจากตอนนี้ผมอยู่ระหว่างการพยายาม ลด ละ เลิก Mac OS X และหันมาใช้ Linux (Ubuntu) แบบ 100% (ทั้งๆ ที่ยังใช้เครื่อง MacBook อยู่นี่แหละ) จุดอ่อนของ Ubuntu ที่ทำให้ผมยังไม่สามารถเปลี่ยนมาใช้ทำงานได้ครบถ้วน ก็คือ ขาดซอฟท์แวร์สำหรับสร้างแผนภาพ เวลาที่ผมต้องทำรูปประกอบสำหรับสไลด์ หรือเอกสารต่างๆ ซอฟท์แวร์ที่มีอยู่ยังไม่ถูกใจผม (เมื่อเทียบกับ OmniGraffle ที่ใช้อยู่ในปัจจุบัน) แต่ผมก็ยังไม่มีเวลา(และความสามารถ) ที่จะไปปรับปรุงซอฟท์แวร์พวกนั้นให้มันดีขึ้นจนผมพอใจ ตามหลักการของซอฟท์แวร์เสรี ผมจึงคิดว่าจะใช้ PGF/TikZ กับ GraphViz เป็นทางออก ก็เลยมานั่งเขียนบลอกอันนี้ไว้ เผื่อว่าจะเป็นประโยชน์กับคนอื่นๆ ที่จะหันมาใช้วิธีเดียวกับผม

เริ่มวาดภาพด้วย TikZ

TikZ รวบรวมคำสั่งที่เกี่ยวข้องกับการวาดแผนภาพเบื้องต้น จึงใช้งานได้ง่ายกว่า PGF ที่เป็นระบบจัดการพื้นฐานทั้งหมด ดังนั้นเราจะเริ่มกันด้วยคำสั่งต่างๆ ของ TikZ เริ่มต้นเราจะต้องเรียกใช้แพคเกจ tikz ด้วยคำสั่ง \usepackage{tikz} ไว้ที่ต้นไฟล์ จะวาดรูปทรงที่ส่วนใดของเอกสาร ก็ให้ใช้ environment ชื่อว่า tikzpicture โดยคำสั่งของ TikZ ทั้งหมดที่เราจะใช้จะต้องระบุไว้ใน environment นี้

\documentclass{article}
\usepackage{tikz}
\begin{document}
	Hello, World!
 
	\begin{tikzpicture}
	...
	\end{tikzpicture}
\end{document}

คำสั่งพื้นฐานสำหรับการวาดรูปทรงต่างๆ ก็คือ \draw โดย TikZ จะใช้ระบบพิกัด (x,y) ในการระบุตำแหน่งของรูปทรงที่เราจะสร้างขึ้น เช่น

\begin{tikzpicture}
	\draw (0,0) -- (5,5);
	\draw (5,0) -- (0,5);
\end{tikzpicture}

เมื่อคอมไพล์ด้วย LaTeX ก็จะได้เอกสารที่ประกอบด้วยรูปนี้ (ไม่รวมเส้นกริดสีเทาๆ นะ) คือเป็นรูปเส้นตรงสองเส้นตัดกัน เนื่องจากคำสั่งข้างบน กำหนดให้ลากเส้นตรงสองเส้น จากจุด (0,0) ไปยัง (5,5) และจากจุด (0,5) ไปยัง (5,0) ในที่นี้มีจุดสังเกตที่คำสั่ง \draw จะต้องลงท้ายด้วยเครื่องหมาย semi-colon (;) เสมอ

tikz1-crop

ระบบพิกัดของ TikZ และการสร้าง Path

อย่างที่บอกไปแล้วว่าพิกัดใน TikZ จะแทนด้วยรูปแบบ “(x,y)” ถ้าไม่ระบุหน่วยความยาวไว้ ก็จะใช้หน่วยเป็น cm โดยปริยาย และ TikZ จะใช้ระบบพิกัดแบบคณิตศาสตร์ คือตำแหน่ง (0,0) จะอยู่ที่มุมล่างซ้ายของภาพ คำสั่ง \draw ตามตัวอย่างข้างบน จึงลากเส้นจากมุมล่างซ้ายไปมุมบนขวาก่อน แล้วจึงลากเส้นจากมุมบนซ้ายไปยังมุมล่างขวา และภาพนี้จะมีขนาด 5 คูณ 5 ซม. เมื่อสร้างเป็นเอกสารแบบ PDF นี่คือจุดเด่นของการสร้างภาพโดยใช้คำสั่ง เพราะเราสามารถระบุตำแหน่งต่างๆ ได้พอดี รูปที่ได้มีขนาดตามต้องการและแม่นยำสูงกว่าการลากด้วยเมาส์

การสร้าง Path หรือเส้นต่างๆ จะใช้เครื่อง “–” เพื่อระบุว่าต้องการให้ลากเส้นตรงเชื่อมระหว่างจุด เราสามารถกำหนดจุดหลายๆ จุดได้ในคำสั่งเดียว เช่น

\draw (0,0) -- (5,5) -- (0,5) -- (5,0);

tikz2-crop

เราสามารถกำหนดรูปแบบต่างๆ สำหรับรูปทรงที่เราสร้างขึ้นโดยระบุเป็นพารามิเตอร์ของคำสั่ง \draw เช่น กำหนดสีโดยระบุชื่อสี (PGF/TikZ จะใช้วิธีการกำหนดสีคล้ายๆ กับ xcolor เช่น red, red!20) กำหนดรูปแบบเส้น (dashed, dotted), กำหนดลูกศรที่ปลายเส้น (-> สำหรับลูกศรที่ปลายเส้น, <-> ถ้าต้องการทั้งสองปลาย, ใช้ >=latex สำหรับกำหนดรูปแบบหัวลูกศร), กำหนดความหนาของเส้น (เช่น very thick, thick, thin, very thin) ตามตัวอย่าง

\draw [red,very thick] (0,0) -- (5,5);
\draw [blue,thick,->]  (5,5) -- (0,5);
\draw [green!80!black,very thick,>=latex,<->] (2.5,2.5) -- (5,0);

tikz3-crop

นอกจากนี้เรายังสามารถหมุนรูปทรงที่สร้างขึ้นได้ โดยใช้พารามิเตอร์ rotate around แล้วกำหนดมุมที่ต้องการให้หมุนรูป และองศาที่ต้องการหมุน เช่น

\draw [->] (0,-5) -- (0,5) node[above] {$y$};
\draw [->] (-5,0) -- (5,0) node[right] {$x$};
\draw [->,dashed,rotate around={30:(0,0)}] (0,-5) -- (0,5) node[above] {$y$};
\draw [->,dashed,rotate around={30:(0,0)}] (-5,0) -- (5,0) node[right] {$x$};

tikz4-crop

จะเห็นว่าแกนที่เป็นเส้นประ จะหมุนทวนเข็มไปจากแกนปกติ 30 องศาตามที่กำหนดให้ rotate around ส่วนคำสั่ง node ใช้สำหรับกำหนดข้อความ หรือป้ายที่จุดปลายของ path โดยสามารถกำหนดได้ว่าจะให้ข้อความนั้น วางอยู่ที่ตำแหน่งใดของจุดปลาย เช่น right, left, above, below

ตอนนี้ขอจบไว้เพียงเท่านี้ก่อน แล้วพรุ่งนี้ผมจะพยายามมาเขียนต่อ คิดว่าอีกประมาณ 2-3 ตอนก็น่าจะจบ

อ้างอิง Tikz & PGF Manual

Tags: , ,

02 Jan 09 วงรี

ตอนนี้มีนักศึกษาคนหนึ่ง ทำงานที่เกี่ยวข้องกับสมการวงรีอยู่ คุยกันไปคุยกันมาปรากฏว่า ลืมกันทั้งอาจารย์ทั้งลูกศิษย์แล้วว่าสมการวงรีเขียนยังไง ค้นไปค้นมาก็เจอว่า สมการวงรีที่มีจุดศูนย์กลางอยู่ที่ (0,0) มีรัศมีทั้งสองแกนเป็น a กับ b จะเขียนอยู่ในรูป

\displaystyle\frac{x^2}{a^2}+\frac{y^2}{b^2} = 1

ทีนี้ถ้าจะหาสมการของวงรี ที่ไม่ได้อยู่ที่ (0,0) ล่ะ สมมติว่าเรามีวงรีรูปหนึ่ง มีศูนย์กลางอยู่ที่ (h,k) เราก็จะคิดง่ายๆ ว่า กลุ่มจุดที่ประกอบกันเป็นรูปวงรี ที่มีศูนย์กลางอยู่ที่ (h,k) นั้น ทุกจุด (x,y) จะมีความสัมพันธ์ตามสมการพื้นฐานนั่นแหละ แต่เราต้องย้ายรูปทั้งรูปมาอยู่ที่ (0,0) ก่อน วิธีย้ายก็ง่ายๆ แค่หักค่า h กับ k ออกจาก x กับ y ที่มีอยู่ซะ รูปวงรีทั้งรูปก็จะเลื่อนมาอยู่ที่ (0,0) จึงได้สมการเป็น

\displaystyle\frac{(x-h)^2}{a^2}+\frac{(y-k)^2}{b^2}=1

ถ้าเป็นวงรีแบบที่ถูกหมุนไปด้วยมุม θ เราก็จะทำแบบเดียวกับการเปลี่ยนจุดศูนย์กลาง คือ หมุน x กับ y กลับไปที่เดิมด้วย

x^\prime=x\cos \theta + y\sin \theta

y^\prime=-x\sin \theta + y\cos \theta

จึงได้สมการเป็น

\displaystyle\frac{(x\cos \theta+y\sin \theta)^2}{a^2} + \frac{(-x\sin \theta + y\cos \theta)^2}{b^2} = 1

แล้วถ้าหมุนด้วย เลื่อนจุดศูนย์กลางด้วยล่ะ? ก็ไม่ยาก (จริงๆ ตัวเองก็งงอยู่นาน) ก็ย้ายมากลับมาที่จุด (0,0) ก่อน แล้วค่อยหมุน ได้สมการเป็น

\displaystyle\frac{((x-h)\cos \theta+(y-k)\sin \theta)^2}{a^2} + \frac{(-(x-h)\sin \theta + (y-k)\cos \theta)^2}{b^2} = 1

เป็นอันว่าเรียบร้อย จริงๆ ที่เขียนเรื่องนี้ ก็เพราะอยากลองใช้ Plugin Easy LaTeX ของ WordPress

อ้างอิง: Ellipse, Rotation of Axes

Tags: , , ,