はじめに
この記事は群馬高専 Advent Calendar 2024 13日目の記事です。
普段私がレポートや課題などでLaTeXを書く際に、とりあえずでまとめたテンプレートを紹介します。「この書き方が正しい」といったものではなく、あくまでこういった部分が良かったという知見・感想を共有できたらいいと思っています。
今回使用しているのはpLaTeX(2e)という少し古いLaTeXです。これは私がTeXの実験実習をするにあたり使用せざるを得なかったことからそのまま愛用しています。ただ、LuaLaTeXという新しめなものがあるらしいので、もしこの記事を読んで新しくpLaTeXを始める人は、メリット・デメリットをよく調べることをおすすめします。
追記
- (2024/12/15)パッケージ「pgffor」が不足していたため、テンプレを修正しました。
- (2024/12/17)自作コマンド「emptyFigs」に余分なコマンドが含まれていたため、修正しました。
使用環境
- Windows11
- VSCode (Visual Studio Code) 1.95.3
- TeX Live 2024
設定・テンプレだけ見たい人へ
設定は以下2つの記事を参考にさせていただきました。
latexmkの設定ファイル
参考ページと同じ
詳しく
# 通常の LaTeX ドキュメントのビルドコマンド
$latex = 'uplatex %O -kanji=utf8 -no-guess-input-enc -synctex=1 -interaction=nonstopmode %S';
# pdfLaTeX のビルドコマンド
$pdflatex = 'pdflatex %O -synctex=1 -interaction=nonstopmode %S';
# LuaLaTeX のビルドコマンド
$lualatex = 'lualatex %O -synctex=1 -interaction=nonstopmode %S';
# XeLaTeX のビルドコマンド
$xelatex = 'xelatex %O -no-pdf -synctex=1 -shell-escape -interaction=nonstopmode %S';
# Biber, BibTeX のビルドコマンド
$biber = 'biber %O --bblencoding=utf8 -u -U --output_safechars %B';
$bibtex = 'upbibtex %O %B';
# makeindex のビルドコマンド
$makeindex = 'upmendex %O -o %D %S';
# dvipdf のビルドコマンド
$dvipdf = 'dvipdfmx %O -o %D %S';
# dvipd のビルドコマンド
$dvips = 'dvips %O -z -f %S | convbkmk -u > %D';
$ps2pdf = 'ps2pdf.exe %O %S %D';
# PDF の作成方法を指定するオプション
## $pdf_mode = 0; PDF を作成しない。
## $pdf_mode = 1; $pdflatex を利用して PDF を作成。
## $pdf_mode = 2; $ps2pdf を利用して .ps ファイルから PDF を作成。
## pdf_mode = 3; $dvipdf を利用して .dvi ファイルから PDF を作成。
## $pdf_mode = 4; $lualatex を利用して .dvi ファイルから PDF を作成。
## $pdf_mode = 5; xdvipdfmx を利用して .xdv ファイルから PDF を作成。
$pdf_mode = 4;
# PDF viewer の設定
$pdf_previewer = "start %S"; # "start %S": .pdf に関連付けられた既存のソフトウェアで表示する。
## Windows では SyncTeX(PDF をビューアーで開いたまま中身の更新が可能で更新がビューアーで反映される機能) が利用できる SumatraPDF 等が便利。
## ぜひ SyncTeX 機能のあるビューアーをインストールしよう。
## SumatraPDF: https://www.sumatrapdfreader.org/free-pdf-reader.html
## $pdf_previewer = 'SumatraPDF -reuse-instance';
VSCodeの設定ファイル
一部、配列内の順番の変更・オプションの変更等あり
詳しく
{
"editor.wordSeparators": "./\\()\"'-:,.;<>~!@#$%^&*|+=[]{}`~? 、。「」【】『』()!?てにをはがのともへでや",
"latex-workshop.latex.tools": [
{
"name": "Latexmk (pLaTeX)",
"command": "latexmk",
"args": [
"-f", "-gg", "-pdfdvi", "-latex=\"platex\"", "-latexoption=\"-kanji=utf8 -no-guess-input-env\"", "-synctex=1", "-halt-on-error", "-file-line-error", "%DOC%", "-outdir=%OUTDIR%"
]
},
{
"name": "Latexmk (LuaLaTeX)",
"command": "latexmk",
"args": [
"-f", "-gg", "-pv", "-lualatex", "-synctex=1", "-interaction=nonstopmode", "-file-line-error", "%DOC%", "-outdir=%OUTDIR%"
]
},
{
"name": "Latexmk (XeLaTeX)",
"command": "latexmk",
"args": [
"-f", "-gg", "-pv", "-xelatex", "-synctex=1", "-interaction=nonstopmode", "-file-line-error", "%DOC%", "-outdir=%OUTDIR%"
]
},
{
"name": "Latexmk (upLaTeX)",
"command": "latexmk",
"args": [
"-f", "-gg", "-pv", "-synctex=1", "-interaction=nonstopmode", "-file-line-error", "%DOC%", "-outdir=%OUTDIR%"
]
}
],
"latex-workshop.latex.recipes": [
{
"name": "pLaTeX",
"tools": [
"Latexmk (pLaTeX)"
]
},
{
"name": "LuaLaTeX",
"tools": [
"Latexmk (LuaLaTeX)"
]
},
{
"name": "XeLaTeX",
"tools": [
"Latexmk (XeLaTeX)"
]
},
{
"name": "upLaTeX",
"tools": [
"Latexmk (upLaTeX)"
]
},
],
"latex-workshop.latex.magic.args": [
"-f", "-gg", "-pv", "-synctex=1", "-interaction=nonstopmode", "-file-line-error", "%DOC%"
],
"latex-workshop.latex.clean.fileTypes": [
"*.aux", "*.bbl", "*.blg", "*.idx", "*.ind", "*.lof", "*.lot", "*.out", "*.toc", "*.acn", "*.acr", "*.alg", "*.glg", "*.glo", "*.gls", "*.ist", "*.fls", "*.log", "*.fdb_latexmk", "*.synctex.gz",
"_minted*", "*.nav", "*.snm", "*.vrb",
],
"latex-workshop.latex.autoClean.run": "onBuilt",
"latex-workshop.view.pdf.viewer": "tab",
"latex-workshop.latex.autoBuild.run": "never",
"[tex]": {
"editor.suggest.snippetsPreventQuickSuggestions": false,
"editor.tabSize": 4
},
"[latex]": {
"editor.quickSuggestions": {
"other": true,
"comments": false,
"strings": false
},
"editor.suggest.snippetsPreventQuickSuggestions": false,
"editor.tabSize": 4
},
"[bibtex]": {
"editor.tabSize": 4
},
"latex-workshop.intellisense.package.enabled": true,
"latex-workshop.intellisense.argumentHint.enabled": true,
"latex-workshop.latex.outDir": "out",
"latex-workshop.latex.clean.method": "glob"
}
テンプレート
これをベースにいつもレポートを書いている
詳しく
\documentclass[dvipdfmx]{jsarticle}
\usepackage[dvipdfmx]{graphicx}
% 余白設定
\usepackage{geometry}
\geometry{top=30truemm,right=30truemm,bottom=20truemm,left=30truemm}
% 他のTeXファイルを読み込む
\usepackage{standalone}
% 見出し設定
\usepackage{fancyhdr}
\usepackage{lastpage}
\pagestyle{fancy}
\fancyhead[LO]{}
\fancyhead[RO]{\thepage/\pageref{LastPage}}
\fancyfoot{}
\renewcommand{\headrulewidth}{0.0pt}
% 高度なキャプション
\usepackage{caption}
% 高度な箇条書き
\usepackage{enumitem}
% 囲み枠
\usepackage{ascmac}
% 高度な数式
\usepackage{amsmath}
% 数学記号
\usepackage{amssymb}
% 複数ページにまたがる表・図
\usepackage{longtable}
\usepackage{longfigure}
% 複数行を結合したセル
\usepackage{multirow}
% 可変幅の表
\usepackage{tabularx}
\newcolumntype{C}{>{\centering\arraybackslash}X}
\newcolumntype{L}{>{\raggedright\arraybackslash}X}
\newcolumntype{R}{>{\raggedleft\arraybackslash}X}
% URLをハイフネーションで折り返す
\usepackage[hyphens]{url}
% キャレットの別名
\newcommand{\circum}{\textasciicircum}
% 日付設定(Web参考文献の参照日時に使用される)
\newcommand{\datestr}{}
\newcommand{\setdate}[1]{\renewcommand{\datestr}{#1}\date{#1}}
% 複数ページにまたがるPDF
\newcounter{pdfcnt}[figure]
\newcount\num
\newcommand{\multiPDF}[8]{
\begingroup
\captionsetup{labelformat=empty}
\num=0
\def\MultiPagePDFEle{}%
\loop\ifnum\num<#5
\advance\num1
\expandafter\def\expandafter\MultiPagePDFEle\expandafter{%
\MultiPagePDFEle
\stepcounter{pdfcnt} \\
\ifnum#8>0
\frame{\includegraphics[width=0.99\textwidth,page=\arabic{pdfcnt}]{#4}} \\
\else
\includegraphics[width=0.99\textwidth,page=\arabic{pdfcnt}]{#4} \\
\fi
#1\arabic{#2} #6\ifnum #5>1 (\arabic{pdfcnt}/#5) \fi \\
}%
\repeat
#7
\label{#3}
\addtocounter{figure}{-1}
\begin{longfigure}{c}
\MultiPagePDFEle
\end{longfigure}
\clearpage
\endgroup
}
% 複数ページにまたがる図
\newcommand{\figsPDF}[5][1]{\multiPDF{図}{figure}{#2}{#3}{#4}{#5}{\captionof{figure}[#5]{}}{#1}}
% 複数ページにまたがるプログラムリスト
\newcounter{proglist}
\newcommand{\proglistPDF}[5][1]{\multiPDF{リスト}{proglist}{#2}{#3}{#4}{#5}{\refstepcounter{proglist}}{#1}}
% foreach用のパッケージ
\usepackage{pgffor}
% 別で印刷するなどによってラベルだけの「空」の図
\newcommand{\emptyFigs}[1]{
\begingroup
\foreach \i in {#1}{
\refstepcounter{figure}
\label{\i}
}
\clearpage
\foreach \i in {#1}{
\stepcounter{page}
}
\endgroup
}
% 参考文献のセクション
\newenvironment{docsection}{\section{参考文献}\begin{enumerate}[label=\arabic*)]}{\end{enumerate}}
% \docitemWeb{著者名}{Webページの題名}{入手先}{URL}{ref}
\newcommand{\docitemWeb}[5]{\item #1:#2, #3(オンライン), 入手先$<$\url{#4}$>$ (参照 \datestr). \label{#5}}
% \docitemMgz{著者名}{題名}{雑誌名}{巻}{号}{引用ページ}{発行年}{ref}
\newcommand{\docitemMgz}[8]{\item #1:#2, #3, #4, #5, #6 (#7). \label{#8}}
% \docitemBook{著者名}{書名}{引用ページ}{版元}{発行年}{ref}
\newcommand{\docitemBook}[6]{\item #1:#2, #3, #4 (#5). \label{#6}}
% \docitemTrans{原著者}{訳者名}{訳本タイトル}{引用ページ}{版元}{発行年}{ref}
\newcommand{\docitemTrans}[7]{\item #1(著), #2(訳):#3, #4, #5 (#6). \label{#7}}
% 各種参照用コマンド
\newcommand{\figRef}[1]{図\ref{#1}}
\newcommand{\tabRef}[1]{表\ref{#1}}
\newcommand{\equRef}[1]{式\eqref{#1}}
\newcommand{\prlRef}[1]{リスト\ref{#1}}
\newcommand{\enmRef}[2][項目]{#1\ref{#2}}
\newcommand{\docRef}[1]{$^{\text{\ref{#1}}}$}
\title{}
\author{}
% \setdate{執筆日} 例:\setdate{2024-12-13}
\setdate{}
\begin{document}
\thispagestyle{fancy}
\section{目的}
% 目的を書く
\section{原理}
% 原理を書く
\section{実験方法}
% 実験方法を書く
\section{使用器具}
使用器具を\tabRef{tab:equipment}に示す。
\begin{table}[htb]
\centering
\caption{使用器具}
\label{tab:equipment}
\begin{tabular}{l|l|l|l}
\hline
器具名 & 規格 & 製造会社 & その他 \\
\hline
% 器具の内容を書く
\hline
\end{tabular}
\end{table}
\section{実験結果}
\section{考察}
\begin{docsection}
% 参考文献を書く
\end{docsection}
\end{document}
用紙の余白
% 余白設定
\usepackage{geometry}
\geometry{top=30truemm,right=30truemm,bottom=20truemm,left=30truemm}
左右と上部は3cm、下部は2cmの余白を設けている。
右上の「現在のページ番号/総ページ数」
% 見出し設定
\usepackage{fancyhdr}
\usepackage{lastpage}
\pagestyle{fancy}
\fancyhead[LO]{}
\fancyhead[RO]{\thepage/\pageref{LastPage}}
\fancyfoot{}
\renewcommand{\headrulewidth}{0.0pt}
実験レポートにはページ右上にページ番号を示す必要があるので、これを設定することで以下のようにページ番号が自動で設定される。
高度な箇条書き
% 高度な箇条書き
\usepackage{enumitem}
enumerate環境などで、各項のラベルを変更する。
例)参考文献で「1.」から「1)」に変更
\section{参考文献}
\begin{enumerate}[label=\arabic*)]
\item 日記:【Windows】VSCode+pLaTeX環境を構築する(2023), Hatena Blog(オンライン), 入手先$<$\url{https://everykalax.hateblo.jp/entry/2023/05/05/023807}$>$ (参照 2024-12-13)
\item @passive-radio (passiveradio):【大学生向け】LaTeX完全導入ガイド Windows編 (2022年), Qiita(オンライン), 入手先$<$\url{https://qiita.com/passive-radio/items/623c9a35e86b6666b89e}$>$ (参照 2024-12-13)
\end{enumerate}
囲み枠
% 囲み枠
\usepackage{ascmac}
さまざまな枠(フレーム)を追加する。
見出し付きの角丸枠
\begin{itembox}[c]{見出し付きの角丸枠}
オイラーの公式は以下のように表される。
\[ e^{i\theta} = \cos\theta + i\sin\theta \]
\end{itembox}
見出しなしの角丸枠
\begin{screen}
オイラーの公式は以下のように表される。
\[ e^{i\theta} = \cos\theta + i\sin\theta \]
\end{screen}
影付き枠
\begin{shadebox}
オイラーの公式は以下のように表される。
\[ e^{i\theta} = \cos\theta + i\sin\theta \]
\end{shadebox}
高度な数式
% 高度な数式
\usepackage{amsmath}
複数行の数式などを追加する。
\begin{align*}
(\cos\theta + i\sin\theta)^n &= (e^{i\theta})^n\\
&= e^{i\cdot n\theta}\\
&= \cos(n\theta) + i\sin(n\theta)
\end{align*}
数学記号
% 数学記号
\usepackage{amssymb}
数学記号を追加する。
\begin{tabular}{ll}
運動方程式 & $m\mathbf{a} = \mathbf{F}$ \\
指数関数のラプラス変換 & $\mathcal{L}\{e^{at}\} = \frac{1}{s-a}$ \\
\end{tabular}
URLのハイフネーション
% URLをハイフネーションで折り返す
\usepackage[hyphens]{url}
長いURLをハイフネーションで折り返す。(ハイフンのせいでコピーしづらいので賛否両論)
\begin{enumerate}[label=\arabic*)]
\item 日記:【Windows】VSCode+pLaTeX環境を構築する(2023), Hatena Blog(オンライン), 入手先$<$\url{https://everykalax.hateblo.jp/entry/2023/05/05/023807}$>$ (参照 2024-12-13)
\item @passive-radio (passiveradio):【大学生向け】LaTeX完全導入ガイド Windows編 (2022年), Qiita(オンライン), 入手先$<$\url{https://qiita.com/passive-radio/items/623c9a35e86b6666b89e}$>$ (参照 2024-12-13)
\end{enumerate}
複数ページにまたがる図・プログラムリスト
% 複数ページにまたがるPDF
\newcounter{pdfcnt}[figure]
\newcount\num
\newcommand{\multiPDF}[8]{
\begingroup
\captionsetup{labelformat=empty}
\num=0
\def\MultiPagePDFEle{}%
\loop\ifnum\num<#5
\advance\num1
\expandafter\def\expandafter\MultiPagePDFEle\expandafter{%
\MultiPagePDFEle
\stepcounter{pdfcnt} \\
\ifnum#8>0
\frame{\includegraphics[width=0.99\textwidth,page=\arabic{pdfcnt}]{#4}} \\
\else
\includegraphics[width=0.99\textwidth,page=\arabic{pdfcnt}]{#4} \\
\fi
#1\arabic{#2} #6\ifnum #5>1 (\arabic{pdfcnt}/#5) \fi \\
}%
\repeat
#7
\label{#3}
\addtocounter{figure}{-1}
\begin{longfigure}{c}
\MultiPagePDFEle
\end{longfigure}
\clearpage
\endgroup
}
% 複数ページにまたがる図
\newcommand{\figsPDF}[5][1]{\multiPDF{図}{figure}{#2}{#3}{#4}{#5}{\captionof{figure}[#5]{}}{#1}}
% 複数ページにまたがるプログラムリスト
\newcounter{proglist}
\newcommand{\proglistPDF}[5][1]{\multiPDF{リスト}{proglist}{#2}{#3}{#4}{#5}{\refstepcounter{proglist}}{#1}}
使い方は以下に示す。
% labelが「fig:fig1」でパスは「example1.pdf」の3ページのPDF。
% キャプションは「3ページの図」
% オプションで0を指定すると枠線無し
\figsPDF[0]{fig:fig1}{example1.pdf}{3}{3ページの図}
% オプションを指定しないと枠線有り
\proglistPDF{prl:prog1}{code.pdf}{6}{レポートのTeXコード}
別途作成した図のラベル生成
% foreach用のパッケージ
\usepackage{pgffor}
% 別で印刷するなどによってラベルだけの「空」の図
\newcommand{\emptyFigs}[1]{
\begingroup
\foreach \i in {#1}{
\refstepcounter{figure}
\label{\i}
}
\clearpage
\foreach \i in {#1}{
\stepcounter{page}
}
\endgroup
}
引数にカンマ区切りで指定したlabelだけ参照を生成し、ページ数を確保する。(使用場所はレポート末尾)
foreachを使用するにはpgfforパッケージが必要。
\emptyFigs{fig:graph1,fig:graph2}
作成日時
% 日付設定(Web参考文献の参照日時に使用される)
\newcommand{\datestr}{}
\newcommand{\setdate}[1]{\renewcommand{\datestr}{#1}\date{#1}}
レポートの作成日時を設定させる。この日時はweb参考文献の参照日時にも使用する。(作成日にも参考文献を確認しよう)
\setdate{2024-12-13}
参考文献
% 参考文献のセクション
\newenvironment{docsection}{\section{参考文献}\begin{enumerate}[label=\arabic*)]}{\end{enumerate}}
% \docitemWeb{著者名}{Webページの題名}{入手先}{URL}{ref}
\newcommand{\docitemWeb}[5]{\item #1:#2, #3(オンライン), 入手先$<$\url{#4}$>$ (参照 \datestr). \label{#5}}
% \docitemMgz{著者名}{題名}{雑誌名}{巻}{号}{引用ページ}{発行年}{ref}
\newcommand{\docitemMgz}[8]{\item #1:#2, #3, #4, #5, #6 (#7). \label{#8}}
% \docitemBook{著者名}{書名}{引用ページ}{版元}{発行年}{ref}
\newcommand{\docitemBook}[6]{\item #1:#2, #3, #4 (#5). \label{#6}}
% \docitemTrans{原著者}{訳者名}{訳本タイトル}{引用ページ}{版元}{発行年}{ref}
\newcommand{\docitemTrans}[7]{\item #1(著), #2(訳):#3, #4, #5 (#6). \label{#7}}
参考文献のセクションと中身のコマンド
\begin{docsection}
\docitemWeb{日記}{【Windows】VSCode+pLaTeX環境を構築する(2023)}{Hatena Blog}{https://everykalax.hateblo.jp/entry/2023/05/05/023807}{doc:doc1}
\docitemWeb{@passive-radio (passiveradio)}{【大学生向け】LaTeX完全導入ガイド Windows編 (2022年)}{Qiita}{https://qiita.com/passive-radio/items/623c9a35e86b6666b89e}{doc:doc2}
\end{docsection}
各種参照用コマンド
% 各種参照用コマンド
\newcommand{\figRef}[1]{図\ref{#1}}
\newcommand{\tabRef}[1]{表\ref{#1}}
\newcommand{\equRef}[1]{式\eqref{#1}}
\newcommand{\prlRef}[1]{リスト\ref{#1}}
\newcommand{\enmRef}[2][項目]{#1\ref{#2}}
\newcommand{\docRef}[1]{$^{\text{\ref{#1}}}$}
参照を補助するコマンド(VSCodeの入力補完が効かなくて少し残念)
おまけ
\usepackage{askmaps}
論理回路で出てくる「カルノー図」をLaTeXで書くことができる。
% 0~15の順で指定し、丸の中心位置(左下原点)と幅・高さを指定
\askmapiv{}{{$C3$}{$C2$}{$C1$}{$C0$}}{F}{
{$0$}{$0$}{$0$}{$1$}
{$-$}{$-$}{$-$}{$-$}
{$0$}{$0$}{$-$}{$-$}
{$-$}{$-$}{$-$}{$-$}
}{
\put(2.0,1.5){\oval(3.8,0.8)}
}
さいごに
いかがでしたでしょうか?だいぶ長い記事になってしまいすみません。ここまで読んでいただいた方は本当にありがとうございます。この記事があなたの新たなLaTeXの発見につながればうれしいです。