รัน shell command จาก Latex
มีบางกรณีที่เราต้องการผลจากคำสั่ง shell บางอย่างเพื่อเอาไปใส่ในเอกสาร Latex เท่าที่ลองทำดูใช้ code ต่อไปนี้แล้วได้ผล มี comment ที่เกิดจากการเดาล้วนๆประกอบ
% รันคำสั่ง somecommand แล้วเขียนผลลงไฟล์ file.out
\immediate\write18{somecommand > file.out}
\newread\myinput
% เดาว่าคล้ายๆเปิด file pointer ชื่อ \myinput
\immediate\openin\myinput=file.out
% อ่านค่าในไฟล์ลงตัวแปร \localline
\immediate\read\myinput to \localline
% เก็บค่า \localline ลงตัวแปร \myout ซึ่งเป็น global
\global\let\myout\localline
% ปิด input ที่เปิดไว้
\immediate\closein\myinput
ต่อจากนี้ก็เรียก \myout เพื่อเอาผลไปใช้
จริงๆแล้วที่อยากทำคือพยายามจะเอาเลข commit ของ Git ไปใส่ในเอกสารเพื่อจะได้รู้ว่าตอนนี้ commit ไปกี่ทีแล้ว แล้วก็เป็นตัวเลข version ไปในตัว เวลาส่งให้คนอื่นจะได้รู้ว่ามีการอัพเดทหรือไม่ แต่ก่อนเคยเห็น Latex package อยู่ตัวหนึ่งชื่อ svn-multi (มั้ง) สามารถทำอย่างที่บอกได้เลย ไม่ต้องมารันคำสั่งอะไรเองแบบนี้ วิธีของเจ้า package นั้นคือ เขียน string พิเศษอะไรบางอย่างตามที่ svn-multi นิยามไว้แล้ว แล้วมันจะ replace ให้เป็นหมายเลข revision ให้ แต่วิธีนี้รู้สึกว่าต้องมาศึกษากันยาว ยุ่งยาก เลยคิดว่าเขียนเองนิดหน่อยน่าจะเข้าใจง่ายกว่า
code ที่ใช้คือตัวนี้
\def \revf {rev.txt}
\immediate\write18{git log --pretty=format:'..' | wc -w > \revf}
\newread\myinput
\immediate\openin\myinput=\revf
\immediate\read\myinput to \localline
\global\let\rev\localline
\immediate\closein\myinput
จากนั้นเอา \rev ไปใช้เพื่อบอกหมายเลข commit ตรง
git log --pretty=format:'..' | wc -w
นี่เอาไว้หาว่า commit ไปแล้วกี่ที ชัดเจนว่ามันเป็นการ hack แบบลวกๆ แต่คิดว่าไม่น่ามีปัญหานะ
สุดท้าย เท่าที่เข้าใจคือปกติแล้ว Latex จะไม่อนุญาตให้รันคำสั่ง shell เพราะอาจเป็นไปได้ที่เราไปโหลดไฟล์ tex ของคนอื่นมาแล้วในนั้นมีการรันคำสั่ง shell แบบที่สร้างความเสียหาย วิธีทำให้ใช้ได้คือเพิ่ม
--shell-escape
เป็น argument ของคำสั่ง latex หรือ pdflatex ตอน compile ซะ แบบนี้
pdflatex --shell-escape doc.tex
หรือ
latex --shell-escape doc.tex
สำหรับคนที่ใช้ Latex editor แบบที่กดปุ่มเดียว compile ให้หมดก็สามารถเพิ่ม argument แบบนี้ได้เช่นกัน เพราะปกติปุ่มแต่ละปุ่มที่ใช้ compile เอกสารจะไปเรียกคำสั่ง command line พวกนี้อยู่แล้ว editor ส่วนใหญ่จะให้แก้คำสั่งเองได้
อ้างอิง