Closed11

scrap about Groff and PDF. How to presentation and LT.

Context

LT, やプレゼンテーション資料等を作る時。
PDFaC (PDF as Code) を目指したい。
Markdown to PDF is cheap. 表現力が足りない、方言に惑わされたくない。飽きた。
Latex is huge. 構築に手間がかかる。複雑な機能は必要ない。

Groff 結論

最初に結論を書きます。個人的なちょっと触ってみた程度の意見です。
ちゃんと書きたいなら、Google Slide とか、Power Point を使うべきで、
エンジニアチームでコード管理するなら、Markdown to PDF でいい。
おそらくメディア中心の場合、LT, プレゼンテーションには向いてない。
個人的にちょっとした、テキストやグラフ、図形等のベースのPDFを早く作るなら使える。
場合によっては、機能不十分に感じる。マクロや標準、UNIX 等物好きな人間には良い。

Groff

とりあえず色々これに書いてあるので読む。

https://www.gnu.org/software/groff/manual/groff.html

イメージがつきにくかったら。

https://www.youtube.com/playlist?list=PLknodeJt-I5FgZ5VwT-BHda_lu3dYrMeJ

をみてみるといい。

Brian Kernighanがプログラミング言語Goの組版に使ったのはなんとtroff

https://cpplover.blogspot.com/2016/04/brian-kernighangotroff.html
https://rkrishnan.org/posts/2016-03-07-how-is-gopl-typeset.html

Post script がなんなのか?

https://chiku-chiku-nikki.hatenablog.com/entry/20130520/1369000693

環境構築が楽

最低限、groff と、ps2pdf が使えればいい。MacOS だと標準で入っているし。
その他のディストリビューションでもインストールが簡単。

FROM alpine:3.14.2
RUN apk -Uuv --no-cache add bash gawk coreutils groff ghostscript

Groff to PostScript to PDF

man groff

       -e     Preprocess with eqn.
       -g     Preprocess with grn.
       -G     Preprocess with grap.  Implies -p.
       -p     Preprocess with pic.
       -t     Preprocess with tbl.

       -T dev Set output device to dev.  For this device, troff generates the intermediate output; see groff_out(5).   Then  groff
              calls a postprocessor to convert troff's intermediate output to its final format.  Real devices in groff are

                     dvi    TeX DVI format (postprocessor is grodvi).

                     html   xhtml HTML and XHTML output (preprocessors are soelim and pre-grohtml, postprocessor is post-grohtml).

                     lbp    Canon CAPSL printers (LBP-4 and LBP-8 series laser printers; postprocessor is grolbp).

                     lj4    HP LaserJet4 compatible (or other PCL5 compatible) printers (postprocessor is grolj4).

                     ps     PostScript output (postprocessor is grops).

                     pdf    Portable Document Format (PDF) output (postprocessor is gropdf).

              For the following TTY output devices (postprocessor is always grotty), -T selects the output encoding:

                     ascii  7bit ASCII.

-dpaper=a4l -P-pa4 -P-l 

をつけると横向きになります。

groff-content.ms ファイルの保存時に以下のスクリプトを実行して dist/$file.pdf を確認しています。

groff ${filePath} -ms -s -e -p -t -R -t -T ps -dpaper=a4l -P-pa4 -P-l > dist/${fileBaseName}.ps
ps2pdf dist/${fileBaseName}.ps dist/${fileBaseName}.pdf

vim の autocmd BufWritePost *.ps でも良いのですが、autocmd 重いし、毎回チェックされる?のでできるだけ外部的にしたいので、自作コマンド(未完成)を使ったりしています。https://gtihub.com/kis9a/sar

.sar.toml
[[sar]]
base = ""

[[sar.commands]]
match = "src/*.ms"
cmd = """
groff ${filePath} -ms -s -e -p -t -R -t -T ps -dpaper=a4l -P-pa4 -P-l > dist/${fileBaseName}.ps
ps2pdf dist/${fileBaseName}.ps dist/${fileBaseName}.pdf
"""

マクロ

プログラム的に書ける

https://qiita.com/zr_tex8r/items/19b66e34de6b87886529

個人的に定義したマクロ

.so macros.ms で好きなところで読み込めます。
マクロ内では、引数をとったり、変数を扱ったりできます。

macros.ms
\# Header 1
.de H1
.NH 1
.fam P
\\$*
.sp 2p 
..

\# Header 2
.de H2
.NH 2
.fam P
\\$*
.sp 1p 
..

\# Header 3
.de H3
.NH 3
.fam P
\\$*
..

