วันอังคารที่ 31 สิงหาคม พ.ศ. 2553

การเขียนบันทึกข้อความ (หนังสือราชการภายใน) โดยใช้ Latex (เพิ่มเติม)

คราวที่แล้วเขียนคลาสขึ้นมา (อันที่จริงก็เรียกแพคเกจหลายแพคเกจมาช่วย) สำหรับบันทึกข้อความ พบข้อบกพร่องดังนี้
  1. ผมใช้คำสั่ง \tabular สำหรับส่วนหัวของบันทึกข้อความ ทำให้หาก "เรื่อง" หรือ "เรียน" ซึ่งอยู่คอลัมน์ที่หนึ่งมีความยาวมาก เบอร์โทรศัพท์ของหน่วยงาน และวันที่ จะตกขอบขวา เพราะมันอยู่คอลัมน์ที่สองทั้งคู่
  2. คราวที่แล้ว ผมลืมสร้างคำสั่งสำหรับเขียนคำลงท้ายลงตำแหน่งที่เหมาะสม เช่น ด้วยความนับถือ เป็นต้น
  3. การทำบันทึกข้อความข้ามหน่วยงานภายในที่ถูกต้อง จะต้องให้หัวหน้าหน่วยงานรับทราบด้วยทุกครั้ง โดยการ เรียน [ใครก็แล้วแต่ที่อยู่นอกหน่วยงาน] ผ่าน [หัวหน้าหน่วยงานของท่าน] ซึ่งหัวหน้าหน่วยงานจะต้องลงนามรับทราบด้วย ในคลาสเดิมมันไม่มีคำสั่งสำหรับการนี้
ปัญหาที่ส่วนหัวของจดหมาย
ปัญหาแรก แก้ได้โดยใช้แพคแกจ multirow ซึ่งเรียกใช้โดยเพิ่ม
 \RequirePackage{multirow}
เข้าไปในคลาส แล้วแก้ไขคำสั่ง \opening เป็น
\newcommand{\openning}{%
\noindent \parbox{0.2\textwidth}{\raggedright{\includegraphics[width=20mm]{Tra-Khrut.eps}}} \hfill {\Large\bf บันทึกข้อความ} \hfill \parbox{0.2\textwidth}{\qquad}
\begin{tabular}{@{}ll}
{\bfส่วนราชการ} \@officeunit & {\bf โทร.} \@telephonenum \\
{\bfที่} \@unitid / \@memoreg & \@date \\
\multicolumn{2}{@{}l}{{\bfเรื่อง} \@title} \\
\multicolumn{2}{@{}l}{{\bfเรียน} \@letterto}
\end{tabular} % เว้นหนึ่งบรรทัดข้างล่างนี้ห้ามลบ

}
โปรดสังเกตคำสั่ง \multicolumn{2}{@{}l}{ข้อความที่จะใส่ในตาราง} ที่บรรทัดที่ 4 และ 5 จากบรรทัดสุดท้าย เลข 2 หมายถึงข้อความนี้อยู่ใน 2 คอลัมน์ พารามิเตอร์ {@{}l} หมายถึงชิดซ้ายโดยไม่เว้นขอบตาราง

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

