グレインの備忘録

プログラミング関係とかをつらつらと。

LibreOffice DrawでLaTeX文書用の格好良い図を作る

巷のLaTeX文書によく埋まってるかっこいいグラフや図を自分で作ってみる。

LibreOffice Drawで図を描く

LibreOffice Drawはドロー系の描画ソフトで、ベクター画像を生成することができる。

ラスタ画像とは違って拡大してもぼやけたりすることがないのが特徴である。(要するに形状そのものの情報を出力する)

グラフっぽい図を書いてみる

Drawでは式を指定してグラフを描くことはできないが、ベジェ曲線を用いて概形を描くことはできる。

試しに三次関数っぽいグラフを作ってみる。

まずは矢印ツールで座標平面を作る。

f:id:grainrigi:20171008234439p:plain

次に、ベジェ曲線描画ツールを使ってグラフ本体を描く。

f:id:grainrigi:20171008235524p:plain

このツールには癖があり、以下のように制御点を配置する。

  1. 最初の制御点の位置でクリック
  2. そのままマウスをドラッグして制御バーを伸ばす
  3. 伸ばせたらマウスボタンを離し、次の制御点の位置をクリック
  4. そのままマウスをドラッグして制御バーを伸ばす
  5. 以降その繰り返しで、終点ではマウスをダブルクリック

正直操作性が悪いので一発ではうまく行かない。(ホントは制御点だけポチポチ配置できればいいのだが。)

後から修正するには曲線を選択し右クリックメニューから「制御点の編集」を有効にする。

f:id:grainrigi:20171009001447p:plain

手動で調整するとそれなりの形ができる。

f:id:grainrigi:20171009001752p:plain

TeX数式を挿入する

Drawはプラグインを導入することでTeXの数式を挿入できる。

TexMaths Homepage

このサイトからプラグインをダウンロードできる。

導入後Drawを再起動すると、左上にメニューが現れる。

クリックすると入力画面が現れるので、TeX数式を入力すれば良い。

ただし、横の「Transparency」にチェックを入れるのを忘れないこと。(これをしないと背景が白くなってしまう)

適当に字を付けてみた。

f:id:grainrigi:20171009004240p:plain

LaTeX文書に画像を埋め込む

先ほどの画像をLaTeX文書に埋め込んでみよう。

まずは、Drawのツールバーの、保存ボタンの右の「エクスポート」からエクスポートする。

形式は必ず「EPS」にし、文書と同じディレクトリに保存する。

あとは、以下のようにして埋め込む。(ここでは「image.eps」に保存したと仮定する。)

\documentclass{jsarticle}
\usepackage{graphicx}

\begin{document}
画像を挿入
\begin{figure}[h]
  \centering
  \includegraphics{image}
  \caption{グラフ}
\end{figure}
\end{document}

ポイントとしては、

  • \usepackage{graphicx}が必須(\includegraphics用)
  • \begin{figure} 〜 \end{figure}内に図を配置する
  • \begin{figure}の後ろの[]には配置指定子を入れる。h:その場所、t:ページ上部、b:ページ下部、p:別ページ
  • \captionで図の名前を入れられる(番号は自動振り)

文書例

さっきの図とは違うものだが、図とLaTeXを活用すればこのような文書もできる。

ソース

\documentclass{jsarticle}
\usepackage{graphicx}
\usepackage[top=30truemm,bottom=30truemm,left=30truemm,right=30truemm]{geometry}

\begin{document}
\large

\section{微分の基本定義}

まずは、関数$y=f(x)$の平均変化率を考えてみる。
\begin{figure}[h]
    \centering
    \includegraphics[width=95mm]{diff}
    \large
    \caption{関数の平均変化率}
\end{figure}

$x$$a$から$\Delta x$だけ変化した時の$f(x)$の平均変化率は、図のように変化前後の2点を通る直線の傾き、即ち$\frac{\Delta y}{\Delta x}$で表される。ここで、$\Delta x$を0に近づけていくと、2点を結ぶ直線は$x=a$における接線に近づいていく。$\Delta x$を限りなく0に近づけていった時の直線の傾き、即ち瞬間の変化率を関数$f(x)$$x=a$における微分係数といい、

