たくのろじぃのメモ部屋

プログラミング関係や数学、物理学などの内容を備忘録として残すブログ。プログラミングはC#を中心に書いています。

LaTeX を VSCode で使いたい人向けメモ

一か月ぶりですね。自粛中とはいえ、それなりに課題が出ているので大変と言えば大変です。レポートも書く機会があるので、メモしておきます。TeX(テフ)に乗り換える人はぜひ参考にどうぞ。

1. VSCodeLaTeX のインストール

VSCode は公式サイトから落としてきます。

code.visualstudio.com

拡張機能から LaTeX Workshop を導入します。これでVSCodeLaTeXを使う環境ができました。

f:id:takunology:20200511180018p:plain

次に LaTeX をインストールします。といっても LaTeX はパッケージなので様々なファイルを落としてきます。おそらく100個ほど。

東大の先生が作成した TeXインストーラです。これが一番簡単にインストールできる方法だと思います。

www.ms.u-tokyo.ac.jp

f:id:takunology:20200511181511p:plain

ここの(暫定)最新版(0.91)をダウンロードします。これを展開して、

f:id:takunology:20200511181739p:plain

abtexinst.exe を実行します。インストーラを進めると、TeXの保存先が表示されるのでそのままにして進みます。

f:id:takunology:20200511182032p:plain

インストール先の URL は時期によって上手くダウンロードできないことがあります。うまくいかないときは他の URL を選択します。

f:id:takunology:20200511182126p:plain

このまま進みます。

f:id:takunology:20200511182524p:plain

しばらくダウンロードが続きます。

f:id:takunology:20200511182932p:plain

ダウンロード後はインストーラが起動しますので、そのまま進めます。

f:id:takunology:20200511190755p:plain

f:id:takunology:20200511190934p:plain

f:id:takunology:20200511191044p:plain

これで TeX を使う準備ができました。再起動を忘れずに。

2. VSCode の設定

VSCode で [Ctrl] + [Shift] + [P] を同時押しして検索欄にて open user settings を選択して設定ページを開きます。下にスクロールして Edit in settings json をクリックします。

f:id:takunology:20200511192524j:plain

エディタ画面が開くので、このように記述します。

f:id:takunology:20200511193025p:plain

コードを載せておきます。

"latex-workshop.latex.tools": [
        {
            "name":"ptex2pdf",
            "command": "ptex2pdf",
            "args": [
                "-interaction=nonstopmode",
                "-l",
                "-ot",
                "-kanji=utf8 -synctex=1",
                "%DOC%"
            ]
        }
    ],

"latex-workshop.latex.recipes": [
        {
            "name": "ptex2pdf*2",
            "tools": [
                "ptex2pdf",
                "ptex2pdf"
            ]
        }
    ]

出来たら [Ctrl] + [s] で保存します。これでTeXVSCodeから使うことができます。

3. TeX

TeX形式を文章におこすことを「タイプセット」といいますが、プログラム言語を実行可能形式にする「コンパイル」と似ていることから、コンパイルとも言われています。正直、好みの問題ですが自分は使い分けたいのでタイプセットを使います。

タイプセットするとき、TeXは様々なファイルを吐き出すので、まずは作業用ディレクトリを作っておきましょう。その中にTeXのファイルを保存します。拡張子は .tex です。

f:id:takunology:20200511194113p:plain

保存すると、ロゴが変わり、サイドバーに TEX アイコンがでてきます。これをクリックすると、TeXをタイプセットするためのコマンドが表示されます。

f:id:takunology:20200511194307p:plain

タイプセットするときは Recipe: ptex2pdf*2 をクリックし、作成された資料(PDF)を見るときは View in VS Code tab をクリックします。

では文章を打ってみましょう。TeXを書くにはプログラムを書くように、必要事項を記入しなければなりません。

\documentclass[a4paper]{jsarticle}
\begin{document}
ここに文章を書いていく。
\end{document}

これをタイプセットします。先のように Recipe: ptex2pdf*2 をクリックしてコマンドを実行するか、[Ctrl] + [s] で保存して実行するかのどちらかになります。ちなみにタイプセットは2回行われます。なぜなら、図や表などを参照するための番号を一度読み込ませる必要があるからです。上記の文章だけでは2回やる必要はないですが、図や表などを載せて番号を参照する際には必要になります。

コマンドが正しく実行されているかを確認したい場合は、View > Output をクリックして出力ログターミナルを開き、ターミナル右上にあるドロップダウンメニューから Latex Compiler を選択します。

f:id:takunology:20200511195426p:plain

タイプセット完了の合図は左下のぐるぐるが止まってチェックマークになるか、generated by dvipdfmx. という表記が表示されるかで分かります。もし、いつまでたっても完了しない場合はエラーが起きているので、一度 Recipe: ptex2pdf*2 をクリックして止めます。そのあと、エラー箇所(タイプミス)を探します。

上手くいった場合は View in VS Code tab で表示してみましょう。

f:id:takunology:20200511201214p:plain

