Archive

Archive for the ‘latex’ Category

ลองเล่น 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 , , ,

LaTeX with Thai

March 27th, 2008

ช่วงนี้มีคนถามเกี่ยวกับเรื่องการใช้ LaTeX กับภาษาไทยบ่อยๆ เลยเอามาจดไว้หน่อยล่ะกัน ที่โดนถามๆ มา มักจะเป็นการใช้ LaTeX เขียนเปเปอร์โดยใช้ภาษาอังกฤษเป็นหลัก มีภาษาไทยแทรกเล็กน้อยเท่านั้น จึงทำได้ 2 วิธี

  1. ใช้ Thai LaTeX ซึ่งเป็นวิธีการที่มาตรฐานที่สุด วิธีติดตั้งก็มีอธิบายไว้หลายที่ ถ้าจะให้ง่ายที่สุดก็คงจะต้องใช้ Ubuntu หรือ Debian แล้ว apt-get install thailatex ก็น่าจะจบแล้ว ส่วนวิธีการใช้งาน ก็เพียงแค่เพิ่ม \usepackage[thai,english]{babel} เพื่อระบุว่าจะใช้ภาษาไทยด้วย แต่ให้ใช้ภาษาอังกฤษเป็นภาษาหลัก ฟอนต์ต่างๆ หรือรูปแบบเอกสารจะยังคงเหมือนกับ style file เดิม เวลาจะเขียนภาษาไทยก็ใช้สวิทช์ \thai เพื่อระบุส่วนที่ต้องการให้เป็นภาษาไทย เช่น {\thai ภาษาไทย}
  2. ใช้ XeLaTeX ซึ่งเป็น TeX รุ่นที่ออกแบบมาให้สนับสนุนฟอนท์แบบ OpenType ตั้งแต่ต้น ทำให้นำฟอนท์ต่างๆ ที่ติดตั้งไว้ในระบบมาใช้ได้เลย ข้อดีก็คือเลือกฟอนท์ได้ตามใจชอบ สามารถใช้ฟอนท์ที่มักจะใช้กันบ่อยๆ ได้ง่ายกว่า แต่ข้อเสียก็อยู่ที่ตัว XeTeX ที่เป็น engine พื้นฐานของ XeLaTeX ที่อาจจะมีบัก หรือยังทำฟีเจอร์ต่างๆ ไม่ครบ ทำให้ไม่สามารถใช้แพคเกจบางส่วนของ LaTeX ได้ โดยเฉพาะแพคเกจที่ไปยุ่งกับพวก pdf โดยตรงเช่น Beamer แต่ถ้าจะใช้เขียนเปเปอร์ ก็ไม่น่าจะมีปัญหาอะไร วิธีการใช้ก็แค่เพิ่ม \usepackage{fontspec} เพื่อให้กำหนดลักษณะฟอนท์ได้ง่ายๆ แล้วก็แค่ {\fontspace{Thonburi} ภาษาไทย}

latex , ,

PGF 2.00

March 24th, 2008

ช่วงนี้ปิดเทอมแล้ว เริ่มมีเวลาว่างมากขึ้น เลยกะจะเตรียมสไลด์เกี่ยวกับ SVM ไว้สักหน่อย เพราะเห็นเด็กๆ ในแล็บหลายๆ คน ยังไม่ค่อยเข้าใจ SVM กันสักเท่าไหร่ จะทำสไลด์ให้ดีๆ ก็ต้องมีรูปประกอบ แต่เนื่องจากมีเป็นรูปที่เกี่ยวกับพวกสมการเชิงเส้น และเวคเตอร์ต่างๆ ก็เลยกะจะใช้ PGF ซึ่งเป็นคลาสบน LaTeX สำหรับเขียนคำสั่งวาดเส้นต่างๆ ลักษณะก็คล้ายๆ กับ PStricks และ MetaPost แต่ PGF มีข้อดีอยู่ตรงที่สนับสนุน  pdfLaTeX โดยตรง ทำให้สร้างผลงานเป็น pdf ได้ง่ายกว่าอย่างอื่น อีกอย่าง PGF เป็นคลาสพื้นฐานของ Beamer ที่เอาไว้ทำสไลด์บน LaTeX  อีกด้วย เพราะเขียนด้วยอาจารย์เยอรมันคนเดียวกัน การวาดรูปด้วยคำสั่งแบบนี้มีข้อดีอยู่ที่เราสามารถกำหนดตำแหน่งต่างๆ ได้จริง ได้รูปตามที่เป็นเรขาคณิต แต่ก็มีข้อเสียที่บางครั้งอาจจะต้องใช้การคำนวณด้วย เช่น บางทีอยากได้จุดตัดระหว่างสองเส้น ก็ต้องไปคิดก่อนว่ามันตัดกันตรงไหน แต่ PGF มีจุดเด่นที่สามารถคำนวณค่าต่างๆ พวกนี้ให้ได้ด้วย เช่น

