Archive

Archive for the ‘latex’ Category

ฟอนท์ Inconsolata กับ LaTeX

July 4th, 2009

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

latex ,

PDFCrop

May 22nd, 2009

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

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

$ pdfcrop myfig.pdf

latex ,

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

May 21st, 2009

การใช้ 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 ครับ

latex, linux , , , ,

ลองเล่น TikZ #1

January 5th, 2009

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

latex , ,

วงรี

January 2nd, 2009

ตอนนี้มีนักศึกษาคนหนึ่ง ทำงานที่เกี่ยวข้องกับสมการวงรีอยู่ คุยกันไปคุยกันมาปรากฏว่า ลืมกันทั้งอาจารย์ทั้งลูกศิษย์แล้วว่าสมการวงรีเขียนยังไง ค้นไปค้นมาก็เจอว่า สมการวงรีที่มีจุดศูนย์กลางอยู่ที่ (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

latex, research , , ,