PDF形式に変換された文章が表示されています。これがTeXの使い方のキホンです。書き方などはググって調べてみてください。もしくは奥村先生のLaTeX美文章作成入門という本がおすすめです。付録にCDROMがついており、これ1枚でTeX環境が整います。

gihyo.jp

4. たくのろじぃのテンプレート

これは私がレポートを書くときに使っているテンプレートです。色々都合よくセッティングをしていますので、使いたい人はダウンロードしてみてください。コードを写しただけでは画像ファイルが見つからず、タイプセットできませんのでご注意を。

drive.google.com

中身のコードはこんな感じです。基本は \begin{} から始まって \end{} までです。

\documentclass[a4paper, 11pt]{jsarticle}
\usepackage{enumerate}
\usepackage{setspace}
\usepackage{listings}
\usepackage[dvipdfmx]{graphicx}
\usepackage[dvipdfmx]{xcolor}
\usepackage{amsmath,amsthm}
\usepackage{geometry}
\usepackage{listings} %ソースコード行番号

%タイトル
\title{{\Huge \textbf{たくのろじぃのメモ部屋}}\\ {\Large- \LaTeX を VSCode で使う -}}
\author{たくのろじぃ}
\date{\today}

% ----------------------プログラムのソースコードの設定----------------------

\lstset{
    %language=c++,%
    breaklines=true,%
    showstringspaces={true},%
    keepspaces=true,%
    tabsize = 4,%
    basicstyle={\ttfamily\small},%
    identifierstyle={\small},
    commentstyle={\smallitshape},
    keywordstyle={\small\bfseries},
    ndkeywordstyle={\small},
    stringstyle={\small\ttfamily},
    numberstyle={\scriptsize},
    frame=single,%
    framesep = 3pt,%
    xrightmargin=0zw,
    xleftmargin=1.5zw,
    numbersep=1zw,
    lineskip=-0.5ex,
    numbers = left,%
    stepnumber = 1%
}

\begin{document}
\maketitle
\section{数式}
数式は \$ マークで囲むと $f(x) = ax$ のようにイタリック体で表せます。ほかにも、
equation を使うと1行にわたって数式をかけます。
\begin{equation}
    \int _a^b f(x) dx
\end{equation}
align を使うと改行して数式をかけます。
\begin{align}
    &\sum _{k = 0}^{n} (a_k + b_k) \\
    &= \sum _{k = 0}^{n} a_k + \sum _{k = 0}^{n} b_k
\end{align}

\section{セクション}
セクションは細かくしていくことができます。しかも自動的に幅を調整してくれるので
便利です。改行するにはバックスラッシュ2つで\\
改行できます。
\subsection{サブセクション}
セクションより細かいサブセクション。
\subsubsection{サブサブセクション}
もっと細かいサブサブセクション。

\section{}
図番号の参照は ref を使います。
LaTeX Workshop の 拡張機能を図\ref{fig:LaTeX Workshop}に示す。
\begin{figure}[htb]
    \centering
     \includegraphics[scale=0.4]{texex.png}
    \caption{LaTeX Workshopの拡張機能}
    \label{fig:LaTeX Workshop}
\end{figure}

\section{}
意味もなく増減表を表\ref{tab:増減表}に示す。
\begin{table}[htb]
    \centering
    \caption{$f(x) = x^3-3x$の増減表}
    \label{tab:増減表}
    \begin{tabular}{|c||c|c|c|c|c|}\hline
    $x$ & ... & $-$1 & ... & 1 & ... \\ \hline 
    $f'(x)$ & $+$ & 0 & $-$ & 0 & $+$ \\ \hline
    $f(x)$ & $\nearrow$ & 2 & $\searrow$ & $-$2 & $\nearrow$ \\ \hline
    \end{tabular}
\end{table}

\newpage % 次のページに送る

\section{ソースコード}
ソースコードは lstlisting で書けます。
\begin{lstlisting}
#include<stdio.h>

int main() {
    printf("Hello\n");
}
\end{lstlisting}

数字の箇条書き
\begin{enumerate}
    \item 1 番目
    \item 2 番目
    \item 3 番目
\end{enumerate}

ドットの箇条書き
\begin{itemize}
    \item 要素 1
    \item 要素 2
    \item 要素 3
\end{itemize}

参考文献は thebibliography で定義して、cite で参照させる。\cite{book1}\\
URLはアンダーバー (\_) にお気をつけて。\cite{url1}

\begin{thebibliography}{99}
 \bibitem{book1} 本のタイトル, 著者, 出版社, 発行日
 \bibitem{url1} ページタイトル, 作者, 閲覧日, URLリンク
\end{thebibliography}

\end{document}

タイプセットした結果はこんな感じです。

皆さんも良き、レポートライフを!

【C/C++】挿入ソートとバブルソート

アプリ開発方法ばかり勉強していましたが、アルゴリズムもやってみようかな思ったのでこちらの本を参考に書いてみました。

www.amazon.co.jp

この本、4年前くらいに購入したのですが、アプリ開発ばかりやっていて全然使っていませんでした。久しぶりに読んでみましたが結構面白いですね。

