จาก Markdown เป็น PDF ในแบบของข้าพเจ้า

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

เป้าหมายของผมคือการเขียนต้นฉบับงานแปลด้วย Markdown แล้วแปลงเป็นไฟล์ PDF เพื่อใช้แจกจ่ายผ่านทางเน็ต

เรื่องก็เริ่มต้นจากการหา editor เพื่อใช้เขียนบนเครื่อง Mac ซึ่งผมได้ tool นี้แล้วตั้งแต่ปีที่แล้วคือ MOU ซึ่ง tool ตัวนี้ทำงานได้ดีทีเดียว เสียอย่างเดียวคือ การสร้าง footnote มันจะเอาไปไว้ที่ท้ายไฟล์ แทนที่จะเป็นท้ายหน้าที่มีการโยงไว้ เลยต้องหาทางใหม่ และอีกข้อจำกัดคือ MOU ไม่สามารถรวมหลายไฟล์เป็น ไฟล์เดียวได้ทำให้เวลาทำงานต้องเขียนเป็นไฟล์เดียว ซึ่งถ้าหากหนังสือเล่มใหญ่ก็จะทำงานลำบาก ผมอยากจะแยกไฟล์เป็นบทๆ มากกว่า

จากการค้นหาผมก็พบว่า มี tool บน commandline ที่คนนิยมใช้ในการแปลง markdown อยู่หลายตัว ซึ่งตัวที่เป็นนิยมมากที่สุดคงจะเป็น PanDoc แต่ก็ยังคงมีปัญหาอยู๋ดี เพราะ PanDoc มันไม่สามารถแปลงเป็น PDF ได้ในตัวของมันเอง ต้องอาศัย LaTex ซึ่งผมหนีห่างตั้งแต่สมัยเรียนแล้ว

จนแล้วจนรอด ผมก็ไม่สามารถปล้ำ LaTex กับ PanDoc ให้ work ได้ เพราะติดปัญหางงๆ ไม่รู้เป็นเพราะอะไร พอดีเหลือบไปเห็นว่า PanDoc สามารถ แปลง เป็น ODT ของ LibreOffice ได้ เลยฉลองซะ แล้วใช้ LibreOffice แปลงเป็น PDF ผ่าน commandline interface ที่ชื่อว่า soffice ที่ติดมากับตัว LibreOffice เอง

นึกว่าจะ happy ending แล้ว แต่ก็ดันพบว่า เจ้า soffice จะทำงานไม่ได้ถ้าหาก LibreOffice รันอยู่ เลยต้องหาทางให้ สามารถรันได้พร้อมกัน จนพบกับวิชา เปลี่ยนตัวแปร env ที่ชื่อว่า UserInstallation เพื่อให้ LibreOffice สามารถรันได้พร้อมกันหลาย instance จบบริบูรณ์

ข้อดีอย่างหนึ่งของ workflow นี้คือ footnote จะอยู่ที่ท้ายหน้าด้วยความสามารถของ LibreOffice

นี่คือตัวอย่าง MakeFile ที่ผมใช้ครับ

FILES=chapter01.md chapter02.md glossary.md

REFERENCE=reference.odt
OUTNAME=agilebook
SOFFICE=/Applications/LibreOffice.app/Contents/MacOS/soffice
TMP=/tmp/soffice
BUILD=./build
RELEASE=./release
ODT_FILE=$(BUILD)/$(OUTNAME).odt
PDF_FILE=$(BUILD)/$(OUTNAME).pdf

all: release

odt:
mkdir -p $(BUILD)
pandoc --reference-odt=$(REFERENCE) -o $(ODT_FILE) $(FILES)

pdf: odt
$(SOFFICE) -env:UserInstallation=file://$(TMP) --headless --convert-to pdf --outdir $(BUILD) $(ODT_FILE)

release: pdf
mkdir -p $(RELEASE)
mv $(PDF_FILE) $(RELEASE)

clean:
rm -f $(BUILD)/*
rm -f $(RELEASE)/*
rm -Rf $(TMP)

ปล. –reference-odt คือการกำหนด ไฟล์ที่ทำหน้าที่เป็นเหมือน stylesheet ให้กับ odt ที่เรา generate

Advertisements

ใส่ความเห็น

Please log in using one of these methods to post your comment:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / เปลี่ยนแปลง )

Twitter picture

You are commenting using your Twitter account. Log Out / เปลี่ยนแปลง )

Facebook photo

You are commenting using your Facebook account. Log Out / เปลี่ยนแปลง )

Google+ photo

You are commenting using your Google+ account. Log Out / เปลี่ยนแปลง )

Connecting to %s