\begin{tikzpicture}
\draw[help lines] (0,0) grid (4,4);
\coordinate (a) at (0,0);
\coordinate (b) at (4,4);
\coordinate (c) at (0,4);
\coordinate (d) at (4,1);
\begin{scope}[blue, thick]
\draw (a) -- (b);
\draw (c) -- (d);
\end{scope}
\fill[red] (intersection of a--b and c--d) circle (3pt);
\end{tikzpicture}
PGF Sample

จะได้รูปเส้นตรง 2 เส้นตัดกัน ก็จุดตัดทำเป็นวงกลมที่แดงไว้ ตำแหน่งจุดตัดนี้ก็หาได้โดยใช้คำสั่งแค่ intersection of a--b and c--d ทำให้ทำงานต่างๆ ได้ง่ายขึ้น เขียนไปเขียนมากลายเป็นเรื่องวิธีใช้ PGF ได้ซะแล้ว แต่จริงๆ ต้องการจะบอกว่าเขาออก PGF เวอร์ชันใหม่ คือ 2.00 แล้วมีฟีเจอร์ใหม่ๆ เพิ่มขึ้นเยอะ ว่าแล้วก็จบลงอย่างห้วนๆ ไว้ ณ ที่นี้

PGF Sample

latex ,

แบ่งคอลัมน์ใน LaTeX

July 10th, 2007

เอกสารแบบปกติใน LaTeX จะไม่มีการแบ่งคอลัมน์ ข้อความทั้งหมดจะถูกจัดไว้ในคอลัมน์เดียว แต่ถ้าก็ต้องให้เอกสารมี 2 คอลัมน์ ก็ทำได้โดยกำหนด option “twocolumn” ลงไปใน documentclass เช่น

\documentclass[twocolumn]{article}

เอกสารก็จะถูกจัดให้กลายเป็น 2 คอลัมน์ แต่บางครั้งเราก็ต้องการกำหนดให้บางส่วนเป็นคอลัมน์เดียวด้วย เช่น ตอนเริ่มเอกสารใช้คอลัมน์เดียวก่อน แล้วค่อยเปลี่ยนเป็น 2 คอลัมน์ทีหลัง จะระบุอย่างนี้ได้โดยใช้คำสั่ง \onecolumn และ \twocolumn โดยใช้เป็นสวิทช์สำหรับเปลี่ยนลักษณะการจัดเอกสาร ข้อความตั้งแต่บรรทัดที่ใช้ \onecolumn เป็นต้นไปจะถูกจัดเป็นคอลัมน์เดียว ถ้าจะเปลี่ยนให้เป็นสองคอลัมน์ก็ใช้ \twocolumn

นอกจากนี้ถ้าต้องการให้มีเส้นคั่นระหว่างคอลัมน์ ก็ให้ไปกำหนดความหนาของเส้นคั่นที่ \columnseprule เช่น

\setlength{\columnseprule}{0.4pt}

และถ้าต้องการจัดเอกสารให้มีมากกว่า 2 คอลัมน์ เห็นเขาว่าต้องใช้แพคเกจชื่อ multicol

latex