\# Bullet points
.de BL
.IP \(bu 2
\\$1
..

.de BE
.IP
\\$1
..

\# Begin code box
.de b1
.B1
.sp 0.2
.ft CW
..
.
\# End code box
.de b2
.sp 1
.B2
.ft
..

\# Width 10i
.de W10
.ll 10i
..

\# Reset Vertical Space
.de VS0
.vs 0
..

\# Page Layout
.de PAGE 
.ps +30
.pvs +12
.fam P
.sizes 15000
.po 0.5i
.hm 0i
.fm 0i
.  de H end
.    vs 0p
.    nop \f[B] \\\\$1\f[]
.    sp 12p 
.  end
.  de F end
'  sp 1v
'  bp
.  end
. 
..

\# Head
.de head
\m[navy]\fR\s(14\\$*\fR\s(10\m[]
.br
.sp -0.5
.line
..

\# Head2
.de head2
\fI\s(11\\$*
..

\# List
.de list
\s9\fB\\$1 \fR \\$2
..

\# Lang
.de lang
\s9\fB\\$1\fR - \fI \\$2
..

\# Line
.de line
\D'l 4.9i 0 '\D'P -0.6m 0 0 -0.6m 0.6m 0'
..

\# Description
.de des
.sp 0.3
.nf
\fB\s(12\\$1\s9\fR   (\\$2)
\fB\s(10\\$3\fR
..

.de LINE
.	br
\D'l \\$1 0'
.	br
..

\# Begin the left side of the document
.de LEFT
.	po \\n[RESUME.margin]u
.	mk TOP \" Mark position vertically
.	ll \\n[LEFT.ll]u
..

\# Begin the right side of the document
.de RIGHT
.	br
.	po \\n[RIGHT.po]u
.	rt \" Return to marked position vertically
.	ll \\n[RIGHT.ll]u
.	br
..

\# Format: Name Date Language Link
.de PROJECT
.	br
\m[navy]\s+2\\$1\s-2\m[]
.	br
Language: \\$2
.	br
\\$3 
.	br
\\$4
.	br
..

\# Format: Position Date Company
.de JOB
.	br
\m[navy]\s+2\\$1\s-2\m[]
.	br
\\$2 
.	br
\\$3
..

\# .LEFT
.de LEFT.line
.	vs 5
.	LINE \n[.l]u
.	vs
..

\# .Left section
.de LEFT.section
\m[navy]\s+2\\$1\s-2\m[]
.	LEFT.line
..

\# .RIGHT section
.de RIGHT.section
.	br
.	sp 0.5
.	ps 20
\m[navy]\\$1\m[]
.	ps
.	sp -0.5
.	LINE \n[.l]u
..

Processer

tblの表現力

http://www.snake.net/software/troffcvt/tbl.html

ちょっとさわてみた。



.TS
allbox ;
c c c.
a	a	a
a	a	a
.TE

.TS
allbox ;
c s s s
c s c s
c c c c.
Title
sub 	sub
a	a	a	a
a	a	a	a
.TE

.TS
allbox tab(|);
c s s
c c c.
title
a | a | a
a | a | a
.TE


.TS
box tab(|);
c s s
c c c.
title
a | a | a
a | a | a
.TE

.TS
center tab(|);
c s s
c c c.
title
a | a | a
a | a | a
.TE

.TS
expand tab(|);
c s s
c c c.
title
_
a | a | a
a | a | a
.TE

.PP
.TS H
center, tab(@), linesize(2);
lb | lb
l | l.
.sp 2p
Object@Default Size
.sp 2p
_
.sp 2p
.TH
box@0.75" wide by 0.5" high
circle@0.5" diameter
ellipse@0.75" wide by 0.5" high
arc@0.5" radius
line@0.5" long
arrow@0.5" long
.sp 5p
_
.TE

画像のGrid 的な配置に使おうと思ったのですが、如何せんfitしない、スタイル調節に時間が食いました。
以下のメーリングリストを見ました。

https://lists.gnu.org/archive/html/groff/2006-06/msg00046.html

https://lists.gnu.org/archive/html/groff/2006-06/pdfOP_5djUdbD.pdf

デメリット

細かなスタイリングは難しい。

情報が少ない。メーリングリストとかを漁っている。

Page の全体像を把握したうえで書き始めないと、マクロとレジスタの管理に俗人性、分からなくなる

非標準日本語対応。 日本語フォントの導入か、utf-8のサポートがどうなっているのか分からない。

画像のコンパイル後のサイズがでかい。ファイルに埋め込むため重くなる。Grid で表示するのも難しい。細かい調節が必要。

画像をいくつか使った場合。
﯏  │  index.pdf 140 kB
﯏  │  index.ps 9.78 MB
みたいになっています。

機能的にLatextの下位。

Number Header が個人的に好み。自動てkにインデックスとかつけてくれるので。

.PAGE \" CAREER
.pvs 4
.H1 CAREER
.sp 1
.H2 "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"
.sp 1
.H2 "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"
.sp 1
.H2 "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"
.sp 1
.H2 "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"

.sp 1

.H1 NEXT
.pvs 4
.sp 1

.BL Language
.sp 1
/ xx / xxx / xxxxxxxxxx / xxxxxxxxx / xxxx /
.sp 1

.BL Position
.sp 1
/ xx / xxx / xxxxxxxxxx / xxxxxxxxx / xxxx /
.sp 1

.BL Bussiness
.sp 1
/ xx / xxx / xxxxxxxxxx / xxxxxxxxx / xxxx /
.sp 1

.PAGE
.F

このスクラップは1ヶ月前にクローズされました
ログインするとコメントできます