卒論で出会った latex のあれこれ

卒論の執筆を通して出会った latex の機能やお作法、トラブルについて備忘録もかねて記しておきます。 適宜更新します。

環境

Windows 11の WSL 2 上に TexLive2022 をインストールして使用しています。 texファイルから pdf の生成には platex + dvipdfmx を利用しています。

hyperref を使うと全体的に文書がずれる

hyperref パッケージは生成されるpdf にリンクを付けるものです。 このパッケージを使用すると全体的に文書が右下にずれた pdf が生成されるようになりました。 pxjahyper パッケージを利用することで解決しました。 pxjahyper パッケージは hyperref パッケージを日本語に対応させるパッケージです。 そもそも pxjahyper パッケージを利用しないと pdf の目次が文字化けするので日本語の文書で hyperref パッケージを使用する場合は pxjahyper パッケージは必須です。

pxjahyper を利用すると生成される pdf が白紙になる

pxjahyper は pdf にリンクを付けるパッケージである hyperref を日本語対応させるためのパッケージです。 pxjahyper を使ったところコンパイルしても白紙しか生成されなくなってしまいました。 原因は次のリンクに示してあるように pxjahyper パッケージのバグのようです。

okumuralab.org

対策はいろいろあるようですが今回は nomag オプションを付けることで対応しました。

pdf 中のリンクの囲みをなくしたい

hyperref パッケージのデフォルトの設定では下の写真のように pdf 中のリンクは赤枠で囲われます。

この設定が個人的に気に入らなかったので枠を消す方法を探しましたが見つかりませんでした。 結局以下のようにプリアンブルに書いて枠の色を白色にしました。

\hypersetup{ % ハイパーリンクの設定
  pdfborder={0 0 0},
}

コード中に数式を書きたい

lstlisting 環境で論文中にプログラムを載せたのですが、そのプログラムの中に数式を入れたくなりました。 プリアンブルのlstset中にescapechar=\@と書くことで@エスケープ文字に指定し、@で囲まれた場所に数式環境を導入することでできました。 例えば

\begin{lstlisting}
#include <stdio.h>

int main() {
    double e = 0.0;
    double frac = 1.0;
    // @$e = \sum_{n = 0}^\infty{\frac{1}{n!}}$を利用しネイピア数を計算する@
    // @$n$を99で打ち切る@
    for (int n = 1; n <= 100; n++) {
        e += 1.0 / frac;
        frac *= n;
    }
    printf("%f\n", e);
}
\end{lstlisting}

と書くと、次のようになります。

数式中にいい感じに空白を作りたい

数式をの位置をそろえていい感じの見た目にするのに悪戦苦闘していたところ zkou君 のアドベントカレンダーの記事が出て、\phantomというコマンドを知りました。 とても助けられました。 qiita.com

数式中の文字列には\textitを使う

数式中の変数として長さが2文字以上の変数名を使いたくなることがあると思います。 そのときに変数名をそのまま数式環境中に書くと、変数中の文字はそれぞれ独立した変数名として扱われてしまいます。 (たとえばabcと書くとabcの掛け算として扱われるということです) \textitで囲むと囲んだ文字全体で1つの変数として扱ってくれます。 小さな違いですが以下の写真のように囲まなかったほうは文字の間に微妙な空白が開いてしまうことがわかると思います。 毎回囲むのは面倒なのでマクロを活用するとよいと思います。

左がtextitで囲まなかったとき、右がtextitで囲んだとき

synctexファイルが生成されない

synctextex ファイルと pdf ファイルの間で対応する位置を教えてくれる便利な機能です。 使用しようとしたところコンパイル時に synctex ファイルが生成されず困りました。 原因はコンパイルオプションをつける位置を間違えていたことでした。 具体的にはplatex <ファイル名> -synctex=1ではなくplatex -synctex=1 <ファイル名>とすべきでした。