วันอังคารที่ 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 ภาษาอังกฤษ ต้องจัดการระบบอ้างอิงเอกสารภาษาไทยปนกับภาษาอังกฤษด้วย ก็จะค่อย ๆ ลองทำไป ใครมีคำแนะนำอะไรก็ยินดีเรียนรู้และขอขอบคุณล่วงหน้าครับ

วันพฤหัสบดีที่ 3 มิถุนายน พ.ศ. 2553

ใช้ Latex เขียนหนังสือราชการ

ผมใช้ Latex มานาน แต่ก็มีความเชี่ยวชาญ Latex เพียงระดับธรรมดา คืออ่านคู่มือออก ใช้งานได้ แต่ไม่เก่งกาจถึงขนาดออกแบบเอกสารเองได้ ใช้เป็นเพียงคลาสหรือแพคเกจที่มีคนออกแบบไว้ให้แล้วเท่านั้น ดังนั้นปัจจุบันจึงใช้ Latex เขียนเพียงเอกสารประกอบการสอนโดยใช้แพคเกจ Beamer ช่วย (และใช้สไตล์และธีมสำเร็จรูปที่มากับแพคเกจ)

แต่ผมก็หงุดหงิดกับการใช้ Open Office ในการเขียนหนังสือราชการเพราะเราใช้ Open Office ไม่คล่อง ควบคุมตำแหน่งจำพวกกั้นหน้า แท็ป ย่อหน้า ไม่ใคร่จะได้

ก็นึกได้ว่าเคยเห็นแพคเกจหนึ่งในรายชื่อแพคเกจของ Synaptic คือ fig2sty ซึ่งมีคำอธิบายว่าเป็นโปรแกรมช่วยออกแบบเอกสารสำหรับ Latex ด้วย xfig จึงลองอ่าน man page ดู พบว่าใช้งานง่าย จึงทดลองใช้ fig2sty ช่วยออกแบบหนังสือราชการดู

การใช้งาน fig2sty มีหลักการง่าย ๆ ก็คือ
  1. สร้าง Layout ของเอกสารด้วย xfig โดยสร้างเป็นแฟ้มรูปภาพ fig โดยตำแหน่งต่าง ๆ ระบุด้วยกรอบสี่เหลี่ยม
  2. ในแทรกแท็กข้อความ (อ่านความหมายของพารามิเตอร์ข้อความจาก man page) เช่นชื่อ type ของข้อความในตำแหน่งนั้น ๆ
  3. เรียกใช้คำสั่ง > fig2sty yourlayout.fig ท่านจะได้แฟ้ม yourlayout.sty มา
  4. เขียนแฟ้ม tex โดยเรียกใช้แฟ้ม sty ในแฟ้มนี้
  5. เรียกใช้คำสั่งของ Latex ตามขั้นตอนปกติ
สร้าง Layout ด้วย xfig และแท็กต่าง ๆ


การเรียกใช้แฟ้ม sty จากแฟ้ม tex

\documentclass{article}
\usepackage[thai]{babel}
\usepackage{figtosty} <----- เรียกใช้แพคเกจนี้
\usepackage{yourlayout} <--- เรียกใช้ yourlayout แล้วแต่ว่าตั้งชื่อไว้ว่าอย่างไร

\begin{document}
\begin{officialmemo}
\begin{figframe}{header}  <--- ชื่อแท็กตาม Layout ที่ออกแบบ

\begin{center} 
{\Large {\bf บันทึกข้อความ}} <--- หัวกระดาษ
\end{center} 
\end{figframe} 

\begin{figframe}{headtag} <--- ชื่อแท็กตาม Layput ที่ออกแบบ
\noindent {\bf ส่วนราชการ} คณะ... ภาควิชา... \\ 
ที่ ศธ xxxx.x.x/xxxx \\            \
{\bf เรื่อง} ขอความอนุเคราะห์      |
\\ {\bf เรียน} หัวหน้าฝ่าย         |
\\ \indent {\bf โทร} xxxxx, xxxxx  >--- รูปแบบส่วนหัวของหนังสือราชการที่ผมใช้
\\ วันที่ 2 มิถุนายน 2553\\        |
\\                                 |
\\                                 /
\end{figframe} 