とりあえずメモ書きとして残しておきます。

疑似乱数生成による初期化

とりあえず、入力データが必要なので用意します。毎回手入力するのが面倒臭いと思ったので、疑似乱数生成して自動で初期化しようと思いました。ライブラリ付属の rand() だけでは毎回同じデータが選ばれてしまうとのことなので、srand() で乱数を初期化します。オーソドックスなのはシステムクロック time() を使ったものらしいです。

10 で割ったあまりは 0 ~ 9 の間になるので、0~ 9 の範囲で値が欲しい時は 10 で剰余すればいいですね。

#include <iostream>
#include <random>
#include <time.h>

#define N 10 //データの数

using namespace std;

void input(int *data) {
    //疑似乱数初期化
    srand((unsigned int)time(NULL));
    
    for(int i = 0; i < N; i++)
        data[i] = rand() % 10;
}

挿入ソート

ソート済みとソートしていない領域で考えるそうです。要素を探していくとき、まさかデクリメントで遡ってさがすとは思いませんでした。最初、配列をコピーして上書きするようにして実装していましたが、途中で混乱したので解答例を参考にしました。

  1. 配列の要素の先頭から見ていったとき、ソートしてない要素をコピーしておく。
  2. その要素を基準に配列を遡って、適切な要素を見つける。
  3. 要素を1つずつずらしてから、そこに挿入する
#include <iostream>
#include <random>
#include <time.h>

#define N 10 //データの数

using namespace std;

void input(int *data) {
    //疑似乱数初期化
    srand((unsigned int)time(NULL));
    
    for(int i = 0; i < N; i++)
        data[i] = rand() % 10;

    cout << "入力データ : ";
    for(int i = 0; i < N; i++)
        cout << data[i] << " ";
    cout << endl;
}

void output(int *data) {
    cout << "ソートしたデータ : ";
    for(int i = 0; i < N; i++) 
        cout << data[i] << " ";
    cout << endl;
}

void insertionSort(int *data){
    int tmp; //一時保存用変数
    //要素を見ていく
    for(int i = 1; i < N; i++){
        int sort_element; //ソート済み要素数
        tmp = data[i]; //現在の要素を保持
        sort_element = i - 1; //現在の要素の1つ前まではソート済み
        /* ソート済み要素が 0 以上であり,
        ソート済み配列よりも現在の要素のほうが小さい場合*/
        while(sort_element >= 0 && tmp < data[sort_element]){
            //1つずらす
            data[sort_element + 1] = data[sort_element];
            //挿入箇所を遡って決める
            sort_element--;
        }
        //挿入する
        data[sort_element + 1] = tmp;
        output(data);
    }
}

int main(){
    //並べ替えるデータ
    int data[N];
    input(data);
    //挿入ソート
    insertionSort(data);
    
    return 0;
}

実行例

f:id:takunology:20200411101440p:plain

バブルソート

バブルと言われるだけあって、大きいデータ(泡)が上がっていくように並べる方法ですね。比較的実装しやすく、解答例を見なくてもできました。

  1. 配列の要素を順にみていき、その要素に注目
  2. 注目した要素の次の要素との大小関係を比較して入れ替える
  3. 最後の要素までいったとき、その要素はソート済みとする
  4. 1~3 を繰りかえす
#include <iostream>
#include <random>
#include <time.h>

#define N 10 //データの数

using namespace std;

void input(int *data) {
    //疑似乱数初期化
    srand((unsigned int)time(NULL));
    
    for(int i = 0; i < N; i++)
        data[i] = rand() % 10;

    cout << "入力データ : ";
    for(int i = 0; i < N; i++)
        cout << data[i] << " ";
    cout << endl;
}

void output(int *data) {
    cout << "ソートしたデータ : ";
    for(int i = 0; i < N; i++) 
        cout << data[i] << " ";
    cout << endl;
}

void swap(int *a, int *b) {
    int tmp;
    tmp = *a;
    *a = *b;
    *b = tmp;
}

void bubbleSort(int *data) {
    int sort_element = 0; //ソート済みの要素数
    while (sort_element != N - 1) {
        //1つずつ要素を隣に移動していく
        for(int i = 0; i < N; i++) {
            //次の要素と比較して大きい場合は入れ替える
            if(data[i] > data[i + 1]){
                swap(data[i], data[i + 1]);
                //入れ替え直後のデータ列
                //output(data);
            }
        }
        sort_element++; //ソート1回ごとにインクリメント
        output(data);
    }
}

int main(){
    int data[N];
    input(data);
    //バブルソート
    bubbleSort(data);
    
    return 0;
}

実行例

f:id:takunology:20200411102340p:plain

感想とか

正直、今のところ計算量は気にしていません。とりあえず実装できるようになりたいと思ったのと、内部的にどう動いているかを確認したかったのでやってみた感じです。あと、競技プログラミングって難しそうですね。

参考にしたサイト

ありがとうございます。

www9.plala.or.jp