用LaTeX写一篇帅帅的算法学习题解

前言

先来看看用 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 进行编写。
  • 在进行下面内容之前,你需要先准备好环境
    1. Miktex \text{Miktex} Miktex 安装方法就不介绍了,网上很多。
    2. minted \text{minted} minted 这个需要先安装python,然后 pip install pygments \text{pip\ install\ pygments} pip install pygments,这个用于高亮代码。
    3. 下载并安装 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 ,又击打开后,参数设置如下图:

开始写题解

建立基本模板

  1. 新建一个文件,选择 pdfLaTeX \text{pdfLaTeX} pdfLaTeX 编辑器。此时就可以写了内容了,只是点了小绿箭头无法生成 PDF \text{PDF} PDF ,会编译出错。

  2. 加入下面代码,题目和第一个标题就生成了

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] 参数 。

完成

最终就形成了一篇帅帅的算法学习题解。

相关推荐
乔冠宇6 分钟前
环状 DNA 序列的最小表示法
java·数据结构·算法
vir0216 分钟前
找出目标值在数组中的开始和结束位置(二分查找)
数据结构·c++·算法·leetcode
星沁城20 分钟前
73. 矩阵置零
java·算法·矩阵
Sweet_vinegar28 分钟前
变异凯撒(Crypto)
算法·安全·ctf·buuctf
Kalika0-042 分钟前
Linux 文件基本属性
linux·运维·服务器·学习
逻辑与&&1 小时前
[Prometheus学习笔记]从架构到案例,一站式教程
笔记·学习·prometheus
小刘|1 小时前
《Java 实现选择排序:原理剖析与代码详解》
java·算法·排序算法
新中地GIS开发老师1 小时前
WebGIS和WebGL的基本概念介绍和差异对比
学习·arcgis·webgl
一尘之中1 小时前
使用 AMD GPU 的 ChatGLM-6B 双语语言模型
人工智能·学习·语言模型
柔软阳光2 小时前
(四)、Manticore Search学习笔记之本地表介绍
数据库·笔记·学习