\begin{figframe}{body} 
\indent เนื่องด้วยอะไรสักอย่าง...  <--- เนื้อความ

\hspace*{8cm}ด้วยความนับถือ \\     <--- คำลงท้ายหนังสือ
\\ 
\\ 
\hspace*{9cm}อาจารย์นั่งฟัง ตั้งใจสอน 
\\ 
\hspace*{9cm}อาจารย์ประจำภาควิชาฯ 
\end{figframe} 
\end{officialmemo} 
\end{document}

ในโค้ด Latex ผมละส่วนที่เกี่ยวกับการจัดกั้นหน้า กั้นหลังไว้ เนื่องจากไม่แน่ใจว่าหากไปทดลองที่เครื่องอื่นแล้วจะได้ผลแน่นอนเหมือนกันหรือไม่

ผลลัพธ์ที่ทดลองได้
ปัญหาที่พบ
หากไม่ตั้งค่ากั้นหน้า กั้นหลัง และออฟเซ็ตต่าง ๆ เอกสารจะกินขวา ผมแก้โดย preemble นี้

\pagestyle{empty}
\setlength{\hoffset}{0pt}
\setlength{\marginparwidth}{0pt}
\setlength{\oddsidemargin}{0pt}
\setlength{\textwidth}{17cm}

\setlength{\voffset}{0pt}
\setlength{\topmargin}{0pt}
\setlength{\headheight}{0pt}
\setlength{\headsep}{0pt}


ปัญหาถัดมาคือตัวหนังสือที่คอลัมน์ซ้ายกับคอลัมน์ขวาของส่วนหัว (เรื่อง เรียน ฯลฯ) ไม่ตรงบรรทัดกัน ผมแก้แบบถึก ๆ โดยเติมแท็ก offset ลงในกรอบขวา ค่อย ๆ ปรับจนตรงกัน

ปัญหาสุดท้าย คือส่วนคำลงท้าย เราควบคุมตำแหน่งได้แน่นอนก็จริง แต่ถ้ามีการเปลี่ยนแปลงข้อความ ก็จะต้องมาตั้งค่าตรงนี้กันใหม่อีก ผมยังแก้ไม่ได้ แต่คิดว่าน่าจะใช้คำสั่ง box ของ Latex ช่วยได้ เอาไว้ลองแล้วจะมารายงานผลต่อไปครับ

เรื่องตลกที่สุดของงานนี้ก็คือ แฟนผมมาเห็นเข้าว่าผมกำลังทำอะไรอยู่ พออธิบายให้ฟัง เธอก็แซวว่า
"ถ้าเป็นเรานะ เราคงใช้ Latex ทำในสิ่งที่ Word ทำไม่ได้ ถ้าทำแค่นี้เราใช้ Word เร็วกว่า"
คิดไปคิดมา เออนะ มันก็จริงของเขา แต่เอาเถอะ ผมว่าผมทำ Layout ไว้อย่างนี้ สบายกว่าที่จะไปหงุดหงิดกับกั้นหน้ากั้นหลังอะไรนั่นของ Open Office อยู่บ้างหรอก

วันพฤหัสบดีที่ 27 พฤษภาคม พ.ศ. 2553

การเขียนสมการในเว๊บและในบล๊อก

การเขียนสมการในบล๊อกหรือในเว๊บโดยทั่วไป (HTML) นั้น ทำไม่ได้เลย (หรือได้?) เมื่อมหาวิทยาลัยมีนโยบายให้ผู้สอนจัดสร้างสื่อ e-Learning สำหรับนักศึกษา เราก็อยากจะจัดทำเว๊บหรือเขียนบล๊อกที่บรรยายเนื้อหาที่สอน

แต่เนื้อหาที่สอนไม่มีทางหลีกเลี่ยงสมการได้ เราจะเขียนสมการลงในเว๊บหรือบล๊อกของเราอย่างไร? โชคดีที่มีคนคิดแก้ปัญหานี้ไว้แล้วครับ นั่นก็คือจาวาสคริปต์เพื่อการสร้างสมการโดยแปลงรหัสสมการให้เป็นภาพแบบ svg สคริปต์ดังกล่าวก็คือ ASCIIMathML.js สคริปต์ดังกล่าวนี้เขียนขึ้นและดูแลโดยนาย Peter Jibsen จากมหาวิทยาลัย Chapman University ครับ

วิธีใช้ก็ง่ายมาก (สำหรับเว๊บที่คุณมีอำนาจเต็ม) นั่นก็คือ
    • ดาวน์โหลดสคริปต์ดังกล่าวจาก ASCIIMathML 
    • อัพโหลดสคริปต์นันไปที่โฮสต์ของเว๊บไซต์ของคุณ เลือกไดเร็คตอรีได้ตามใจตราบใดที่ยังเป็นไดเร็คตอรีที่เข้าถึงได้ทาง www สมมติว่าเป็น webroot/ASCIIMathML.js ก็ได้ (เมื่อ webroot หมายถึงตำแหน่งรากของเว๊บของคุณ ไม่ใช่ตำแหน่ง root ของระบบ)
    • เติมแท็กสคริปต์ลงในส่วนหัวของไฟล์ HTML ของหน้าเว๊บที่ต้องการแสดงสมการดังต่อไปนี้
    <script> type="text/javascript" src="ASCIIMathML.js" </script>
    ลงในระหว่างแท็ก <head> ... </head> ในแฟ้ม HTML นั้น ๆ ซึ่งส่วนนี้อาจอยู่ในแม่แบบของเว๊บ หรือจะเป็น HTML โดยตรงก็ได้ แล้วแต่เว๊บของท่าน
    •  ในส่วนเนื้อความ ท่านก็สามารถเขียนสมการโดยใช้รหัสที่มีความคล้ายคลึงกันกับ LaTeX (เป็นส่วนใหญ่) ได้ โดยให้ครอบรหัสของสมการด้วย a``math ... enda``math
      เช่น a``math x^{2}=\frac{1}{y} enda``math จะให้ผลเป็น amath x^{2}=\frac{1}{y} endamath
    สำหรับกรณีการการเขียนสมการลงบล๊อก (เฉพาะที่รู้จักคือ blogger.com เท่านั้น) จะยุ่งนิดหน่อยเนื่องจาก
    1. หาทางแทรกแท็ก <script>...</script> เข้าไปใน Blog และ
    2. ต้องหาที่สำหรับเป็นโฮสของจาวาสคริปต์อันนี้ 
    ปัญหาแรกนั้นมีทางทำได้ไม่ยาก ให้ไปที่เมนูรูปแบบ (Template) ของบล๊อกของคุณ และแก้ไขแม่แบบแบบ HTML ดังรูป การแทรกโค้ดให้แทรกในแท็กส่วนหัว (Head) ซึ่งในนั้นจะมีโค้ดอื่น ๆ อีกเยอะ ก็เลือกแทรกตรงใกล้ ๆ กับท้าย ๆ แท็กก็ได้ครับ


    ส่วนปัญหาที่สอง เนื่องจากผมไม่สามารถอัพโหลดสคริปต์ตัวนี้ เข้าไปไว้ใน Blogger ได้ ทางออกก็คือหาเว๊บอื่นสำหรับใช้เป็นโฮสของสคริปต์ตัวนี้ และให้เรียกสคริปต์ตัวนี้จากโฮสดังกล่าวในแท็ก
    <script> type="text/javascript" src="http://www.yourhost.com/ASCIIMathML.js" </script>
     ในส่วนหัว (<head>...</head>) ของแฟ้ม HTML ของคุณ สังเกตว่า src ของสคริปต์กลายเป็น URL ของเว๊บที่ใช้โฮสแล้ว ปัญหาคือผมไม่มีโฮสแบบนั้นเป็นของตัวเองนี่สิ ผมมีแต่ Google Site จะทำยังไงดี?

    ทางออกง่ายอย่างคิดไม่ถึงครับ คำแนะนำอันนี้ผมพบที่ SOSwitch Blog ซึ่งขั้นตอนมีดังนี้ครับ (อนุมานว่ามีบัญชี Google Site และเปิดไซต์แล้วนะครับ)
    • ดาวน์โหลดสคริปต์มาไว้ที่เครื่องตนเองก่อน
    • เปลี่ยนนามสกุลแฟ้มเป็น txt เสีย
    • ไปที่ไซต์ของตนเองใน Google Site 
    • สร้างหน้าเว๊บใหม่ขึ้นมาโดยใช้แม่แบบตู้เอกสาร (File Cabinet) หรือถ้ามีอยู่แล้วและใช้รวมกันได้ก็ไม่ต้องสร้างใหม่ ข้ามขั้นตอนนี้ไปเลย
    • อัพโหลดแฟ้มสคริปต์ที่เปลี่ยนนามสกุลแล้วขึ้นไป
    • คัดลอกลิงก์ที่ชี้มาที่แฟ้มนี้ในตู้เอกสาร เอาเฉพาะ URL ส่วนขยายอื่น ๆ เช่น ?attredirects=0&d=1 ก็ตัดทิ้งไป ลิงก์ที่คัดลอกมานี้แหละครับ นำไปใช้ที่ scr ในแท็ก <script> ข้างบน
    เมื่อเสร็จแล้ว ก็สามารถสนุกสนานกับการเขียนสมการเพื่อประกอบการสอนได้ดังนี้
    amath P_{3}^{0}=A_{0}(x-x_{0})^{3}+B_{0}(x-x_{0})^{2}+C_{0}(x-x_{0})+D_{0} endamath
    อยากเขียนเท่าไรก็เขียนไป เขียนกันให้สะใจไปเลย!

    วันอาทิตย์ที่ 9 พฤษภาคม พ.ศ. 2553

    การออกแบบวงจรโดยใช้โปรแกรม Opensource ตอนที่ 2/3

    หลังจากที่ได้ทดลอง KiCad ทำงานง่าย ๆ แล้ว ก็ถึงเวลาทดลองใช้ KiCad แบบจริงจัง คือมีชิ้นงานเป็นผลลัพธ์สุดท้ายได้ ความตั้งใจก็คือใช้ Opensouce โปรแกรม ในการออกแบบตั้งแต่ ลายวงจร (Schematic) จำลองวงจร (Simulation) ออกแบบแผ่นวงจรพิมพ์ และประกอบวงจรจริง ๆ โดยตั้งใจว่าจะแบ่งทำเป็น 3 ตอนคือ
    ตอนที่ 2 ออกแบบแผ่นวงจรพิมพ์โดยใช้ KiCad
    จากลายวงจรและการจำลองวงจรในตอนที่ 1 ในการทำงานจริงเราควรต่อวงจรลงบนโปรโตบอร์ดเพื่อให้มั่นใจเสียก่อนว่าวงจรทำงานได้จริง แต่เนื่องจากวงจรที่กำลังออกแบบอยู่นี้เป็นวงจรแบบง่าย จึงละไว้

    เมื่อจะออกแบบแผ่นวงจรพิมพ์ ก็มี 2 - 3 ประเด็นที่ทำให้ต้องไปปรับปรุงแก้ไขวงจรในตอนที่ 1 เสียใหม่ คือ
    • แม้ว่าในอุดมคติ วงจรนี้จะมีศักยภาพที่จะขับกำลังได้ถึง 1.5 วัตต์ ที่โหลด 8 โอห์ม แต่เมื่อทดสอบโดยการจำลองวงจรแล้ว พบว่ากำลังสูงสุดที่จ่ายได้คือ 0.25 วัตต์ ไม่ใช่ 0.5 วัตต์ ซึ่งถือว่าน้อย ปัญหาอาจเกิดจากการตั้งจุดไบแอสของทรานซิสเตอร์แต่ละตัว หรืออาจเกิดจากข้อจำกัดของตัวทรานซิสเตอร์ที่เลือกใช้ อาจปรับปรุงได้ในอนาคต
    • วงจรในตอนที่ 1 ไม่มีแหล่งจ่ายไฟ ก็เติมส่วนของแหล่งจ่ายไฟตรงแบบง่าย ๆ โดยใช้ไอซีเรกกูเลเตอร์เบอร์ยอดนิยม 7812 เนื่องจากกำลังสูงสุดที่จะขับได้ที่โหลด 8 โอหม์ คือ 0.25 วัตต์ หมายความว่ากระแสสูงสุดคือ 0.25 แอมแปร์ ไอซีขนาด 1 แอมแปร์ก็เกินพอ
    • วงจรในตอนที่ 1 มีช่องสัญญาณเดียว หากตั้งใจจะใช้กับเครื่องเล่น MP3 ก็ควรทำให้พร้อมสำหรับสเตอริโอ จึงได้เพิ่มวงจรลงไปอีกหนึ่งช่องสัญญาณซึ่งเหมือนกันทุกประการ
    • เมื่อไปซื้อวัสดุ พบว่าบางรายการไม่มีขาย จึงปรับแก้รายการวัสดุเล็กน้อย ทดสอบจำลองวงจรแล้วไม่มีปัญหา
    แก้ไขแล้วได้ลายวงจรดังรูป
    ก่อนจะสร้าง Netlist เพื่อนำไปทำแผ่นวงจรพิมพ์ จะต้องทำการ "เรียงเบอร์" (Annotate Schematic) เสียก่อน โปรแกรมจะทำการใส่เลขประจำตัวเช่น C1 C2 ให้กับอุปกรณ์แต่ละตัวโดยอัตโนมัติ เมื่อเรียงเบอร์เสร็จแล้ว ก็สามารถสร้าง Netlist ได้

    Netlist ที่สร้างขึ้นจะเป็นแฟ้มข้อความ ระบุการเชื่อมต่อระหว่างโนดต่าง ๆ ในวงจร ขั้นตอนต่อไปคือการระบุ Footprint ของวัสดุแต่ละตัว ตรงนี้ KiCad ระบุว่าเป็นจุดที่แตกต่างจากโปรแกรม EDA อื่น ๆ ตรงที่ วัสดุหนึ่งรายการในลายวงจร เช่น C1 เราสามารถเลือก Footprint ให้ C1 ได้อย่างอิสระ (ข้อดีคือเราไม่ต้องสร้าง Symbol ใหม่ เมื่อมี Footprint ใหม่ ข้อเสียคือเราอาจเลือกผิด) การผูกวัสดุเข้ากับ Footprint ให้ใช้โปรแกรม Cvpcb ซึ่งเรียกใช้ได้จากแถบเครื่องมือของ EESchema หรือจาก Project Manager ของ KiCad ก็ได้
    จากรูปหลักแรกคือลำดับที่ หลักที่ 2 คือชื่ออุปกรณ์ หลักที่ 3 คือค่าของอุปกรณ์ และหลักที่ 4 คือ Footprint ของอุปกรณ์ ซึ่งเราจะต้องเลือกเองให้ถูกต้องตรงกับวัสดุที่เรามี

    เมื่อผูกวัสดุเข้ากับ Footprint ได้แล้ว จึงเรียก pcbnew ขึ้นมา โดยจะเรียกจากแถบเครื่องมือของ EESchema หรือจาก Project Manager ของ KiCad ก็ได้เช่นเดียวกัน น่าเสียดายว่าตอนที่ดำเนินการออกแบบแผ่นวงจรพิมพ์นั้นไม่ได้เก็บรูปต่าง ๆ ไว้ จึงจะไม่เขียนละเอียด

    ข้อสังเกตสำคัญที่พบตอนที่ออกแบบก็คือ ค่าพารามิเตอร์ของลายเส้นของลายวงจรหรือแทร็ค (Track) จะไม่อยู่ในส่วนของ Preferences แต่จะอยู่ในส่วนของ Design Rule กว่าจะหาเจอก็งงไปนานเหมือนกัน การตั้งค่าความกว้างของแทร็ค และ Design Rule อื่น ๆ สามารถตั้งได้เองทั้งหมด ซึ่งน่าจะเป็นปัญหาสำหรับมือใหม่ หรือมือสมัครเล่น (เช่นผมเอง) เนื่องจากไม่ทราบเกณฑ์ต่าง ๆ ในการสร้างแผ่นวงจรพิมพ์ แต่ถ้าเราจะจ้างบริษัทให้กัดแผ่นวงจรพิมพ์ให้เรา ผมว่าบริษัทอาจมีเกณฑ์ Design Rule ที่เราขอทราบข้อมูลได้

    วงจรเล็กนิดเดียว พอรู้วิธีทำก็สามารถทำเสร็จได้ภายในเวลา 2 คืน หน้าตาเป็นดังรูป
    น่าเสียดายว่าไม่สามารถแสดงรูป 3 มิติของแผ่นวงจรพิมพ์นี้ได้ เข้าใจว่าเป็น Bug ของ KiCad เอง แต่ว่าไม่รู้ว่าจะรายงาน Bug อย่างไร เนื่องจากหน้าจอมันจะมืดไปเฉย ๆ ไม่มีข้อมูล เลยไม่แน่ใจว่าเป็น Bug ของ KiCad หรือของ Mesa หรือว่าของ X ไม่งั้นคงมีภาพ 3 มิติสวย ๆ มาอวดกัน


    หลังจากอัพเกรดและอัพเดต sid ล่าสุดพบว่ามีการอัพเกรด X หลายโมดูล เลยทดลองสร้างภาพสามมิติของ KiCad ดูอีกครั้งปรากฏว่าไม่มืดแล้วครับ แล้วก็ได้ภาพมาด้วย เลยขอเอามาอวดกันสักหน่อย
    ตอนนี้กัดปริ้นได้แล้วครับ แต่ยังเจาะไม่ครบเลยยังไม่ได้ลองประกอบดู หากประกอบเสร็จก็จะเอามาลง Blog เหมือนเคย อันที่จริง วงจรแค่นี้มันก็ถือว่าจิ๊บจ๊อยมากเมื่อเทียบกับงานของอีกหลาย ๆ ท่าน แต่ก็อยากเอามาลงไว้ในฐานะที่เป็นวงจรที่ (ตั้งใจจะ) ใช้ KiCad ในการสร้างจนใช้งานได้จริงเป็นชิ้นแรก หากผลงานออกมาดีจะเอาไว้ใช้ช่วยสอนในวิชาอิเล็กทรอนิกส์ด้วยเสียเลย

    วันอาทิตย์ที่ 25 เมษายน พ.ศ. 2553

    การออกแบบวงจรโดยใช้โปรแกรม Opensource ตอนที่ 1/3

    หลังจากที่ได้ทดลอง KiCad ทำงานง่าย ๆ แล้ว ก็ถึงเวลาทดลองใช้ KiCad แบบจริงจัง คือมีชิ้นงานเป็นผลลัพธ์สุดท้ายได้ ความตั้งใจก็คือใช้ Opensouce โปรแกรม ในการออกแบบตั้งแต่ ลายวงจร (Schematic) จำลองวงจร (Simulation) ออกแบบแผ่นวงจรพิมพ์ และประกอบวงจรจริง ๆ โดยตั้งใจว่าจะแบ่งทำเป็น 3 ตอนคือ

    วาดลายวงจร โดยใช้ KiCad และจำลองวงจรโดยใช้ gnucap ร่วมกับ gspiceui
    วงจรที่เลือกคือวงจรขยายเสียงคลาสเอบีขนาด 0.5 วัตต์ ไม่ใช้ออปแอมป์หรือไอซีขยายเสียงสำเร็จรูป ออกแบบตามตำราเป๊ะ ๆ ไม่พลิกแพลงใด ๆ วงจรแบ่งออกเป็น 3 ส่วนย่อยซึ่งคนที่ผ่านวิชาอิเล็กทรอนิกส์น่าจะสังเกตได้ คือ
    1. วงจรขยายแรงดันแบบอิมิตเตอร์ร่วม
    2. วงจรกันชน (Buffer)
    3. วงจรขยายกำลังคลาสเอบี
    ใช้ KiCad วาดลายวงจร โดยความตั้งใจแรกตอนที่วาดลายวงจรคือเพื่อสร้างแผ่นวงจร ลายวงจรจึงประกอบด้วยขั้วต่อสาย 3 จุด คือ ขั้วสัญญาณขาเข้า ขั้วสัญญาณขาออก และขั้วไฟเลี้ยง ดังรูป
    เมื่อได้ลายวงจรแล้ว เราจะให้ KiCad สร้าง Netlist สำหรับ gnucap ให้เราได้ ผลที่ได้จะเป็นแฟ้มข้อความนามสกุล CIR ซึ่งมีเนื้อหาดังนี้
    * EESchema Netlist Version 1.1 (Spice format) creation date: อา. 25 เม.ย. 2553, 18:45:25


    C1  14 3 1u
    P4  0 CONN_1
    P3  5 CONN_1
    P1  14 0 CONN_2
    C2  13 0 470u
    R2  3 0 42k
    R1  5 3 79k
    R5  13 0 39
    R3  5 12 430
    Q1  4 3 12 2N3904
    RV1  10 10 9 100
    R4  4 13 82
    Q2  11 12 5 2N3904
    R6  8 0 220
    D2  9 8 1N4148
    D1  11 10 1N4148
    C3  6 7 470u
    P2  7 0 CONN_2
    R8  6 15 1
    R7  2 6 1
    Q4  15 8 0 2N2907
    Q3  2 11 5 2N2222

    .end
    จากแฟ้มนี้ เราพบว่าต้องแก้ไขเพื่อให้จำลองวงจรใน gnucap ได้ 3 - 4 จุดด้วยกันคือ
    1. ขั้วต่อสัญญาณ Px ต่าง ๆ ไม่ต้องใช้ ก็ลบออก
    2. การเรียงลำดับของขาทรานซิสเตอร์ใน KiCad กับ gnucap ไม่ตรงกัน กล่าวคือ ใน KiCad จะเรียงลำดับเป็น E-B-C ในขณะที่ gnucap ต้องการให้เรียงลำดับเป็น C-B-E ก็แก้ไขลำดับของขาให้ถูกต้อง
    3. มีอุปกรณ์ตัวหนึ่งคือตัวต้านทานปรับค่าได้ ที่ gnucap ยังจำลองไม่ได้ ก็แก้ไขให้เป็นตัวต้านทานแทน ไม่ต้องปรับค่า
    4. อุปกรณ์เซมิคอนดักเตอร์ยังไม่มีโมเดล (.model) ในโปรแกรม gnucap นี้เราสามารถใช้โมเดลของ Spice ซึ่งหาได้จากบริษัทผู้ผลิตทั่วไปได้ทันที แต่โมเดลเหล่านี้ไม่ใช่ Opensource ผมจึงนำมาพิมพ์ไว้ตรงนี้ไม่ได้ หากใครสนใจให้ลองเข้าไปหาจากดาตาชีทของบริษัท หรือจากเว็บก็ได้ เมื่อโหลดมาแล้วก็เติมเข้าไปท้ายแฟ้ม ก่อน .end
    5. ไม่ได้กำหนดตำแหน่งไฟเลี้ยง และสัญญาณขาเข้า ก็ให้เพิ่ม VSupply กับ Vin เข้าไป ตามไวยกรณ์ของ gnucap
    จะได้
    * EESchema Netlist Version 1.1 (Spice format) creation date: อา. 25 เม.ย. 2553, 18:45:25


    C1  14 3 1u
    P4  0 CONN_1
    P3  5 CONN_1
    P1  14 0 CONN_2

    C2  13 0 470u
    R2  3 0 42k
    R1  5 3 79k
    R5  13 0 39
    R3  5 12 430
    Q1  12 3 4 2N3904
    RV1  10 10 9 100
    RV1 10 9 50
    R4  4 13 82
    Q2  5 12 11 2N3904
    R6  8 0 220
    D2  9 8 1N4148
    D1  11 10 1N4148
    C3  6 7 470u
    P2  7 0 CONN_2
    R8  6 15 1
    R7  2 6 1
    Q4  0 8 15 2N2907
    Q3  5 11 2 2N2222

    VSupply 5 0 12
    Vin 14 0 GENERATOR

    .model 1N4148 D (Is=5.84n...)*
    .model 2N3904 NPN (Is=6.734f...)*
    .model 2N2222 NPN (is=19f...)*
    .model 2N2907 PNP (is=1.1P...)*

    .end
    โมเดลที่ดอกจัน (*) ไว้ หมายความว่าจะต้องไปโหลดมาจากเว็บของผู้ผลิตเอง ซึ่งจะมีพารามิเตอร์ให้ครบสำหรับ Spice ในกรณีของเราซึ่งใช้ gnucap นี้ เมื่อรันโปรแกรมซิมูเลชั่นแล้วจะเกิด Error ขึ้นเนื่องจาก gnucap ไม่รู้จักพารามิเตอร์บางตัว ให้ลบพารามิเตอร์ตัวนั้นทิ้งได้ (อย่างไรก็ตาม ไม่สามารถรับรองผลการทดลองได้)
    เมื่อเตรียมแฟ้มเรียบร้อยแล้ว เราสามารถเลือกใช้ gnucap แบบบรรทัดคำสั่งก็ได้ หรือจะใช้ gspiceui เพื่อใช้ gnucap แบบ GUI ก็ได้ ในกรณีนี้เราเลือกใช้ gspiceui ซึ่งเรียกจากบรรทัดคำสั่งโดย
    > gspiceui &
    จะได้

    หลักการของ gspiceui ก็คือเราจะต้อง "สร้าง" (Create) การซิมูเลชั่นขึ้นมาเสียก่อน แล้วจึงจะ "รัน" (Run) ซิมูเลชั่นนั้น ๆ ได้ การ "สร้าง" ซิมูลเลชั่นก็คือการตั้งค่าต่าง ๆ ของการซิมูเลชั่น นั่นเอง เช่นการกำหนดประเภทของการซิมูเลชั่น (.op .dc .ac) การกำหนดโหนด (Node) ที่ต้องการสังเกต การกำหนดประเภทของตัวแปรที่ต้องการสังเกต (แรงดัน กระแส กำลัง ค่าความต้านทาน) ส่วนการ "รัน" ซิมูเลชั่นก็คือการสั่งให้ gnucap ทำตามที่สั่ง

    เมื่อทดลองใช้ดูพบว่าข้อความในแท็บ Netlist ไม่สามารถแก้ไขได้ ส่วนข้อความในแท็บ Simulation สามารถแก้ไขได้ นั่นหมายความว่าเราสามารถตกแต่งแก้ไขคำสั่งการซิมูเลชั่นที่ gspiceui ตั้งให้เราได้ ซึ่งมีจุดหนึ่งที่ต้องแก้ไขด้วยตนเองแน่ ๆ ก็คือ หากต้องการซิมูเลตแบบอื่น ๆ ที่ไม่ใช่ .op จะต้องสั่ง .op ก่อนเสมอ ไม่เช่นนั้นจะได้ผลเสมือนว่าวงจรไม่ได้รับไฟเลี้ยง

    เมื่อทดลองซิมูเลตแบบ Transient (.tr) gspiceui จะอำนวยความสะดวกในการตั้งค่าต่าง ๆ ให้เรา ที่ได้ทดลองคือ
    • ตั้งค่า Vin เป็น 0.5 V ความถี่ 1 kHz (ลอง 1.0 V แล้ว สัญญาณเพี้ยน)
    • Start Time = 0 ms
    • Stop Time = 10 ms
    • Step Time = 10us 
    ผลการทดลองเป็นดังนี้

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