人生の人生

日常のゴミ捨て場

???「効率的な環境を整備したところで,研究しなきゃ意味なくない?」

この記事は東京大学航空宇宙工学科/専攻 Advent Calendar 2019の2日目の記事です.

0. はじめに

どうもこんばんは,人生さんです.助けてください.
人生さんは勉強も研究にロクにしていないので他の人のような学術的なアドベントカレンダーは書けません.
そこで,勉強と研究をなおざりにしつつかき集めたしょうもないtipsを遺言として書き記しておこうと思います.
知っている人にとっては当たり前な,しょうもないtips集ですが,ほんの数人かのほんの少しの労力だけでも削減できればいいなと思います.
記事の対象はもっぱらWindowsユーザーですので,シャレオツまか~やリナックスチョットデキルメン/ウーメンには読む価値はほとんどないものと思います.

1. エクスプローラー編

Windowsユーザーはファイルの操作にエクスプローラーを多用するものと思います.
しかしGUI操作はやはり疲れるので(疲れるとは言っていない),できればキーボードで操作したいものです.

移動・ファイル操作

以下に示すキー操作は全てエクスプローラーのウィンドウがアクティブになっている状態で有効です.
ウィンドウがアクティブになっていない場合は,Alt+Tabキーでアクティブにするか,ウィンドウの適当なところをクリックしてください.

まず,Alt+↑で上のディレクトリに移動できます.

f:id:sktakefumi:20191201124206g:plain
Alt+↑で上のディレクトリに移動.
あるディレクトリに入った後,カーソルは一番上のファイルまたはディレクトリにいます.
この状態でSpaceキーを押すと,一番上のファイルまたはディレクトリが選択される状態になります.
この"選択状態"になっていると,お馴染みのCtrl+Cが使えたり,Enterキーで既定のアプリに遷移できたりします.
ディレクトリを選択している場合はそのディレクトリに移動できます.
f:id:sktakefumi:20191201125407g:plain
Spaceキーによる選択+Enter.
また,上下矢印キーでファイルへのカーソルを移動することもできます.
あるディレクトリに入った直後に↓キーを押すと,カーソルは2つ目のファイルで有効になります.
これはおそらく,カーソルの初期位置が1つ目のファイルだからだと思っています.
f:id:sktakefumi:20191201142418g:plain
上下キーによるカーソル移動.
カーソル移動はファイル名によっても可能です.
あるディレクトリにいるときにファイルの名前を打ち込むと,そのファイルに逐次カーソルが飛んで選択状態になってくれます.
検索順は現在のカーソル位置の1個下から下方向で,折り返し検索が有効です.
f:id:sktakefumi:20191201144130g:plain
ファイル名押下によるカーソル移動.
このキー入力は一定時間(1秒くらい?)の間,連続した打ち込みが可能で,一定時間待つかEscキーで入力をリセットできます.
実際に使うには,ファイル名全てを打ち込むのではなくて,お目当てのファイルに近いところまでファイル名押下で移動して,上下キーで移動,という感じでしょうか.

以上に挙げたキー操作で,エクスプローラー内での移動はほとんどキーボードだけで完結できるかと思います.

アドレスバー

アドレスバーで,パスが通っているコマンド,プログラムを走らせることができます.
Alt+Dでカーソルが移動して入力できる状態になるほか,F4でアドレスバーに打ち込んだことがあるコマンドの履歴が表示・選択できます.
ここから起動したプログラムは,作業パスがエクスプローラーでのパスに設定された状態で起動されます.
このディレクトリにあるファイルをgnuplotで可視化したい,gvimで開きたい,なんて時に役立ちます.
一応起動オプションを渡すこともできます(e.g. "gvim hoge.txt")が,履歴が汚れるのであまり使いたくありません.

f:id:sktakefumi:20191201153152g:plain
Alt+Dによるアドレスバーの選択とコマンドの実行.

小ネタ
  • Spaceキーで選択/選択解除はShift/Ctrlキーと併用すると楽しい.

f:id:sktakefumi:20191201155057g:plain
Spaceキーによる選択/選択解除とShift/Ctrlキーの併用.

  • F2キーでファイル名を変更できる.
  • Alt+Enterでオプションを開ける.
  • Shift+Deleteでゴミ箱を介さずにファイルを消せる.大いなる力には大いなる責任が伴うので注意.
  • Ctrl+Shift+Nで新しいフォルダを作れる.
  • 左上のかどっこをダブルクリックするとウィンドウを消せるって友達のげってぃ君が言ってた.