\[f'(a)=\lim_{\Delta x \to 0} \frac{\Delta y}{\Delta x} = \lim_{h \to 0} \frac{f(a+h)-f(a)}{h}\]

というふうに記号$f'(a)$を用いて表す。

さらに、関数$f(x)$の任意の点における微分係数を表す関数を導関数といい、記号$f'(x)$で表される。


\end{document}

文書

f:id:grainrigi:20171009005914p:plain

かなり格好いい感じになる。

NeomakeでC++11の構文チェック

以前の記事でNeomakeによる構文チェックを行っていたが、C++11のキーワードを認識してくれないようだ。

やり方を調べたらドンピシャのページがあった。

github.com

tomlに赤字部分を書き足した。

repo = 'neomake/neomake'
 on_i = 1
 hook_post_source = '''
    autocmd! BufWritePost * Neomake
    let g:neomake_cpp_enable_markers=['clang']
    let g:neomake_cpp_clang_args = ["-std=c++14", "-Wall"]
    let g:neomake_cpp_clangcheck_args = ["-std=c++14", "-Wall"]
 '''

C++11対応のみならず、任意のコンパイルオプションを渡せる模様。

なお、最初のenable_makersの必要性は謎である。

Gitで部分コミット・Hunk破棄など

SourceTreeから乗り換えて、生のGitを使っている中でHunkの取り扱いがわからなかったのでメモ。

Hunkのステージ(部分コミット)は git add -p

基本は「-p」オプションを付ければうまくいく。

ステージングの場合においては、

$ git add -p [file]

とすることで、以下のようにHunkごとに取り込むか否かを聞いてくる。

$ git add -p dein_lazy.toml
diff --git a/nvim/dein_lazy.toml b/nvim/dein_lazy.toml
index 848ac2a..56daa89 100644
--- a/nvim/dein_lazy.toml
+++ b/nvim/dein_lazy.toml
@@ -57,4 +57,7 @@ on_i = 1
 [[plugins]]
 #neomake
 repo = 'neomake/neomake'
-
+on_i = 1
+hook_post_source = '''
+   autocmd! BufWritePost * Neomake
+'''
Stage this hunk [y,n,q,a,d,/,e,?]? 

yで取り込み、nで取り込まない、となる。

?を入力すると他のコマンドの意味も出てくる。

y - stage this hunk
n - do not stage this hunk
q - quit; do not stage this hunk or any of the remaining ones
a - stage this hunk and all later hunks in the file
d - do not stage this hunk or any of the later hunks in the file
g - select a hunk to go to
/ - search for a hunk matching the given regex
j - leave this hunk undecided, see next undecided hunk
J - leave this hunk undecided, see next hunk
k - leave this hunk undecided, see previous undecided hunk
K - leave this hunk undecided, see previous hunk
s - split the current hunk into smaller hunks
e - manually edit the current hunk
? - print help

sでHunkを分割したり、eで編集したりできるようだ。

Hunkのアンステージは git reset -p

当該ファイルにステージ済みのHunkがある場合には、

$ git reset -p [file]

とすることでHunkのアンステージを行える。

操作はgit add -pと同じである。

Hunkの破棄は git checkout -p

Hunkの破棄は

$ git checkout -p [file]

でできる。操作は上2つと同じである。


また、いずれのコマンドにおいても、ファイル名を指定しないと全ファイルを対象にコマンドを実行したのと同じになる。

NeomakeでC++の自動構文チェックをやらせてみる

Vimで自動構文解析といえばsyntasticだったが、チェック中は動作をブロックしてしまうので微妙だった。

NeoVimではリモートプラグインが導入され、このような問題を解決できるものが登場したので使ってみる。

NeoMakeを入れる

github.com

今回使うのはこのNeoMakeというもの。

構文チェックだけでなく、いわゆるmakeコマンドの代わりもしてくれるらしい。

インストールは、tomlに

[[plugins]]
repo = 'neomake/neomake'
hook_post_source = '''
    autocmd! BufWritePost * Neomake
'''

と書く。保存時に:Neomakeを実行するのは、syntasticの時と同じで自動補完は実行してくれないから。

使い方

使い方というほどのこともないが、普通にソースを開いて「:Neomake」を実行すれば良い。

Ubuntu16.04にTex環境を整える

LaTeXを使ってみたかったのでUbuntuに入れてみた。

基本苦労することはなかったが入れ方を一応メモ。

インストール手順

必要なのは、

の二つ。

Ubuntuの場合は

$ sudo apt -y install texlive texlive-lang-japanese

で済む。

使い方

まずは入門サイトなど参考にTeX文書を作る。

LaTeX入門 - TeX Wiki

完成したら保存する。

コンパイル

例えば「test.tex」に保存したとすると、

$ platex test

でdviファイルが生成される。

あとはこれをpdfに変換すればいいので、

$ dvipdfmx test.dvi

でpdfが生成される。

若しくは、一発でpdfに変換するには

$ ptex2pdf -l test

とすればよい。

Cmake+Ninjaでビルドをやってみる

最近プログラムをビルドするのにCmakeを使い始めてみた。

Cmakeでは、軽量な動作で有名なNinja用のファイルを生成できるらしいので試してみる。

Ninjaのインストール 同名のパッケージにご用心

早速入れてみようと、安直に以下のコマンドを実行。

$ sudo apt -y install ninja

ところが、

$ cmake . -G Ninja

とするとエラーが。

-- The C compiler identification is GNU 5.4.0
-- The CXX compiler identification is GNU 5.4.0
-- Check for working C compiler using: Ninja
CMake Error:
  The detected version of Ninja (0.1.3) is less than the version of Ninja required
  by CMake (1.3).


CMake Error: Internal CMake error, TryCompile generation of cmake failed
-- Check for working C compiler using: Ninja -- broken

バージョンが古くて怒られている模様。確かに、

$ ninja --version
log: ninja version 0.1.3 initializing

と出るので、バージョンが低いらしい。apt提供のパッケージが古いのか?と思い

$ apt search ninja

とすると、

ninja/xenial,now 0.1.3-2 amd64 [インストール済み]
  GNU/Linux 用特権昇格検知システム

ninja-build/xenial,now 1.5.1-0.1ubuntu1 amd64 
  small build system closest in spirit to Make

ninja-build-doc/xenial,xenial 1.5.1-0.1ubuntu1 all
  documentation for ninja-build

ninja-ide/xenial,xenial 2.3-2 all
  integrated development environment (IDE) for Python

と出てきた。どうやらさっきのninjaはビルドツールではなかったらしい。

気を取り直して

$ sudo apt -y remove ninja
$ sudo apt -y install ninja-build

として入れなおす。これでうまく行くだろう。

ツールチェインの切り替えにご注意

ところが、

$ cmake . -G Ninja
-- The C compiler identification is GNU 5.4.0
-- The CXX compiler identification is GNU 5.4.0
-- Check for working C compiler using: Ninja
CMake Error:
  The detected version of Ninja () is less than the version of Ninja required
  by CMake (1.3).


CMake Error: Internal CMake error, TryCompile generation of cmake failed
-- Check for working C compiler using: Ninja -- broken

またもやエラー。今度はバージョンが検出されていない模様。

調べてみると、以下のページに行き当たった。

github.com

以下引用

"if previously build dir already configured , but ninja executable is moved, cmake didn't report command not found ,but reports "The detected version of Ninja ("") is less than the version of Ninja required by CMake ("1.3") which is confused."

要するに、残骸が残っているとダメということらしい。ということで、

$ rm -rf CMakeFiles CMakeCache.txt cmake_install.cmake Makefile
$ cmake . -G Ninja

というふうに残骸を消してやるとうまく行った。

確かに軽量だが出力がログみたいに残らずに消えてしまうのが少し残念かもしれない。

リンクが倍速くなるらしい「lld」を試す

最近、ビルトインのldによるリンクの遅さが気になってきた。

そこで、もっと高速なリンク方法がないか探してみたところ、いくつかの新しいリンカに辿り着いた。

GNU goldよりも2倍早いlld

高速なリンカとしてはGNU goldが割と有名らしいが、それよりも更に高速なlldというものを見つけた。

https://lld.llvm.org/

このページ曰く「GNU goldの2倍高速で」動作するらしい。

lldのインストール

Ubuntu 16.04 (Xenial Xerus) にはパッケージがあるようなので入れてみる

sudo apt -y install lld-4.0

これでld.lldが利用可能になる。

ついでに、ldのシンボリックリンク切り替えの設定もしておく。

参考: qiita.com

sudo update-alternatives --install "/usr/bin/ld" "ld" "/usr/bin/ld.lld" 30
sudo update-alternatives --install "/usr/bin/ld" "ld" "/usr/bin/ld.gold" 20
sudo update-alternatives --install "/usr/bin/ld" "ld" "/usr/bin/ld.bfd" 10

これで登録は完了で、あとは

sudo update-alternatives --config ld

とすることでldの切り替えができる。

実際に使ってみた感じとしてはやはり数倍早くなっている感じだ。
少し待たされるようなジョブも一瞬で終わるようになった。
おそらくconfigureの速度を大きく改善するであろう。