レポート省力化
この記事は WORDIAN Advent Calendar 2017 - Adventar の2日目です。
LaTeXネタ2つ目。
何をするのか
「どうせまた.md
→ .tex
みたいなのだろ?」と思った貴方。
「そうだよ」
要求環境
- TeX Live
- Pandoc
- Make
- Printer
そのままでも見られるモノというのがLightweight Markup Languageというヤツなんで、なんだったら生テキストをそのまま印刷したい所ですがそうもいかないというワケで。
まあ先ずは.md
を書いていきましょう。好きなのはRe:VIEW(.re
)なんですけどね*1。
使うのは皆大好きbxjsclassesになります。
を見てください。
PacndocからLaTeXの話はいっぱいあるのでググッた方が早いような気もするので省きます。
Pandoc ユーザーズガイド 日本語版 - Japanese Pandoc User's Association
やりたいこと
- 毎回タイトルや名前を入れたくない
- デフォルトの見た目はちょっと変えたい
- レポート自体は時刻名とかで管理したい
という訳で、Pandocでカスタムしたテンプレートを読み込むが基本方針となります。
ちなみにbxjsclasses作者様のサイトでPandocモードの説明がされてます*2が、これそのままだと毎回自分の名前を打つ必要などがあるので、どうにかしたい。で、
テンプレ作成
$ pandoc -D latex > report.tex
でいじる元のファイルがゲットできるんですが。……結果から書くと、あんまりいじるところがなかった:cry:
まあ、一読しておくのをオススメします。
発覚するオプション
--include-in-header=FILE
(or-H FILE
) :LaTeXだと\begin{document}
の前に入る。--include-before-body=FILE
(or-B FILE
):LaTeXだと\begin{document}
の後に入る。
つまりヘッダを書いておいてPandoc叩くときに挿入すれば目的達成、ということでした。
知見
最初は--include-in-header
だけでいけるかなと思ったんですけど、titleとかを設定したテキストを-H
で入れたら、
$ pandoc input.md -o output.pdf -H header --latex-engine=lualatex -V documentclass=bxjsarticle -V classoption=pandoc -V classoption=a4paper
としたとき、完成したpdfにタイトルなどが表示されていない状態に。 -o output.tex
で確認するとヘッダ内容が入っているので、
「コイツどのタイミングでヘッダ挿入してんだ?*3」となった。
力技解決として、-B maketitle
(中身は\maketitle
だけ書いてある)も入れて叩くことに。解決した。
headerは
\title{\today Weekly-Report} \author{hidaruma}
maketitleは
\maketitle
みたいな感じに。テンプレートで\date{}
が入っているので、headerに書いてあっても無になるので注意ですね。書くならmaketitle
の前に挿入すべし。
いざ省力化へ
Makefile
使うコマンドが大体分かったらmake
パイセンの出番です。正直しょっちゅう書き方を忘れます。
LATEX ?= lualatex PAPER ?= a4paper CLASS ?= bxjsarticle OPTIONPANDOC ?= pandoc OPTIONJAFONT=sourcehan PANDOC ?= pandoc MONOFONT ?= SourceHanCodeJP HEADER ?= header BEFOREBODY ?= maketitle SRC_DIR = ./src BUILD_DIR = ./build RM = rm .PHONY clean %.pdf: %.md $(PANDOC) $(SRC_DIR)/$< -o $(BUILD_DIR)/$@ \ --latex-engine=$(LATEX) -V papersize=$(PAPER) -V documentclass=$(CLASS) \ -V classoption=$(OPTIONPANDOC) -V classoption=jafont=$(OPTIONJAFONT) \ -V monofont=$(MONOFONT) \ --listings \ --include-in-header=$(HEADER) --include-before-body=$(BEFOREBODY) %.tex: %.md $(PANDOC) $(SRC_DIR)/$< -o $(BUILD_DIR)/$@ \ --latex-engine=$(LATEX) -V papersize=$(PAPER) -V documentclass=$(CLASS) \ -V classoption=$(OPTIONPANDOC) -V classoption=jafont=$(OPTIONJAFONT) \ -V monofont=$(MONOFONT) \ --listings \ --include-in-header=$(HEADER) --include-before-body=$(BEFOREBODY) clean: $(RM) $(BUILD_DIR)/*.pdf $(BUILD_DIR)/*.tex
あとはsrcディレクトリに.mdを突っこんで
make hoge.pdf
とすればbuildディレクトリにブツが生成されます。
終わりに
成果物を
https://github.com/hidaruma/report/
に上げました。
WORDIAN Advent Calendar 2017 - Adventar 明日の担当はびしょ〜じょ君です。
僕はまた空きっぱなしの所があったら、とりあえずGitHub - takahashim/review-pandoc: Re:VIEW Writer for Pandocを覗いてネタを確定させたいと思います。
*1:あるやん!(但し3年前)
GitHub - takahashim/review-pandoc: Re:VIEW Writer for Pandoc
*2:BXjscls がまた新しくなった(v1.1a) - マクロツイーター
*3::thinking_face:
卒論をLuaLaTeXで書く
この記事は
WORDIAN Advent Calendar 2017 - Adventar の1日目になります。
最高の卒業体験がしたい
卒業までの道は平坦とはいきませんでした。いや、まだ卒業してないんですが。まあ卒業可能性高ということで、浮かれている訳です。
卒業するためには何が必要なのか? それは卒論です。つまり最高の卒業は最高の卒論によって齎されるのです*1。
最高の卒論
最高の卒論といっても色々あります。
- 内容が最高の卒論
- 体裁が最高の卒論
- 卒業が可能な卒論
無論内容が最高であるに越したことはありませんが、そこは明日以降の自分に期待するしかありません。 よって考えるべきは卒論の見た目になります。
卒論を作成するにあたって利用できるツールは幾つかありますが、最終的には規定に沿ったPDFができれば勝ちです。 どのようにツールを選ぶかといえば、最高の執筆体験で選ぶべきでしょう。 最近はMSWord推しの人も随分見かけます。一太郎はテンプレートを配っている大学もありましたが、弊学はそうではなかったのでまあ除外します。
ところでMSWordで作成された.docxファイルには大きな欠陥があって、
platex
コマンドやlualatex
コマンドで処理できないんですね。ということでlatex
コマンドが叩ける.texを使っていきたいと思います。
ここで弊大学が学内で配布している卒論テンプレートを見てみると
- 使用するクラスファイルがjreport*2
bf
命令とか残りまくってる- timesを読み込んでいる
- アンダーラインと長い題目名で壊れる
など多くの学生が悲鳴を上げる内容になっています。そして皆思うでしょう、「俺が作るしかない」と。 しかし、自分で配布されたテンプレートを改造していく学生でもクラスファイルを変更する例はあまり無いようです。
幸い2017年を生きる僕達はTeXLive2017という資産を使うことができます。 これは大きなアドで、bxjsclassesを使えるしLuaLaTeXのバージョンは1.0以降だし、つまり結論としては
卒論をLuaLaTeXで書く
LuaLaTeX用に書いた.texはlualatex
コマンドで処理できるんですね。.tex中でLuaが書けるとか余録もあります。
LuaLaTeX
LuaLaTeXはpdftexの実装の1つです。絶賛開発中な雰囲気を数年間出してたので敬遠していた人も多いかと思いますが、もうバージョン番号は1.0を超えているんですね。pLaTeXなどと比較すると枯れているとはとてもとても言えませんが、そろそろもうちょっと信頼されてもいいんじゃないでしょうか。
bxjsreport.cls
「LuaLaTeX使うって言ってたのに汎用(pLaTeX、XeLaTeX、LuaLaTeXで利用可能)クラスかよ」
って話ではあるんですが、「卒業が可能な卒論」を目指す立場なので、lualatex
でのみ問題が発生する場合などに備えて選びました。
sourcehan
現代を生きる僕達には他にも源ノ角ゴシック、源ノ明朝の利用が許されています。pLaTeXから利用するにはちょっと手間ですが、LuaLaTeXなら1行程で済んでしまいます*3。
作ってみた
main.tex
documentclassの宣言と各種パッケージ、分割した各章の読み込みしかほとんどやらせていないですね。
\input{}
は便利。\include{}
は改ページしてしまうので注意しましょう。あと、元のテンプレートから引き継いだ突然の余白とか。
\documentclass[autodetect-engine,dvi=dvipdfmx,a4paper,base=11pt, jafont=auto, ja=standard]{bxjsreport} \geometry{left=25truemm,top=35truemm,right=25truemm,bottom=50truemm}
\geometry{left=25truemm,top=35truemm,right=25truemm,bottom=50truemm}
bxjsでは最初にエンジンをオプションで書いておく必要がありますが、autodetect-engine, dvi=dvipdfmx
とすることで勝手に判別してくれるようになります。
jafont=auto,ja=standard
では、 jafont=auto
によってupdmap-kanji-config-*
で設定されたフォントが読み込まれるようになります。
auto
ではなくここをsourcehan
にするとsoucehanを使ってくれるようになります。ja=
はstandard
にしておけば滅多に間違いは無い筈です。
base=11pt
としています。これは欧文文字サイズ基準が11ptになる指定です。日本語文字の大きさ基準を指定するjbase
もありますが、元のテンプレートでの指定[a4paper,11pt]{jreport}
を考えるとこの指定が正しい筈です。
\geometry
は他のクラスファイルであれば\usepackage[option]{geometry}
とする所ですが、bxjsがgeometryを使ってる関係で既に読み込まれているのでこういう表記になります。
cover.sty
\usepackage[B]{cover} \input{personal}
卒論最大の鬼門と名高い表紙作成用スタイルファイル。基本的には\maketitle
命令の改造をしているパッケージ。
オプションのB
は学部生を表します。修論の場合はM
を指定すると良い感じになる筈。
必要事項をpersonal.texに書かせて読み込む形にしています。
ulemパッケージを持ってくることで長文題目名でも壊れないという、皆が辿ることをやっています。
正直題目名以外は長くなるケースがほとんど無いので元の\underline
指定のままで良い。というか\advisor
に\and
を挟んだりすると\uline
だと挙動が違ったりするのでそのままの方が良いです。
thesis.sty
\usepackage[B]{thesis}
基本は卒論の書式に合わせての改変命令集。
\and
を全角空白2つ分に変えたり、abstract
環境を中央寄せ「要旨」見出し付きに変更したりします。
packages.tex
input{packages}
必要パッケージを\usepackage
しまくる場所。
comment
comment
環境で囲むことで該当箇所をコメント化。試行錯誤するときに便利です。graphicx
画像、図を用意するために。実質必須パッケージです。hyperref
メタタグ入れたりPDF内のリンクを用意したりします。url
urlを入れるときに使います。newtxtext, newtxmath
実質必須パッケージ。より良いTimes New Romanを使うようにします。
終わり
最高の卒論にしていこうな。
明日の担当は @hid_alma1026 君です(棒) !
microの textlint plugin(575)
愛用しているエディタで、コーディングではなく日本語を書く人はかなり多いでしょう。 文章を書くなら文書校正が要りますね。そんなときに便利なtextlint。 で、まあエディタ上から使いたくなりますよね。幸いにも僕の愛用しているmicro-editorは 拡張をlua(5.1)で書ける、ということで書きました。
使い方
textlintが入っている前提です。.textlintrcは通常のtextlint同様に用意してください。
microで編集中に Ctrl-e textlint
で該当行に表示が出ます。便利!!!!!
microのプラグイン作成
既存のlinter-pluginを参考にしました、というかほとんど構成が一緒。 JobSpawnで実行してもらって、出力結果を1行ずつ加工してGutterMessageに突っ込むというだけです。
ハマったところ
GutterMessageに送ったstringが、マルチバイト文字のところが一文字飛ばしになって表示されていてかなり時間をとった。結果から言うと重なって表示されていたために一文字飛ばしに見えていたというオチ。半角スペースをマルチバイト文字の間に入れていくという解決策を取りました。このためにutf8.luaを利用させてもらっていて、オリジナルの1ファイルで完結していないから公式のPlugin-Channelに乗せてもらうようPR出すのを躊躇っているところ。日本語をGutterMessageに使いたいときは毎度同じ手法を取る必要があるかもしれない。
WingoWMのPythonScriptサンプルをPython3用に直してみた
WingoはWindow Managerの1つでGolang製です。 が、socketでPythonからWingo-cmdのコマンドを実行できます。サンプルがPython2系だったのでPython3系に書き直してみた。
本当はMessage
に色々やらせたいんだけどただの文字列以外だとどうにも動いてくれないので一旦保留かな。
19:30追記 'Message "%s"' % hoge
の形で可能だった。はー。
# -*- coding:UTF-8 -*- import os import os.path import socket sock = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM) f = os.path.join(os.getenv('XDG_RUNTIME_DIR'), 'wingo', os.getenv('DISPLAY') + '.0') sock.connect(f) def recv(sock): data = '' while chr(0) not in data: data += sock.recv(4096).decode() return data def gribble(cmd): message = ("%s%s" % (cmd, chr(0))) sock.send(message.encode('utf-8')) return recv(sock) print(gribble('GetClientName (GetActive)')) sock.close()
推しキャラに自分と同じ服着せたい……着せたくない?
この記事は
の12日目。
一日あったにも関わらず完成しなかったorz
何がしたかったのか
神絵師は可愛い女の子に好きな服を着せられる(描ける)訳です。 そうなると気持ち悪いオタクである僕なんかは当然自分の普段着るような服を着せて 悦に浸りたくなる訳なんだな。
今朝は寒かった
そりゃあ-4℃ってあんたベッドから出てエアコンの有線コントローラ操作にも行けない寒さですよ。 そんな日なもんだから、つい先日入手したモフモフ暖かなアウターが着たくなるってもんで。モフモフに包まれた可愛い女の子は可愛いって話で。
描いた(描けていない)
ところで顔を上手く描けないと普段と違う服を着せた推しキャラがそのキャラに見えないっていう問題があって。皆さん12月23日以降にポッピンQ*1見に行きましょう。
姫狩りインペリアルマイスターをしていたら描く時間がなかった。今は反省している*2。
明日は@maccha_nuceさん。
*2:そんなんばっかだなお前。
1hドロは言い訳にも向く
この記事は
の11日目である。10日が事故っているが、多分大丈夫。ギリギリまで登録が無かったので今日も僕です。
1hで描く
短時間で絵を仕上げるのも神絵師に要求されるスキルだと思われる。
短時間で描くコツはどうやら * 線をそのまま残しっぱなし * パステル塗り
あたりをするとごまかせる気がしたので、そうした。
今日はハピメアの内藤舞亜ちゃんを描きたかった。
明日はきっとちゃんと。