2. PowerShell

PowerShellを使おう

みんなもっとPowerShellを使えばいいのにと思っています.
(ちなみに私は未だにPowerShell v6を導入せずにv5を使っているし,Windows Terminalも試していないのであまり上から言えない)
例えば,理系の大学生のWindowsユーザーがターミナル(厳密にはPowerShellはシェルらしい)を使う用途ってほとんどがSSH接続用だと思うんですが(偏見),やれputtyやらやれCygwinやらを構築する必要もなく,PowerShellと最近のWindows10にデフォルトで入っているOpenSSHクライアントとの組み合わせで事足ります.
百歩譲ってWSL.使ったことほとんどないけどCygwinは無いと思ってる.
ちょっとしんどいけどX11も導入できます.
意外にもtarコマンドもデフォルトで入っている(C:\WINDOWS\system32\tar.exe)ので,unix系サーバとのファイルのやり取りもできます.
ただ,文字コードとか,その他の謎のエラーには非常に困らされるのが欠点.
ほとんどの人はPowerShellなんか使わないので,とにかく情報が少ないのである.

  • PowerShellのイイところ
    • Windows機に標準で入っているので導入に管理者権限を必要としない
    • 雑なスクリプトでも意外と動く
  • PowerShellのクソなところ
    • 起動が遅くてクソ
    • 文字コード周りのアレがあまりにもクソ
    • 関数名がクソ
    • 情報が少なくてクソ
    • 結局Bashにはなれないからクソ
    • とりあえずクソ
色とフォント

フォントはともかく,デフォルトのPowerShellの配色は本当に酷い.
よほど頭がおかしくないと作れないだろってくらいに酷い.
Quality of PowerShell Lifeを上げるためにはカラースキームを適用することをお勧めします.
そのときの奮闘記がこちら.
sktakefumi.hatenablog.com
ただ,配色に関してはもしかしたら既存のWindowsのメジャーアップデートで既に改善されているかも?
ちなみに,この変更は全てのターミナルっぽいソフト(cmd.exe,gnuplot.exe,Git Bash.exe,vim.exe,python.exeなど)に適用されます.

プロンプトの変更

私はposh-gitを導入しているので,posh-git経由でプロンプトをカスタマイズしています.
github.com

Import-Module posh-git
$GitPromptSettings.DefaultPromptPath.ForegroundColor='DarkOrange'
$GitPromptSettings.DefaultPromptBeforeSuffix.Text = '`n $(Get-Date -f "HH:mm:ss") '
$GitPromptSettings.DefaultPromptBeforeSuffix.ForegroundColor = [ConsoleColor]::Magenta

上記の設定で下図右のようになります.

f:id:sktakefumi:20191129234130p:plainf:id:sktakefumi:20191129234134p:plain
PowerShellプロンプトのカスタマイズ.左: デフォルト,右: カスタマイズしたもの.
posh-gitを導入していなくても,$PROFILEに下のコードを書き足してprompt関数を上書きすれば変更できます.

function prompt{
  (Get-Host).UI.RawUI.WindowTitle = $pwd
  Write-Host (Get-Location) -ForegroundColor Yellow
  Write-Host (" " + (Get-Date -f "HH:mm:ss") + " ") -NoNewLine -ForegroundColor Magenta
  Write-Host ('>' * ($nestedPromptLevel + 1)) -NoNewLine
  return " "
}
小ネタ
  • Windowsキーから起動できるショートカット(C:\Users\USER\AppData\Roaming\Microsoft\Windows\Start Menu\Programs\Windows PowerShell)は作業フォルダを変更できる.
    • 例えば%HOMEDRIVE%%HOMEPATH%としておけばBash風にC:\Users\USER\で起動してくれる.
  • チルダ"~"でC:\Users\USER\のTab補完が効く.

