前言
先来看看用 LaTeX \text{LaTeX} LaTeX 写出来的题解是啥样,内容是瞎写的。
前提知识与环境
- 默认已经掌握了 LaTeX \text{LaTeX} LaTeX 的一些用法,特别是公式如何写,如果你对这块还是很了解,可以先学着使用 Typora \text{Typora} Typora,也可以从 LaTeXlive \text{LaTeXlive} LaTeXlive 学习 Latex \text{Latex} Latex,更可以忽略本文。
- 本文在进行 LaTeX \text{LaTeX} LaTeX 编辑时,使用的是 Miktex \text{Miktex} Miktex 环境,使用 Texworks \text{Texworks} Texworks 进行编写。
- 在进行下面内容之前,你需要先准备好环境
- Miktex \text{Miktex} Miktex 安装方法就不介绍了,网上很多。
- minted \text{minted} minted 这个需要先安装python,然后 pip install pygments \text{pip\ install\ pygments} pip install pygments,这个用于高亮代码。
- 下载并安装 inkscape \text{inkscape} inkscape ,用于插入 svg \text{svg} svg 图片。
- Miktex \text{Miktex} Miktex 安装完成后,打开 TeXworks \text{TeXworks} TeXworks 设置一下 --shell-escape \text{--shell-escape} --shell-escape 。具体步骤如下: TeXworks \text{TeXworks} TeXworks 菜单中 "编辑"--"首选项"--"排版"
在"处理工具"中,选择用的工具,这里我用的是 pdfLaTeX \text{pdfLaTeX} pdfLaTeX ,又击打开后,参数设置如下图:
开始写题解
建立基本模板
-
新建一个文件,选择 pdfLaTeX \text{pdfLaTeX} pdfLaTeX 编辑器。此时就可以写了内容了,只是点了小绿箭头无法生成 PDF \text{PDF} PDF ,会编译出错。
-
加入下面代码,题目和第一个标题就生成了
bash
\documentclass[11pt]{article} % article模板
\usepackage[UTF8, scheme = plain]{ctex} % UTF8编码,ctex 可显示中文
\usepackage{geometry} % 页面设置
\geometry{
a4paper, % 设置纸张为A4大小
total={170mm,257mm}, % 设置文本区域的总宽度和高度
left=25mm, % 设置左侧边距
top=25mm, % 设置上侧边距
headheight=15mm, % 设置页眉高度
headsep=10mm % 设置页眉与文本之间的间距
}
\title{ \textbf{[ABC185E] Sequence Matching}}
\author{}
\date{}
\begin{document}
\maketitle
\section{Solution}
\end{document}
生成的效果
这里要了解一下 title \text{title} title 和每级标题。
在 title \text{title} title 中
bash
\title{ \textbf{[ABC185E] Sequence Matching}}
\author{}
\date{}
分别设置题目,作者和日期,其中作者和日期如果为空,则不显示,最后利用 maketitle \text{maketitle} maketitle 显示题目。
在每级标题中,主要使用 section \text{section} section 和 sebsection \text{sebsection} sebsection,来进行标题分级,其中
section \text{section} section 第1级标题
subsection \text{subsection} subsection 第2级标题
subsubsection \text{subsubsection} subsubsection 第3级标题
......
bash
\documentclass[11pt]{article} % article模板
\usepackage[UTF8, scheme = plain]{ctex} % UTF8编码,ctex 可显示中文
\usepackage{geometry} % 页面设置
\geometry{
a4paper, % 设置纸张为A4大小
total={170mm,257mm}, % 设置文本区域的总宽度和高度
left=25mm, % 设置左侧边距
top=25mm, % 设置上侧边距
headheight=15mm, % 设置页眉高度
headsep=10mm % 设置页眉与文本之间的间距
}
\title{ \textbf{[ABC185E] Sequence Matching}}
\author{}
\date{}
\begin{document}
\maketitle
\section{Solution}
\section{Code}
\section{第三部分}
\subsection{这里是第2级标题}
\subsubsection{这里是第3级标题}
\end{document}
这样就可以得到下面的效果:
这里数字都是自动编号的,但如果我们不需要编号,可以在 section \text{section} section 和 sebsection \text{sebsection} sebsection 加上 ∗ * ∗ 号就可以了。我们再将上面的代码修改一下:
bash
\documentclass[11pt]{article} % article模板
\usepackage[UTF8, scheme = plain]{ctex} % UTF8编码,ctex 可显示中文
\usepackage{geometry} % 页面设置
\geometry{
a4paper, % 设置纸张为A4大小
total={170mm,257mm}, % 设置文本区域的总宽度和高度
left=25mm, % 设置左侧边距
top=25mm, % 设置上侧边距
headheight=15mm, % 设置页眉高度
headsep=10mm % 设置页眉与文本之间的间距
}
\title{ \textbf{[ABC185E] Sequence Matching}}
\author{}
\date{}
\begin{document}
\maketitle
\section{Solution}
\subsection*{下面来写一下行内公式:$x^2-y^2=(x-y)(x+y)$。}
\subsection*{再试一下行间公式:}
$$
\begin{aligned}
(x^2-y^2)\times(x+y) & = (x-y)(x+y)(x+y) \\
&=(x-y)(x+y)^2
\end{aligned}
$$
\section{Code}
\section{第三部分}
\subsection{这里是第2级标题}
\subsubsection{这里是第3级标题}
\end{document}
我们在编译这段代码时会提示出错,原因是在写行间公式时,使用的 aligned \text{aligned} aligned 没有引入它的库 amsmath \text{amsmath} amsmath。(通过搜索可以很容易知道在哪个库里)
bash
\documentclass[11pt]{article} % article模板
\usepackage[UTF8, scheme = plain]{ctex} % UTF8编码,ctex 可显示中文
\usepackage{geometry} % 页面设置
\geometry{
a4paper, % 设置纸张为A4大小
total={170mm,257mm}, % 设置文本区域的总宽度和高度
left=25mm, % 设置左侧边距
top=25mm, % 设置上侧边距
headheight=15mm, % 设置页眉高度
headsep=10mm % 设置页眉与文本之间的间距
}
\usepackage{amsmath}
\title{ \textbf{[ABC185E] Sequence Matching}}
\author{}
\date{}
\begin{document}
\maketitle
\section{Solution}
\subsection*{下面来写一下行内公式:$x^2-y^2=(x-y)(x+y)$。}
\subsection*{再试一下行间公式:}
$$
\begin{aligned}
(x^2-y^2)\times(x+y) & = (x-y)(x+y)(x+y) \\
&=(x-y)(x+y)^2
\end{aligned}
$$
\section{Code}
\section{第三部分}
\subsection{这里是第2级标题}
\subsubsection{这里是第3级标题}
\end{document}
再来看效果:
建立内容及 item \textbf{item} item
内容可以直接在对应的 section \text{section} section 后面写就可以了,其中数学符号需要用 Latex \text{Latex} Latex 的表示形式,如加 "$" 符号等。需要加入 item \text{item} item 时,可以用 itemize \text{itemize} itemize 。在第1个 section \text{section} section 后加上下面一段代码:
bash
令 $f_{i,j}$ 表示 $A$ 序列前 $i-1$ 个字符,$B$ 序列前 $j-1$ 个字符的最小权值。那么,转移分为三种情况:
\begin{itemize}
\item 不选 $A_i: f_{i+1, j} \leftarrow f_{i, j} + 1$
\item 不选 $B_j: f_{i, j+1} \leftarrow f_{i, j} + 1$
\item 选 $A_i$ 和 $B_j: f_{i+1, j+1} \leftarrow f_{i, j} + (A_i \neq B_j)$,如图$\ref{fig:svg1}$。
\end{itemize}
于是,效果就变成了:
如何实现超链接
超链接需要使用 hyperref \text{hyperref} hyperref ,具体见代码,这里做了注释,就不详细讲了。
bash
\usepackage{hyperref}
\hypersetup{
colorlinks=true, % 设置超链接是否带颜色
linkcolor=red, % 设置内部链接的颜色
filecolor=magenta, % 设置文件型链接的颜色
urlcolor=blue, % 设置网页链接的颜色
citecolor=green % 设置参考文献链接的颜色
}
那么如何使用呢?以本文的 title \text{title} title 为例:
bash
\title{ \href{https://atcoder.jp/contests/abc185/tasks/abc185_e}{\textbf{[ABC185E] Sequence Matching}}}
这里用 href \text{href} href 引用, 另外, textbf \text{textbf} textbf 是为了加粗显示。
将这段加入代码,题目就变成了前言中图的效果了。
插入图片
插入一张 svg \text{svg} svg 图片
因为 Latex \text{Latex} Latex 无法直接插入 svg \text{svg} svg 图片,因此先使用 inkscape \text{inkscape} inkscape 将 svg \text{svg} svg 图片 转为 pdf \text{pdf} pdf ,然后插入
bash
\begin{figure}[htbp]
\centering % 居中显示图像
\includegraphics[width=0.2\textwidth]{svg1.pdf} % 插入图像,设置宽度为文本宽度的20%
\caption{$C^3+C^5$} % 插入图像的标题(caption)
\label{fig:svg1} % 为图像设置标签,方便在文档中引用
\end{figure}
这里的 figure \text{figure} figure 需要引入 graphicx \text{graphicx} graphicx 库。
插入一张 jpg \text{jpg} jpg 图片
Latex \text{Latex} Latex 可以直接插入 jpg \text{jpg} jpg 图片。
bash
\begin{figure}[htbp]
\centering % 居中显示图像
\includegraphics[width=0.2\textwidth]{svg1.pdf} % 插入图像,设置宽度为文本宽度的20%
\caption{$C^3+C^5$} % 插入图像的标题(caption)
\label{fig:svg1} % 为图像设置标签,方便在文档中引用
\end{figure}
两段代码在使用 figure \text{figure} figure 时都有参数 htbp \text{htbp} htbp,其中:
h \text{h} h:代表 " here \text{here} here",意味着 LaTeX \text{LaTeX} LaTeX 应该尽量将图形放在该代码段所在的位置。
t \text{t} t:代表 " top \text{top} top",意味着图形应该放在页面的顶部。
b \text{b} b:代表 " bottom \text{bottom} bottom",意味着图形应该放在页面的底部。
p \text{p} p:代表 " page of floats \text{page\ of\ floats} page of floats",意味着图形应该单独放在一个浮动页面上,即一个只包含图形的页面。
插入代码
插入代码的有很多种方法,这里我是使用了 algorithm + minted \text{algorithm } + \text{minted} algorithm +minted 的方法,主要解决了,一是可以精确在上下文之间插入代码,二是在行内插入代码,三是对于长代码段,可以分页显示。
bash
\usepackage{algorithm}
\makeatletter
\newenvironment{breakablealgorithm}
{% \begin{breakablealgorithm}
\begin{center}
\refstepcounter{algorithm}% New algorithm
\hrule height.8pt depth0pt \kern2pt% \@fs@pre for \@fs@ruled
\renewcommand{\caption}[2][\relax]{% Make a new \caption
{\raggedright\textbf{\ALG@name~\thealgorithm} ##2\par}%
\ifx\relax##1\relax % #1 is \relax
\addcontentsline{loa}{algorithm}{\protect\numberline{\thealgorithm}##2}%
\else % #1 is not \relax
\addcontentsline{loa}{algorithm}{\protect\numberline{\thealgorithm}##1}%
\fi
\kern2pt\hrule\kern2pt
}
}{% \end{breakablealgorithm}
\kern2pt\hrule\relax% \@fs@post for \@fs@ruled
\end{center}
}
\makeatother
\usepackage{minted} %使用minted库高亮代码
除了引用库以外,中间大段的代码是解决长代码可以分页显示的。
参考:https://zhuanlan.zhihu.com/p/158126932
行内代码
行内加代码比较简单:
bash
这句话用来测试行内代码 $\verb|if led_state == 'on':|$,可以正常显示。
行间代码
bash
hitonanode 的代码 $\ref{code:hitcpp}$ 。
\begin{breakablealgorithm}
\caption{hitonanode 的代码}
\label{code:hitcpp}
\begin{minted}{cpp}
int main()
{
int N, M;
cin >> N >> M;
vector<int> A(N), B(M);
cin >> A >> B;
vector dp(N + 2, vector<int>(M + 2, 1 << 30));
dp[0][0] = 0;
REP(i, N + 1) REP(j, M + 1) {
chmin(dp[i][j + 1], dp[i][j] + 1);
chmin(dp[i + 1][j], dp[i][j] + 1);
if (i < N and j < M) chmin(dp[i + 1][j + 1], dp[i][j] + (A[i] != B[j]));
}
cout << dp[N][M] << '\n';
}
\end{minted}
\end{breakablealgorithm}
这里第1句是加入了代码的引用。如果一行语句比较长,在显示时想自动换行,需要将 minted \text{minted} minted 后加入 [breaklines] \text{[breaklines]} [breaklines] 参数 。
完成
最终就形成了一篇帅帅的算法学习题解。