LaTeX でソースコードを貼る listings についてのメモ。 毎回過去に書いた .tex ファイルを掘り返していて効率が悪かったので。
いろいろ設定 \usepackage{listings} \lstset{basicstyle=\ttfamily\footnotesize,frame=single,breaklines=true} 左側に小さく行番号を表示するような設定。 右からあふれた分は改行するようにするくらいしかやってない。
ネットの海を見に行ったらいろいろ細かく設定している人もいるので、やろうと思ったらいろいろできるのだと思う。
キャプション デフォルトだと「Listing 1 ほげほげ」みたいな名前になるので適当に変更。
\renewcommand{\lstlistingname}{リスト} これで「リスト1 ほげほげ」みたいになる。
ソースコードの埋め込み \begin{lstlisting}[caption=ほげほげ] hogehogehoge \end{lstlisting} みたいにするか
\lstinputlisting[caption=ほげほげ]{hoge.c} みたいにするか。
開始行番号をいじる \begin{lstlisting}[firstnumber=10,caption=ほげほげ] で ok
意外と検索しても出てこない (まあ TeXdoc に余裕で書いてあるけど見るのめんどくさいよね)。
なんでも pLaTeX が本格的にやばいかも らしい。pLaTeXやばいやばい話はこれまで何度も聞いた気がする。 ちょっと前に SATySFi 使ったりしたけど、あれはちゃんと SATySFi 書けないとあんまり満足度高くないので まあのんびり習得していけたらいいやと。
そういうわけで、とりあえず LuaLaTeX を使えるようにしておく。
LuaLaTeX について TeX を再実装した LuaTeX というやつに LaTeX のパッケージを乗っけたもの………だと思う。 あんまり正確なことは把握してないので気になった方はマサカリ投げてください…………。
まあ見た目は Lua が使える LaTeX という感じ。僕は Lua は日常会話レベル (ほんとか?) だけど TeX は海外旅行に行ったときに身振り手振りでなんとか意思疎通するレベルなので Lua が使えるのはけっこう嬉しい…気がする。
深さNのところをi, ii, iii,… というふうにしたいならば,
\renewcommand{\labelnumN}{\roman{enumN}} \romanの部分は選べる。
なまえ すたいる \alph a, b, c,… \Alph A, B, C,… \arabic 1, 2, 3,… \roman i, ii, iii,… \Roman I, II, III,… プリアンブルに書くと文書全体これになるので,一箇所だけに適用したければ enumerate 環境の中で \renewcommand する。おわり。
Word ファイルの場合,仕方ないので Microsoft Word とかで PDF に変換しておく。 LibreOffice とかでも一応 PDF は出てくるけどけっこう崩れる。
で,テンプレートファイルが PDF になったのでこれを1ページ1ファイルに分解する。
$ pdfseparate foo.pdf %d.pdf pdfseparate コマンドがない場合は poppler とかを入れる。
で以下のようにして背景に PDF を埋め込む。
\documentclass[uplatex,dvipdfmx]{jsarticle} \usepackage{wallpaper} \pagestyle{empty} \begin{document} \ThisCenterWallPaper{1}{1.pdf} ここにいろいろ書く \end{document} \pagestyle{empty} でページ番号を消す。
面倒くさいけど \vspace とかでテンプレートに合わせつつなんとかする。
余白が大きすぎる場合は geometry とかで調整する。
jsarticle を使う場合,フォントのサイズを調整すると背景がずれる(縮小して拡大するみたいな実装なので)ので, デフォルトにしておいて必要に応じて \fontsize{12pt}{0pt}\selectfont とかで調整する。
kvmap というパッケージが TeX Live にもともと入っていて,それを使えば簡単にカルノーマップを描画できる。
基本的な使い方は以下。
\documentclass[uplatex,dvipdfmx]{jsarticle} % カルノーマップの描画に必要 \usepackage{graphicx} \usepackage{kvmap} \begin{document} \begin{kvmap} \begin{kvmatrix}{A,B,C.D} 1 & 0 & 0 & 1 \\ 1 & 1 & 1 & 1 \\ 1 & 1 & 0 & 0 \\ 0 & 1 & 1 & 0 \\ \end{kvmatrix} \bundle{0}{1}{1}{2} \end{kvmap} \end{document} ちゃんと例を書くのが面倒なので一箇所しか囲んでいないが,
\bundle{x1}{y1}{x2}{y2} とするとその範囲に丸い囲みが描画される。 多分ここは完成した画像貼った方がいいんだろうけど面倒なので省略。
あとcolor=...を与えてやると色を変えたりとかも簡単にできる。
問題はここからで, \bundle[invert=true]{...} ってやると端と端を囲むことができるのだが, 例えば以下のような例だと縦の囲みか横の囲みかで曖昧になる。
\begin{kvmap} \begin{kvmatrix}{A,B,C} 1 & 0 & 0 & 1 \\ 1 & 1 & 1 & 1 \\ \end{kvmatrix} \bundle[invert=true]{0}{0}{3}{1} \end{kvmap} その結果下のようなカルノーマップが描画される。
TikZ を使い始めて間もないのであまりきれいに書けていないかもしれない。
ゲートを自分でゴリゴリ描く必要はなくて,そういった図形は提供してくれている。
プリアンブルに以下を書く。
\usepackage{tikz} \usetikzlibrary{shapes.gates.logic.US} で回路図を書くのは以下。
\begin{tikzpicture} \path (2, 3) node[or gate US,logic gate inputs={inverted,inverted},draw](A1){} (2, 2) node[or gate US,logic gate inputs={inverted,inverted},draw](A2){} (4, 2.5) node[and gate US,logic gate inputs={normal, normal},draw](A3){} (5.5, 1) node[or gate US,logic gate inputs={normal,inverted},draw](O1){}; \draw (A1.input 1) -- ++(-1.5, 0) ++(-0.2, 0.1) node {A} (A1.input 2) -- ++(-1.5, 0) ++(-0.2, -0.1) node {B} (A2.input 1) -- ++(-1.5, 0) ++(-0.2, 0.1) node {C} (A2.input 2) -- ++(-1.5, 0) ++(-0.2, -0.1) node {D} (A1.output) -- ++(0.5, 0) |- (A3.input 1) (A2.output) -- ++(0.5, 0) |- (A3.input 2) (A3.output) -- ++(0.5, 0) |- (O1.input 1) (O1.input 2) -- ++(-5.05, 0) ++(-0.2, 0) node {E} (O1.output) -- ++(1, 0) ++(0.2, 0) node {Y}; \end{tikzpicture} 入力を反転することもできて,inputs に inverted を入れれば良い。 また,縦に描画したい場合は rotate=270 とかする。
各入力と出力には名前がついていて,ゲートに付けた名前.input 入力の順番 と言った感じで 入力,出力からの線を簡単に描画できる。