ปัญหาเรื่องคำลงท้าย
ก็เพิ่มคำสั่งเข้ามาเลย เหมือนคำสั่งอื่น ๆ คือสร้างคำสั่งเพื่อรับคำลงท้ายจากเอกสาร tex เข้ามา
\newcommand*{\closingphrase}[1]{\def\@closingphrase{#1}}
แล้วก็กำหนดตำแหน่งให้เขียนในตำแหน่งที่ตรงกับการลงนามท้ายหนังสือ
\newcommand{\closing}{%
\vskip 0.5em
\parbox{0.3\textwidth}{\qquad}\parbox{0.7\textwidth}{\centering \@closingphrase}
}
ในอนาคต อาจเก็บตัวเลข 0.3 0.7 ที่เห็นข้างบนนี้ เป็นตัวแปร แล้วกำหนดค่าตัวแปรทีเดียวที่ต้นคลาสเลยก็น่าจะทำได้



ปัญหาที่การลงนามของหัวหน้าหน่วยงาน
เพิ่มคำสั่งเพื่อรับชื่อและตำแหน่งของหัวหน้าหน่วยงานโดย
\newcommand*{\approvalperson}[1]{\def\@approvalperson{#1}}
แล้วนำไปเขียนใต้ชื่อผู้ลงนามเอกสาร ให้ตำแหน่งตรงกันกับผู้ลงนาม เหมือนกับคำลงท้าย
\newcommand{\approvalsigned}{%
\vskip 3em
\parbox{0.3\textwidth}{\qquad}\parbox{0.7\textwidth}{\centering \@approvalperson}
}
ในส่วนของหัวหน้าหน่วยงานนี้เป็นตัวเลือก ถ้าไม่เรียกคำสั่ง \approvalsigned ก็ไม่มีอะไรเกิดขึ้น

ท่านสามารถดาวน์โหลดแฟ้มข้อมูลของคลาสที่ปรับปรุงแล้ว พร้อมตัวอย่างการใช้งาน ได้จากห้องทำงานของผมครับ

วันเสาร์ที่ 14 สิงหาคม พ.ศ. 2553

การเขียนบันทึกข้อความ (หนังสือราชการภายใน) โดยใช้ Latex

จากเดิมที่เคยทดลองใช้ fig2sty ไปเมื่อคราวก่อน พบว่าอาจเป็นปัญหาสำหรับคนที่ไม่ได้ใช้ xfig เป็นปรกติ (และอันที่จริง ก็ยังทำในส่วนของการลงนามไม่เสร็จด้วย) นอกจากนี้ ด้วยความที่ยังไม่เข้าใจระบบ margin ของเอกสารก็ทำให้ต้องทำ hardcode ในส่วนของการจัดตำแหน่งด้วย ซึ่งไม่น่าจะเป็นวิธีที่ดีเท่าไร

หลังจากได้อ่านเอกสารเกี่ยวกับการเขียน Latex Class ไปเมื่อคราวที่แล้ว เมื่อย้อนกลับมาดูปัญหาเดิม คือการเขียนบันทึกข้อความ (หนังสือภายใน) ก็พบว่าสามารถใช้ความรู้นั้นมาดัดแปลงได้ และแนวทางการแก้ปัญหาก็จะเป็นกรณีทั่วไปมากกว่า โดยเฉพาะไม่ต้องมีการลง hardcode ในเรื่องของตำแหน่งข้อความ (มากนัก)

สิ่งที่ต้องใช้ก็มี
  • การกำหนดตำแหน่งของส่วนหัวของบันทึกข้อความ ทำได้โดยคำสั่ง \parbox
  • การรับค่าต่าง ๆ เช่น เรื่อง เรียน ฯลฯ จากบันทึกข้อความมาสร้างส่วนหัว ทำได้โดยการสร้างคำสั่งใหม่
  • การใส่ภาพครุฑลงในเอกสาร ทำได้โดยใช้แพคเกจ graphicx
  • หากไม่ได้กำหนดไว้เป็นอย่างอื่น ให้ใช้ค่าปริยายของคลาส article ทั้งหมด
ทำให้ได้แฟ้มคลาสดังต่อไปนี้
%----------------------------------------
% officialmemoth.cls
% Official Internal Memo
% 2010-Aug-14 Kittiphong Meesawat ktphong (at) elec.kku.ac.th

% --- Class structure: identification part
% ---
\NeedsTeXFormat{LaTeX2e}
\ProvidesClass{officialmemoth}[2010/08/14 version 0.1 Official Internal Memo]

% Package ที่เรียกใช้งาน
\LoadClass[12pt,a4paper]{article}
\RequirePackage[left=25mm,right=25mm,top=25mm,bottom=25mm]{geometry}
\RequirePackage{graphicx}

% ตั้งค่า ย่อหน้า (Indent) ค่าขึ้นย่อหน้าใหม่ (Indentskip) และไม่ให้มีเลขหน้า (pagestyle)
\setlength{\parindent}{3em}
\setlength{\parskip}{1.5em}
\pagestyle{empty}

% คำสั่งเพื่อรับค่าต่าง ๆ ของบันทึกข้อความ
\newcommand*{\officeunit}[1]{\def\@officeunit{#1}}
\newcommand*{\unitid}[1]{\def\@unitid{#1}}
\newcommand*{\telephonenum}[1]{\def\@telephonenum{#1}}
\newcommand*{\memoreg}[1]{\def\@memoreg{#1}}
\newcommand*{\letterto}[1]{\def\@letterto{#1}}

% คำสั่ง \openning เพื่อสร้างส่วนหัวของบันทึกข้อความ
% ตำแหน่งต่าง ๆ เปลี่ยนแปลงได้ ถ้าทราบว่ามีข้อกำหนดตายตัวไว้อย่างไร
\newcommand{\openning}{%
\noindent \parbox{0.2\textwidth}{\raggedright{\includegraphics[width=20mm]{Tra-Khrut.eps}}} \hfill {\Large\bf บันทึกข้อความ} \hfill \parbox{0.2\textwidth}{\qquad}
\begin{tabular}{@{}ll}
{\bfส่วนราชการ} \@officeunit & {\bf โทร.} \@telephonenum \\
{\bfที่} \@unitid / \@memoreg & \@date \\
{\bfเรื่อง} \@title & \\
{\bfเรียน} \@letterto &
\end{tabular} % เว้นหนึ่งบรรทัดข้างล่างนี้ห้ามลบ

}

% คำสั่ง \undersigned เพื่อสร้างที่สำหรับเซ็นชื่อของผู้เขียนบันทึกข้อความ
% ตำแหน่งต่าง ๆ เปลี่ยนแปลงได้ ถ้าทราบว่ามีข้อกำหนดตายตัวไว้อย่างไร
\newcommand{\undersigned}{%
\vskip 3em
\parbox{0.3\textwidth}{\qquad}\parbox{0.7\textwidth}{\centering \@author}
}
%----------------------------------------  

เวลาใช้งานในแฟ้มเอกสาร Latex ก็เรียกใช้ class officialmemoth ดังนี้
%----------------------------------------  
\documentclass[12pt,a4paper]{officialmemoth}
\usepackage[thai]{babel}
\usepackage{thswitch}
% ใช้แบบอักษรกินรี ซึ่งเชื่อว่าคล้าย อังศณา มากที่สุด (ทำไมต้องเป็นอังศณาด้วยนะ?)
\usefont{LTH}{kinnari}{m}{n}

% ชื่อเรื่องหนังสือ
% ชื่อหน่วยงาน
% รหัสหน่วยงาน
% หมายเลขโทรศัพท์หน่วยงาน
\title{ทดสอบบันทึกข้อความ}
\officeunit{คณะวิศวกรรมศาสตร์ ภาควิชาวิศวกรรมไฟฟ้า}
\unitid{{\bf ศธ} 0514.4.1.4}
\telephonenum{12142 -- 44 ต่อ 712}

% เลขส่งหนังสือ (ปรกติมักเว้นว่างไว้ นอกเสียจากเราจะทราบเลขแน่นอน)
% วันที่ออกหนังสือ
\memoreg{}
\date{วันที่ 14 สิงหาคม 2553}

% ผู้รับหนังสือ และ
% ผู้เขียนหนังสือ (พร้อมตำแหน่ง โดยขึ้นบรรทัดใหม่ ถ้ามี)
\letterto{หัวหน้าภาควิชาวิศวกรรมไฟฟ้า}
\author{นายกิตติพงษ์ มีสวาสดิ์ \\ อาจารย์ประจำภาควิชาวิศวกรรมไฟฟ้า}

\begin{document}
% คำสั่ง \openning จะทำการสร้างส่วนหัวของบันทึกข้อความขึ้นมา
\openning
ทดสอบหัวกระดาษ ทดสอบหัวกระดาษ ทดสอบย่อหน้าและหัวกระดาษ ทดสอบหัวกระดาษและย่อหน้า ทดสอบย่อหน้า ทดสอบหัวกระดาษ ทดสอบหัวกระดาษ ทดสอบย่อหน้าและหัวกระดาษ ทดสอบหัวกระดาษและย่อหน้า ทดสอบย่อหน้า ทดสอบหัวกระดาษ ทดสอบหัวกระดาษ ทดสอบย่อหน้าและหัวกระดาษ ทดสอบหัวกระดาษและย่อหน้า ทดสอบย่อหน้า

ทดสอบหัวกระดาษ ทดสอบหัวกระดาษ ทดสอบย่อหน้าและหัวกระดาษ ทดสอบหัวกระดาษและย่อหน้า ทดสอบย่อหน้า ทดสอบหัวกระดาษ ทดสอบหัวกระดาษ ทดสอบย่อหน้าและหัวกระดาษ ทดสอบหัวกระดาษและย่อหน้า ทดสอบย่อหน้า ทดสอบหัวกระดาษ ทดสอบหัวกระดาษ ทดสอบย่อหน้าและหัวกระดาษ ทดสอบหัวกระดาษและย่อหน้า ทดสอบย่อหน้า

% คำสั่ง \undersigned จะทำการเขียนชื่อผู้เขียนบันทึก และตำแหน่ง (ถ้ามี)
\undersigned
\end{document}
%----------------------------------------  

และผลที่ได้จะมีหน้าตาแบบนี้ 

สิ่งที่ยังเป็นปัญหาอยู่ มีอยู่ 2 - 3 ประการด้วยกันคือ
  1. ผมไม่ทราบว่าตำแหน่งต่าง ๆ ในส่วนหัวของบันทึกข้อความ มีระบุไว้แน่นอนชัดเจนหรือไม่ เท่าที่เห็นใช้ Word Processor เขียนกัน ก็ใช้ Tab กะ ๆ เอา ตอนนี้เลยใช้ tabular environment ซึ่งทำให้ "วันที่" กับ "โทร." นั้นตรงกัน ถ้าไม่มีข้อเสนอแนะเป็นอย่างอื่น ก็จะคงไว้อย่างนี้
  2. ผมไม่ทราบว่าตำแหน่งของการลงชื่อท้ายบันทึกข้อความ มีระบุไว้แน่นอนชัดเจนหรือไม่ เท่าที่เห็นใช้ Word Processor เขียนกัน ก็ใช้ Tab กะ ๆ เอา ตอนนี้เลยใช้ parbox ช่วยกันพื้นที่ไว้ ถ้าไม่มีข้อเสนอแนะเป็นอย่างอื่น ก็จะคงไว้อย่างนี้
  3. รูปครุฑที่ใช้ เป็นรูปจาก wikipedia ซึ่งมีข้อความอธิบายว่า กฏหมายกำหนดไว้ว่า ตราครุฑ เป็นผลงานอันไม่มีลิขสิทธิ์ เนื่องจากเป็นส่วนประกอบของ ระเบียบ ข้อบังคับ คำสั่ง ฯลฯ ของราชการ แต่ถ้าผมทราบว่าใครเป็นผู้สร้างรูปนี้ขึ้นมาก็คงจะดีกว่านี้
  4. ในระบบของผม (ใช้ debain/lenny) อยู่ ไม่สามารถใช้ latex กับ UTF8 ได้ ดังนั้นแฟ้มทั้งหมดที่สร้างขึ้นนี้ จึงเป็น TIS-620 ทั้งหมด แต่สำหรับท่านที่ต้องการนำไปใช้ หากคัดลอกจากเว็บ ก็สามารถใช้ UTF8 ได้ทันทีโดยเติม \usepackage[utf8]{inputenc} ไว้ที่ส่วน preemble ของเอกสาร ก็น่าจะได้
  5. ในระบบของผม ไม่สามารถใช้คำสั่ง \includegraphics กับ GIF ต้นฉบับได้ (ยังหาสาเหตุไม่ได้) จึงต้องแปลง GIF เป็น EPS แทน ซึ่งการทำเช่นนี้มีจุดอ่อนคือ อาจใช้กับ pdflatex ซึ่งเป็นเครื่องมือหลักของ latex ในวินโดว์ ไม่ได้
  6. คนบางคนในหน่วยราชการบางหน่วย อาจไม่เข้าใจเรื่องแบบอักษร ทำให้ยึดติดอยู่กับแบบอักษรตระกูล Angsana หรือ Browallia หรืออื่น ๆ อันเป็นผลงานที่มีลิขสิทธิ์และมีราคา ไม่มีใช้ในระบบโอเพนซอร์ส และไม่ยอมรับแบบอักษรที่ทางรัฐบาลเป็นผู้สนับสนุนให้สร้างเอง เช่น กินรี นรสีห์ และอื่น ๆ ถ้าเป็นเช่นนี้ก็ช่วยไม่ได้จริง ๆ คงต้องทำใจอย่างเดียว
หลังจากนี้จะรอรับคำชี้แนะเพื่อแก้ไขและปรับปรุงสัก 1 - 2 สัปดาห์ เมื่อแก้ไขและปรับปรุงแล้วจะนำแฟ้มเอกสารต่าง ๆ มาเผยแพร่ต่อไปครับ

วันศุกร์ที่ 13 สิงหาคม พ.ศ. 2553

ประสบการณ์การสร้าง Template ของ Latex สำหรับการเขียนบทความวิจัย

จากที่เป็นเพียงผู้ใช้ Latex มานาน ในที่สุดผมก็มีความต้องการออกแบบเอกสารใหม่มากเพียงพอที่จะก้าวข้ามระดับ "ขั้นต้น" ไปสู่ "ขั้นกลาง" ซึ่งก็คือการทำ Customize Latex และการสร้าง Class ไฟล์ ที่ผมใฝ่ฝันที่จะทำให้ได้มานานแล้วนั่นเอง

สำหรับท่านที่ยังไม่ทราบขออธิบายตามความเข้าใจของผมเองสักนิดว่า Class File (xxx.cls) คืออะไร ในระดับที่ผมเข้าใจ Class File คือไฟล์ที่กำหนดพฤติกรรมของคำสั่งต่าง ๆ ของ Latex พฤติกรรมเหล่านี้อาจรวมถึง ขนาดกระดาษ กั้นหน้า กั้นหลัง แบบอักษร ฯลฯ หลายคนก็เรียก Class File ที่ทำหน้าที่เหล่านี้ว่า Template (แต่ผมคิดว่าไม่ใช่ชื่ออย่างเป็นทางการในวงการ Latex)

บางคนก็อาจสงสัยว่า ที่ผมว่าผมใฝ่ฝันที่จะทำเป็นมานานนั้น ทำไมมันนานนัก? มันยากนักรึ? คำตอบคือมันก็ไม่ยาก แต่มันก็ไม่ง่ายครับ แต่ที่ทำไม่ได้สักทีเพราะ
  • แต่เดิมนั้นผมยึดติดกับ Syntax ของ Latex มากเกินไป พอมี Syntax แปลก ๆ เราก็ปิดกั้นสมองเลย ไม่พยายามทำความเข้าใจ
  • อันที่จริงมันก็ไม่ยากมาก แต่ผมไม่อ่านรายละเอียดที่เขามีให้อ่าน เอาแต่อ่านผ่าน ๆ หวังจะเจอ Quick Solution ตอนนี้เริ่มเข้าใจแล้วว่าโลกนี้ไม่ใช่มาม่า ไวไว ไม่มีอะไรง่ายกว่าที่มันควรจะเป็น
ตอนนี้มีความต้องการสร้าง Class File มาก ก็เลยไม่เสียเวลาหา Quick Solution แล้วลุยตามคำแนะนำในอินเตอร์เนตเลย จากการค้นดูพบเอกสารที่สำคัญ 3 รายการด้วยกันคือ
บทความที่ควรอ่านก่อนสำหรับผมก็คือบทความแรก บทความนี้นำเสนอแนวคิดว่า Latex มีคนเขียน Package ต่าง ๆ เยอะแล้ว ถ้าต้องการปรับแต่งเอกสาร ทำผ่าน Package พวกนี้โดยไม่ต้องไปเขียน Code หน้าตาแปลก ๆ ก็ได้ เพราะงานส่วนใหญ่ที่เราอยากทำนั้น เราไม่ใช่คนแรกแน่ ๆ เช่นการตั้งกั้นหน้า กั้นหลัง มันต้องมีคนเขียนโปรแกรมเพื่อจัดการงานเหล่านี้ไว้แล้ว สิ่งที่เราต้องทำก็คือ รู้ให้ชัดว่าเราต้องการอะไร แล้วก็หาโปรแกรม (Package) ที่สอดคล้องกับความต้องการของเรามาใช้งาน

บทความที่สองจะช่วยเวลาเราไม่รู้ว่าคำสั่งนี้ทำงานอย่างไร บทความที่สองจะมี Code ที่สำคัญของ Class article ให้อ่านพร้อมอธิบายผลของมัน ทำให้เข้าใจกลไกการทำงานของ Class มากขึ้น

บทความที่สาม อืม...อันที่จริง ผมยังไม่ค่อยได้อ่านบทความที่สามนี้เท่าไรนะ

เอกสารอีกฉบับเป็นหนังสือเลยคือ The LaTeX Companion
หากไม่มีอธิบายในเอกสาร 3 ฉบับข้างต้น ผมจะมาไล่ดูใน Index ของหนังสือเล่มนี้ (แน่ะ! Quick Solution อีกแล้ว - แหมหนังสือมันหนาตั้ง 1090 หน้าเชียวนะครับ)

ตอนนี้ผมต้องการสร้าง Class File สำหรับการเขียนบทความวิจัยสำหรับการประชุมวิชาการทางวิศวกรรมไฟฟ้า (Electrical Engineering Conference - EECON) สิ่งที่ต้องทำจึงประกอบด้วย
  1. เรียกใช้ Class proc ซึ่งมีอยู่แล้ว จากนั้นจึงปรับแก้พารามิเตอร์ต่าง ๆ
  2. ตั้งค่าขอบกระดาษ ทำได้โดยใช้ Package geometry
  3. ตั้งค่าแบบอักษรเป็นแบบ Times Roman ทำได้โดยใช้ Package mathptmx
  4. ตั้งค่าระยะห่างระหว่างชื่อบทความกับชื่อผู้แต่ง ทำได้โดยใช้คำสั่ง renewcommand กับ maketitle
  5. ตั้งค่าระยะห่างระหว่างชื่อผู้แต่งกับเนื้อบทความ ทำได้โดยใช้คำสั่ง renewcommand กับ maketitle
  6. สร้างคำสั่งที่จะผูกชื่อผู้แต่งกับสถาบันไว้ด้วยกัน
  7. สร้างคำสั่งที่จะบังชื่อผู้แต่งกับสถาบัน สำหรับฉบับที่จะส่งให้ Reviewer อ่าน
  8. สร้างคำสั่ง Keyword
  9. ตั้งค่าระยะห่างระหว่าง หมายเลขหัวข้อกับชื่อหัวข้อ ทำได้โดยใช้ Package titlesec
  10. ทำให้ย่อหน้าแรกหลังจากหัวข้อ มีย่อหน้า (Indent) ทำได้โดยใช้ Package indentfirst
  11. จัดการกับระบบอ้างอิง
  12. สร้างคำสั่งเติมรูปและประวัติผู้เขียน
ตอนนี้ทำส่วนที่ง่ายเสร็จไปบางส่วนแล้ว หากทำได้ทั้งหมดก็จะนำมาแบ่งปันประสบการณ์กันต่อไปครับ

สิ่งที่ได้มาจากการ "ลงมือทำ" ก็คือ คำสั่งที่เคยดูแปลกตาเมื่อสมัยก่อน ตอนนี้ผมก็เริ่มรู้สึกคุ้น ๆ กับมันมากขึ้น และเริ่ม "อ่านออก" หลายคำสั่งแล้ว

หากสามารถสร้าง Class File สำหรับ EECON ภาษาอังกฤษได้ ต่อไปจะพยายามทำ Class File สำหรับ EECON ภาษาไทยดู อันนี้ดูจะยากกว่าทั้งในเรื่องต้องมี Title 2 หัว คือทั้งภาษาไทยและภาษาอังกฤษ ต้องมีทั้งบทคัดย่อภาษาไทย และ Abstract ภาษาอังกฤษ ต้องจัดการระบบอ้างอิงเอกสารภาษาไทยปนกับภาษาอังกฤษด้วย ก็จะค่อย ๆ ลองทำไป ใครมีคำแนะนำอะไรก็ยินดีเรียนรู้และขอขอบคุณล่วงหน้าครับ