Skip to content

Instantly share code, notes, and snippets.

@soh-i
Last active July 12, 2023 07:42
Show Gist options
  • Save soh-i/60ca403647f99e47c6eae001485d4e2f to your computer and use it in GitHub Desktop.
Save soh-i/60ca403647f99e47c6eae001485d4e2f to your computer and use it in GitHub Desktop.
Writing a thesis with Tex+Texpad

なぜTexで書く?

150ページ以上の英語のドキュメント (PhD thesis)を作成するにあたり、Wordはファイルを分割したり図や表を別のファイルに置いて、コンパイル時にだけ読み出したりすることができない。このため、最終的に巨大な重いファイルを編集してとてもつらまる可能性が目に見えていた。したがって、テキストベースの段組処理ソフトウェアであるTexを使って書くことにした。当初は2020年にもなってTex書くのかーという気分であったが、この選択は正解であったと思う。

Texで生成されたPDFは見た目は非常に美しい。またただのテキストなので好きなエディタで執筆できる。難点としては、独自の記法を覚える必要があること、それからエラーメッセージが不親切でどの個所がエラーなのかときに非常に分かりにくいところである。筆者は数年ぶりにtexを書いたので、ほぼ書き方を忘れていた。

Texは段組ソフトウェアなので、見た目のあらゆるカスタマイズが可能であるが、歴史的に蓄積された様々なノウハウ(謎のバッドノウハウやworkaround)がインターネット上にあふれており、良い感じにするために時間を消費しがちなところ。沼なので、あまり細部に入り込まないほうがよい。時短のためには最初によくできたテンプレートを拝借して、それを使うのがよいと思う。

