講義でノートとるときにTeXで書きたいけどめんどくさいからTeXに書き換えるスクリプト書いた

インデント使いましょう!

手書きでノートとるのちょっと気が引ける科目とかありますよね.
あとで追記したりするときもどうしてもキーボードでカチャカチャやったほうが・・・
TeXで書いたら綺麗になるし,でもタグ書くのもめんどくさいし・・・

・・・!!

インデントで項目分ければいいじゃない!!

つまり,

Gentooについて
	可愛い
		熱心なファンが存在する
		愛でたくなる
	おしゃれ
		女子力アップ!
		どう考えてもオムライス女子よりGentoo女子の方がいいでしょ
	すばらしい
		スバラシス!!!

女子力について
	合コンで役立つ能力
		合コン:合同コンパイル
		%begin{texmode}
		\[
		女子力 = \int_{0}^{コア数} 女装力^{x} dx
		\]
		%end{texmode}
	Gentooのインストールできないんですぅ・・・
		これで相手もメロメロやで

みたいにノートとると,

\documentclass{jsarticle}
\begin{document}
\section*{Gentooについて}
        \begin{itemize}
        \item 可愛い
                \begin{itemize}
                \item 熱心なファンが存在する
                \item 愛でたくなる
                \end{itemize}
        \item おしゃれ
                \begin{itemize}
                \item 女子力アップ!
                \item どう考えてもオムライス女子よりGentoo女子の方がいいでしょ
                \end{itemize}
        \item すばらしい
                \begin{itemize}
                \item スバラシス!!!
                \end{itemize}
        \end{itemize}
\section*{女子力について}
        \begin{itemize}
        \item 合コンで役立つ能力
                \begin{itemize}
                \item 合コン:合同コンパイル
                %begin{texmode}
                \[
                女子力 = \int_{0}^{コア数} 女装力^{x} dx
                \]
                %end{texmode}
                \end{itemize}
        \item Gentooのインストールできないんですぅ・・・
                \begin{itemize}
                \item これで相手もメロメロやで
                \end{itemize}
        \end{itemize}
\end{document}

こんな感じに出力されます.
そして,こんな感じに仕上がるのです・・・!!






すばらしいじゃないですか!

記法とか

  • タブインデントで項目を分けます
    • タブなしだと\section*{}になります
  • %begin{texmode}, %end{texmode} でそのまま出力するかどうかを切り替えます
    • 数式とか書く時はモード切り替えましょう

個人的には当面は多分これで事足りると思いますが,個人的にはPerlのコードとか埋め込めれば便利かなぁとか思ってます.

Pythonで書いてみた

#! /usr/bin/env python
# -*- coding: utf-8 -*-
import sys, re

CurrentDepth = 0
texmode = False
START = 0
END = 1

newDepthTag = [['', ''], ['\\begin{itemize}', '\\end{itemize}']]
depthTag = [['\\section*{', '}'], ['\\item ', '']]
isWhiteSpace = re.compile(r'^[ \t\r\n]*$')
isComment = re.compile(r'^[ \t\r\n]*%.*')

def sign(num) :
    if num == 0 :
        return 0
    elif num > 0 :
        return 1
    else :
        return -1

def countTab(line) :
    tabs = 0
    while line[tabs] == '\t':
        tabs += 1
    return tabs

def simplify(line) :
    while line[0] == '\t' :
        line = line[1::]
    return re.sub('\n', '', line)

def changeTexMode(line) :
    if plainline == '%begin{texmode}' : return True
    elif plainline == '%end{texmode}' : return False

# begin document
print '\\documentclass{jsarticle}'
print '\\begin{document}'

# input lines from stdin
for line in sys.stdin:
    if isWhiteSpace.match(line) != None :
        continue

    depth = countTab(line)
    plainline = simplify(line)

    m = changeTexMode(plainline)
    if m != None :
        texmode = m
        print line,
        continue

    if texmode == True :
        print line,
        continue

    if isComment.match(line) != None :
        print line,
        continue

    if depth > CurrentDepth :
        CurrentDepth = depth
        print "%s%s" % ('\t'*CurrentDepth, newDepthTag[sign(CurrentDepth)][START])
    elif depth < CurrentDepth :
        for i in range(CurrentDepth - depth) :
            print "%s%s" % ('\t'*(CurrentDepth-i), newDepthTag[sign(CurrentDepth-i)][END])
        CurrentDepth = depth

    print "%s%s%s%s" % ('\t' * CurrentDepth, depthTag[sign(CurrentDepth)][START], plainline, depthTag[sign(CurrentDepth)][END])

# close blocks
for i in range(CurrentDepth) :
    print "%s%s" % ('\t'*(CurrentDepth-i), newDepthTag[sign(CurrentDepth-i)][END])
CurrentDepth = 0

# end document
print '\\end{document}'

使い方とか

標準入力から読んで標準出力に吐くようになってるので,適当にtxt2tex.pyとか名前つけて

./txt2tex.py < input.txt > output.tex && platex output.tex && dvipdfmx output.dvi

とかすると,PDFになってうれしいね!

よしよし,これで煩わしいノート取る作業もちょっと楽になりそう.