f:id:sktakefumi:20191130230720p:plainf:id:sktakefumi:20191130230724p:plain
PowerShell小ネタ.左: 作業フォルダの設定,右: "~"の使用.

  • パスは基本的にはスラッシュとバックスラッシュ両方受け付けてくれる.なんやねん.
    • コマンドによっては片方しか受け付けないかもしれない.
  • start (パス)で,パス位置でエクスプローラーを開いてくれる.
  • PowerShellはなぜかAlt+F4でウィンドウを閉じられない.
    • Exitと打ち込むか,viモードの場合はCtrl+Dで消せる.
  • 環境変数にパスをぽこじゃか通してるとunixライクなコマンドが衝突しうるので注意.

3. vim

便利な設定
alias emacs='vim'
vim-plug

プラグイン管理はvim-plugが良いと思っています.
github.com
別途Gitが必要ですが,導入が簡単ですし,vimrcの記述も非常に簡単です.

vim-plugの設定例を展開

"vim-plug
call plug#begin('~/vimfiles/plugged')
  Plug 'lervag/vimtex'
  Plug 'Yggdroot/indentLine'
  Plug 'tomasr/molokai'
  Plug 'tyru/caw.vim'
  Plug 'bronson/vim-trailing-whitespace'
  Plug 'PProvost/vim-ps1'
call plug#end()


guifontwide

シンタックスハイライトによって文字が斜体で装飾されるとき,下図左のように,文字が1文字分の枠を超えて隣の文字と重なってしまうことがある.

f:id:sktakefumi:20191128230944p:plainf:id:sktakefumi:20191128230946p:plain
vimシンタックスハイライトによって斜体字が重なる様子.左: 修正前,右: 修正後.
これはgvimrcで

set guifont=Consolas:h12
set guifontwide=MS_Gothic:h12

のように,guifontで英数字用フォント,guifontwideで日本字用フォントを個別に指定することで解消できる.
日本語版vimユーザーが多く使っているであろうkaoriyaさん版vimに同封されているgvimrcは,初期状態で

set guifont=MS_Gothic:h12:cSHIFTJIS

としか書かれていない.
このため,斜体フォントが用意されていない日本語用フォントを無理やりせん断変形することで,隣の字に重なるということが生じるらしい.

vimrc小ネタ
set shellslash
set isfname-={,}

1つ目はパス補完とかで出るパスの区切り文字を"\"から"/"に変更する.
2つ目は最近知ったもので,波かっこ"{"の後でのCtrl-X+Ctrl-Fによるパス補完を有効にする.
Windowsではファイル名に"{ }"を含められないための処置が関係しているのだろう.

f:id:sktakefumi:20191129231853g:plain
波かっこの後のCtrl-X+Ctrl-Fによるパス補完.

4. LaTeX

コーディング環境について

\LaTeXのコーディング環境にはTeXworksやTeXstudioのような統合環境があるようですが,私はvimで書いてます.
vimユーザーかつ\LaTeXユーザーの方にはぜひvimtexをお勧めしたいです.
github.com
このプラグインはハチャメチャに高機能で,各種コマンドが利用可能になるほか,例えば適切なlatexmkの設定をしていれば,コードの変更を検知して再コンパイルしてくれたり,

f:id:sktakefumi:20191123182054g:plain
latexmkとの連携による逐次コンパイル.実際にすごいのはlatexmkである.
ログをパースしてquickfixウィンドウに出してくれて,エラー箇所にジャンプできたり,
f:id:sktakefumi:20191123182326g:plain
エラーの表示と該当箇所へのジャンプ.
文書をパースして,本文との行き来が可能なtable of contentsを作ってくれたりします.
f:id:sktakefumi:20191202201546g:plain
目次の作成,表示と該当箇所へのジャンプ.
機能が多すぎて未だに全機能を把握しきれていませんが,簡単なコマンドだけでも大きな助けになります.

vimtexは設定がめんどくさいので,私のvimrcをupしておきます.

vimtex用vimrcを展開

""" vimtex
let g:tex_flavor='latex'
let g:tex_conceal=''
let g:vimtex_include_search_enabled=0
let g:vimtex_fold_enabled=1
let g:vimtex_fold_manual=1
let g:vimtex_fold_types = {
      \ 'comments' : {'enabled' : 1},
      \}
let g:vimtex_complete_close_braces=1
let g:vimtex_complete_ref = {
      \ 'custom_patterns': [
      \     '\\tref\*\?{[^}]*$',
      \     '\\eref\*\?{[^}]*$',
      \     '\\fref\*\?{[^}]*$',
      \     '\\sref\*\?{[^}]*$'
      \   ]
      \}
let g:vimtex_compiler_latexmk={
      \ 'backend': 'jobs',
      \ 'background': 1,
      \ 'build_dir': '',
      \ 'continuous': 1,
      \ 'executable': 'latexmk',
      \ 'options': [
      \    '-lualatex',
      \    '-file-line-error',
      \    '-synctex=1',
      \    '-interaction=nonstopmode',
      \ ],
      \}
let g:vimtex_view_general_viewer='C:\PROGRA~1\SumatraPDF\SumatraPDF.exe'
let g:vimtex_view_general_options='-reuse-instance -forward-search @tex @line @pdf'
let g:vimtex_view_general_options_latexmk='-reuse-instance'
let g:vimtex_quickfix_latexlog = {
      \ 'ignore_filters' : ['Package caption Warning'],
      \}


TeXworksやTeXstudioを使うにしても,最低限latexmkとの連携はしておくと幸せになれると思います.

gnuplot-lua-tikz

グラフの貼りこみにはgnuplot-lua-tikzを使っています.
例えば以下のgnuplot設定ファイルを書いて,

gnuplotのコードを展開

reset session

set term tikz size 144mm, 81mm
set output "graph.tex"

set key outside top center box Left spacing 4 width -18
set xl "$x$"
set yl "$y$"

set xtics pi format "$%.1P\\pi$"
set mxtics 4
set mytics 5

set xr[-2*pi:2*pi]
set yr[-1.5:1.5]

f(x, n) = sum[m = 1:n] 4.0 / pi / (2*m-1) * sin((2*m-1)*x)

set samples 1000
plot f(x, 10) w l t "$\\displaystyle f(x) = \\sum_{n=1}^{10} \\frac{4}{(2n-1)\\pi} \\sin ((2n-1)x)$, cited from \\cite{cite:graph}"

set output


出力されるgraph.tex\LaTeXで\inputすると(タイプセットはLuaLaTexを使っています),

\begin{figure}[htbp]
  \centering
  \input{fig/graph.tex}
  \caption{Gnuplot-lua-tikzによるグラフ描画の例.}
  \label{fig:graph}
\end{figure}

このような絵が描けます.

f:id:sktakefumi:20191123165143p:plain
Gnuplot-lua-tikzによるグラフ描画の例.
次のようなメリット/デメリットがあると思っています.

  • 良いところ
    • グラフ中に\LaTeXの書式を使える
    • 文献などの相互参照をねじ込むことも可能
    • フォントサイズが文書基準に決定されるので図中の字の大きさに気を配らなくていい
  • 悪いところ
    • 設定ファイルを書くのにクソ手間がかかる
    • 後述の\linewidthでグラフ幅を指定したいけどできない
    • 凡例の余白に\LaTeXのコマンドの文字数が反映されてしまうので調整がめんどい
    • 点数が多いグラフだとコンパイルと描画が遅くなる
    • 作ったグラフをパワポスライドに流用しづらい
    • 正直PDFでいい

== 2019/12/2 15時追記 ==
vimtex環境下でgnuplot-lua-tikzによるgraph.texを大量に\inputしていると,main.texの読み込みにえらい時間を食うようになる.
graph.texの実態はtikzのコマンドとベクターのパスを羅列している長大なファイルなため,読み込みやらパースやらなんやらに時間がかかるのであろう.
加えて,例えばmain.texをテンプレとして利用するために,graph.texが存在しない別のディレクトリに移した場合(移すな),graph.texが見つからないので,kpsewhichコマンドでgraph.texを検索し始めてしまい,さらに時間がかかる.
この\inputによる*.texの検索とパースは

let g:vimtex_include_indicators = ['include', 'subfile']

とすれば無効にできる.

==== さらに追記 ====
g:vimtex_include_indicatorsからinputを除くと,\input{}後のCtrl-X+Ctrl-Oファイル名補完が効かなくなってしまう.
流石にこの設定はできなさそうなので,その場しのぎにvimtex/autoload/vimtex/complete.vim内のs:completer_incをちょろっと書き換えて\input{}でも補完が効くようにした.
==== さらに追記終わり ====

== 追記終わり ==

図の大きさについて

\linewidth基準で指定するのが幸せだと思う.
\linewidthを超えるようなデカい図を貼りたい場合(貼るな),\includegraphicsを\makebox[0pt][c]{}で囲ってあげれば下図のように中心に来てくれる.
横並びの図をできるだけ大きく貼りたいときに便利.
だけど,正式な文書だと\linewidthを超えて図を貼りこむのはいかがなものかとも思う.

f:id:sktakefumi:20191123192718p:plain
\linewidthを超えるような大きな図を貼りたい場合.

texソースコードを展開

\begin{figure}[htbp]
  \centering
  \includegraphics[width=1.1\linewidth, height=30mm]{example-image-a}
  \caption{めっちゃでかい図が右に寄るでござる.}
  \label{fig:meccha_dekai_zu_zureru}
\end{figure}

\begin{figure}[htbp]
  \centering
  \makebox[0pt][c]{
    \centering
    \includegraphics[width=1.1\linewidth, height=30mm]{example-image-b}
  }
  \caption{めっちゃでかい図が中心に来るでござる.}
  \label{fig:meccha_dekai_zu_mannnaka}
\end{figure}

\begin{figure}[htbp]
  \centering
  \makebox[0pt][c]{
    \begin{minipage}[c]{0.6\linewidth}
      \centering
      \includegraphics[width=1\linewidth, height=30mm]{example-image-a}
      \subcaption{minipageの幅は0.6\textbackslash linewidth}
      \label{fig:meccha_dekai_zu_mannnaka_1maime}
    \end{minipage}
    \begin{minipage}[c]{0.6\linewidth}
      \centering
      \includegraphics[width=1\linewidth, height=30mm]{example-image-b}
      \subcaption{minipageの幅は0.6\textbackslash linewidth}
      \label{fig:meccha_dekai_zu_mannnaka_2maime}
    \end{minipage}
  }
  \caption{できる限り大きく横並びの図を貼りたいんじゃ.}
  \label{fig:meccha_dekai_zu_mannnaka_2mai}
\end{figure}


体裁,禁止コマンドについて

文書の本質は当然ながら体裁より内容ですが,私はロクな内容が書けないので体裁を整えるのが趣味と化しています.
禁止コマンドはここ参照
ichiro-maruta.blogspot.com

体裁についてはこれら参照
qiita.com
qiita.com

5. その他

Officeにベクタ画像を貼るには

私はベクタ画像教教徒なのでOfficeの文書にもベクタ画像を貼りたくなります.
Mac版ならPDFでもSVGでもサクッと貼れるのですが,Windows版で貼るならEMFにするのが吉です.
EMFとSVGを比較すると,下図のように,編集画面上では,線の太さに多少の差はあるものの両者ともイイ感じに見られるのですが,

f:id:sktakefumi:20191123224554p:plain
パワポ上での編集画面.
PDFとして出力しようとするとSVGはどうも不安定になります.
下図は,左がエクスポート>PDF/XPSの作成,右が印刷>Microsoft Print to PDFで印刷,でPDFを作成したものです.
左ではSVGの線の太さがEMFに比べて太く,右ではSVGが謎の低解像度JPGに変換されてしまっています.
謎です.
f:id:sktakefumi:20191123224936p:plainf:id:sktakefumi:20191123225031p:plain
PDF出力.左: エクスポート>PDF/XPSの作成,右: 印刷>Microsoft Print to PDFで印刷.

gnuplot小ネタ
  • statsコマンドを使えば合計値や標準偏差などの基本的な統計量がサクッと得られる.
  • helpコマンドでヘルプが読める.

f:id:sktakefumi:20191130233136p:plain
gnuplotのヘルプ.

  • ~/.gnuplotgnuplotのデフォルトが設定できる.(gnuplotのインストールフォルダ)/share/gnuplotrcがテンプレ.
    • 下のように書けば,罫線を描画させて,線の色をRGBの原色系にして,現在のパスを表示するようにできる.
set grid xtics ytics mxtics mytics lt -1 lc rgb "gray30", lt -1 lc rgb "gray"
set colorsequence classic
pwd

6. まとめ

研究しないでこんなことばっかりやってる院生になっちゃダメだよ.