最近だとOverleaf (https://ja.overleaf.com/) というオンラインでTexがかける環境も整備されているようで、もしかするとこっちのほうが時流なのかもしれない。とくに複数人で書く場合などは。Thesis用のtemplateはインターネットにいろいろあるが、例えばOverleafでは https://ja.overleaf.com/gallery/tagged/thesis にギャラリーがある。ダウンロードしてローカルで使うことも可能だ。

どのTexのディストリビューションを使うか

Texにはlatexやluatexなど様々なディストリビューションがあり、色々な違いがあるようだが、インストールが簡単でGUIのviewerなどが付属してくるものを使うのをおすすめする。Macなら、MacTex (https://tug.org/mactex/mactex-download.html) 一択であろう。MacTexは、TeX LiveというTex機能がほぼ全部入りのでかいパッケージで、Mac用のインストーラーである。MacTexには、Texのコンパイラの他にGUIのエディタTexShopやBibDeskという参考文献リストを管理するGUIソフトなどが付属してくる。一方、章に分割された大きなドキュメントを扱う場合、TexShopはいささか頼りない。たとえば編集しているファイルにリンクされた画像、参考文献リストなどが簡単に確認できたり、章の構造がわかり易くツリー構造で表示されたら便利ではないだろうか?Wordのようなわかり易いインターフェースでTeXを編集してコンパイルする環境がベストである。

これを実現するのがTexpad (https://www.texpad.com/) である。UIが美しい。3000円くらい ($29.99)する有償のソフトウェアであるが、ぜひ購入を検討されたい。

hoge

非常によくできたインターフェースのソフトウェアでとても使いやすい。現在、AppStoreと本家のサイトのどちらからも入手できるが、AppStoreから購入しないほうが良い。最新のMacOS (Catalina, version 10.15)では、ソフトウェアから他のソフトウェアなどを呼び出す機能が制限されており (Sandbox化)、AppStoreから購入できるバージョンでは自前のbuild scriptなどが使えない。このため本家のサイトから入手しないと旨味がない。ちなみにAppStoreで購入したライセンスを本家からダウンロードしたアプリに移譲することもできるので、まあなんとかなる。それについては以下を参照: https://www.texpad.com/support/macos/installing/licensing

Texpad+Local Build Scriptでのコンパイル

インストール

ではこれからTexpadを使ったTexの執筆環境を作っていく。筆者は過去の経緯から幾つかのTexがインストールされていたが、先ほど述べたようにMacTexからインストールされたtexliveの以下のバージョンを使った。

/usr/local/texlive/2019/bin/x86_64-darwin/platex --version
e-pTeX 3.14159265-p3.8.2-190131-2.6 (utf8.euc) (TeX Live 2019)
kpathsea version 6.3.1
ptexenc version 1.3.7

ptex2pdfは、texのコンパイルをコマンド一発で行ってくれる便利なスクリプトで、これもtexliveの中に自動で入るので、わざわざplatexやdvipdfmxを呼び出す必要がない。Texpadを起動し、プロジェクトを適当なディレクトリに作成する。 Texpadの環境設定からtexliveのinstall pathを指定する。これによりtexlive経由でインストールされたツールでコンパイルができるようになる。

Texpad Preferences -> Typesetting -> External Typesetterが以下のようになる。 texpad_1

Build scriptの作成

次に以下のようなbuild scriptを作成し、プロジェクト全体から一つのPDF (document-en.pdf)を生成する方法を作る。document-en.texでは全体の設定や\inputを使って分割したチャプターのファイルを順番に読み込んでpdfを組み立てるようになっている。

ptex2pdf -l -ot "-synctex=1 -file-line-error" document-en.tex
bibtex document-en
ptex2pdf -l -ot "-synctex=1 -file-line-error" document-en.tex
ptex2pdf -l -ot "-synctex=1 -file-line-error" document-en.tex

これをdocument-en.tpbuildというファイルでTexpadで作成したプロジェクトのrootに置く。これによって、TexpadのLocal Build Scriptという機能で好きなtex compilerを使ったりすることが可能になる。

おそらくであるが、素の状態でbibtexを使って参考文献を管理できないので、実質的にこの設定は必須だと思われる。ここを設定すれば、後はTypesetあるいはCmd+Tでコンパイルされ、無事にPDFが表示される。ここまでこれば後はひたすら書くだけである。以下にように左上のTypesetが変わっているはずだ。

Bibtex作りあれこれ

参考文献のリストは、論文/PDF管理ソフトであるMendeleyやEndonoteなど色々な方法がある。筆者は結局、論文のタイトルを全てググり内容を見つつ、doiからbibtexのエントリを生成してくれる超絶便利なウェブツールhttps://www.doi2bib.org/ を使った。Texpadにはbibtexのエントリを管理する機能もついているので、コピペしたエントリをdocument-en.bibに保存し、bibtexでコンパイルした。

最初、google scholarにもbibtexで出力するオプションがあり使っていたのだが、著者が多いと勝手にet alに省略されることがわかり使うのをやめた。なお、bibtexには色々なジャーナルのスタイルファイルが公開されているので、これを好きなスタイルで使用できる。筆者はNaturemag (https://www.bibtex.com/s/bibliography-style-nature-naturemag/) というスタイルを使っている。これは著者やタイトルの長さに限らず、3行くらいで表示してくれるのでReferenceセクションの見栄えがよくなる。Nature誌なので[番号]という引用スタイル。ただ、doiの表示が不要だったので、以下のようにスタイルを少し変更した (naturemag_mod.bst)。

--- naturemag_mod.bst	2020-04-23 13:44:27.000000000 +0900
+++ naturemag.bst	2004-03-29 23:25:00.000000000 +0900
@@ -1151,7 +1151,7 @@
     }
   if$
   new.block
-  %format.url output % Supress to display 'url' field in 'article' entry
+  format.url output
   new.block
   format.note output
   format.eprint output

あとこれはもう仕方ないのだが、doiから取得できる論文のメタデータが明らかに間違っている場合や古くてページ番号が取得できない場合が頻発する。これは、一つ一つ目で確認して、bibファイルを修正していくしかない。文献の数が多くなると大変な作業だが致し方なし。

文法のチェック

最近、文法チェッカーの一つであるGrammarly (https://app.grammarly.com/) がGoogle docsにも実装された。non-nativeなのでこの機能は必須である。スペル、冠詞のつけ忘れ、複数形と単数形など高速にチェックしてくれるので、subsectionを書いたところで一端、Google docsにコピペして、Grammarlyの結果をもう一度、Texpadにコピペしなおす、ということをやっていった。文章を読み直しておかしい所や間違いなどを修正する場合は、iPad+GoodNoteで修正個所を書き込んでいき、校正をしていった。

表の作成

texではもちろん、tabularx packageなどを使うことで表を作成することができる。しかしこれは人間が書く代物ではないので、何らかの方法で生成するべきである。エクセルの表を作り、https://www.tablesgenerator.com/ にコピペして見た目を少し変えた後、texのtable形式に自動で変換してくれるので、あとはコピペするだけで表を作れる。また、一部のセルに線を引いたり、xcolor packageを使うことで色付きのセルを生成することもできる。

図の作成

図はすべてRなどで出力したpdfをkeynoteできれいにレイアウトし、これをpdfに再度書き出して使用した。 extractbb figures/fig1.pdfなどで画像サイズを取得することで、dvipdfmxがeps以外の画像を読みこむことを可能にする。

\begin{figure}[htbp]
  \includegraphics[keepaspectratio, scale=0.4]{figures/fig1.pdf}
  \caption[title_for_fig1]{
    \textbf{title_for_fig1.}
    \newline
    (a) hogehoge. (b) hoge.
    }
    \label{fig:fig1}
\end{figure}

のように指定し、文中ではas shown in \textbf{Figure \ref{fig:fig1}a}.のように呼び出した。\captionと同じ内容を太字で書くのはあまりイケていない気もするが。。

課題

Texpadはドキュメントが肥大化するにつれて、どんどん重くなってきた。あとおそらくメモリリークしていて、ずっと起動していると3GBくらいもりもりメモリを食うので、時々終了している。Bug reportするべきかな。

それから、PDFのコンパイルにも長い時間かかるようになった。MacBook Pro 3.1GHz 2017; 180ページで25秒くらい。ただ、rootのファイルdocument-en.texで読み込んでいる各チャプターを毎回コンパイルするのは意味がないので、いま書いている章以外はコメントアウトしてpdfを生成しないようにすることで、コンパイル時間を削減していた。

高速化

少し調べてみると画像が多いとコンパイルに時間がかかるようだ。

\documentclass[12pt,a4paper,openright]{report} を以下のようにdraftモードにするとなんと画像が枠だけになってレイアウトは保持されたままpdfになる。これでかなり高速化することができる。 \documentclass[12pt,a4paper,openright,draft]{report}

ref: https://link.medium.com/9qGgC8gHt6

著作権について

一般にたとえ自著であっても、既に出版された文章をコピペすると自己剽窃とみなされる。一方、PhD thesisはこれまでの数本の論文をまとめて書くという性質から多くの学術系の雑誌では文章と図の再利用を一定の条件のもと、認めている。まずは該当する論文の出版元に確認するのが重要であるが、webからも簡単にreuse policyを確認できる場合もあった。例えば、Elsevierだと"Get rights and content"というリンクがそれぞれの論文にあり、以下のようにdissertationで使う旨を選択すると商業利用目的以外でなら利用可能ですよ、となる。

機械的な校正

''hogehoge''のようにダブルクオーテーションを出力する場合、texだとカッコの向きが対応しないので、 ``hoge''のようにする必要がある。これは、grep \" -R chapters/*.texなどで一気に調べるべし。

書いているときに後でreferenceを足そうと思って、(Refs)とか書いて書き進めていくとつけ忘れが発生する。soulpackageを使うとハイライトができるので、\hl{Refs}などとすると以下のように追加するところがひと目で分かる。

grep Warning document-en.bblでreferenceの間違いを探す

document-en.blg:Warning--empty journal in Winkler1920 # journal名がない
document-en.blg:Warning--empty title in Makarova2006 # titleがない

Enjoy!

@soh-i
Copy link
Author

soh-i commented May 21, 2020

All setting in TexPad can be as follows:

{
  "alwaysAutoTypeset": true,
  "animateTypesetControlsWhileAutoTypesetting": true,
  "autoCloseBrackets": true,
  "autoComplete": true,
  "autoIndent": true,
  "autoMatchBeginWithEnd": true,
  "bundleChoices": {
    "chosenBundleIds": [
      "japanese",
      "extralatex",
      "extraplain",
      "publishing",
      "extrabibtex",
      "cyrilliclang",
      "miscfontutils",
      "recommendedfonts"
    ]
  },
  "cellularDataPolicy": 0,
  "cloudTypesetServerUsagePolicy": 0,
  "continuousSpellCheck": true,
  "currentDocumentTemplateName": "Blank LaTeX Document",
  "editorIndentSize": 0,
  "editorPDFScrollLockOn": false,
  "editorThemeType": 1,
  "editorWrapMode": 2,
  "extendedEncoding": 134217984,
  "fontName": "Times New Roman",
  "fontPointSize": 18,
  "globalTypesetLocation": 0,
  "hangingIndentSize": 0,
  "hideIntermediateTypesetFiles": true,
  "hideOutlineOnDocumentOpen": false,
  "ignoredDocumentExtensions": [
    "def"
  ],
  "indexOrdering": 1,
  "iosKeyStripUp": false,
  "iosUseRegularKeyboard": false,
  "liveTypesetOnBatteryPower": true,
  "numberOfAppLaunches": 0,
  "osxHideSingleWorkspaceTab": true,
  "osxPostOSNotificationWhenTypesetCompletes": true,
  "osxShowOrganiserOnLaunch": true,
  "osxSnippetsBaseHotkey": 2,
  "osxUseSingleClickToSyncPDFToEditor": true,
  "postTypesetPaneBehaviour": 0,
  "powerSavePolicy": 1,
  "projectOutlineDisplayScale": 1,
  "shellEscapeAutoSenseSecurityPolicy": 0,
  "showAnyErrorsPostTypeset": true,
  "showLineNumbersInEditor": true,
  "showParagraphsInOutlineOfNewProjects": false,
  "showRateTexpadAlert": true,
  "showSubSectionsInOutlineOfNewProjects": true,
  "showSubSubSectionsInOutlineOfNewProjects": false,
  "suppressLocalisation": false,
  "texpadTeXSwitchedOffForNewProjects": false,
  "texpadtexDownloadPolicy": 1,
  "toolbarMode": 1,
  "typesetIssueLevel": 0,
  "version": 1
}

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment