这学期选了物理实验B。
以前基本上只在 Markdown 里写 LaTeX,没怎么写过 .tex
,R 则完全没有接触过。理论上我应该好好学一学再用,但实际上没时间好好学。总不能用 Word 写实验报告并且手算吧(
这里总结一下我写实验报告用到的 TeX 和 R。
TeX
中文
\documentclass[UTF8, 11pt, fontset=none]{ctexart} % 需要禁用默认 fontset 才能自定义字体
\setCJKmainfont{Source Han Serif SC}
\usepackage[T1]{fontenc}
\documentclass[UTF8, 11pt, fontset=none]{ctexart} % 需要禁用默认 fontset 才能自定义字体
\setCJKmainfont{Source Han Serif SC}
\usepackage[T1]{fontenc}
基本页面格式
\ctexset{section/format=\Large\bfseries} % 参照讲义上的格式,标题左对齐
\usepackage[a4paper, hmargin=1.5cm, vmargin=2cm]{geometry} % 页面大小和边距
\usepackage{enumitem}
\setlist{topsep=0pt,itemsep=-4pt} % 列表间距
\pagestyle{plain} % ctex 默认的页码在右上角,改成下方
\setlength{\parskip}{0.5em} % 段落间距
\ctexset{section/format=\Large\bfseries} % 参照讲义上的格式,标题左对齐
\usepackage[a4paper, hmargin=1.5cm, vmargin=2cm]{geometry} % 页面大小和边距
\usepackage{enumitem}
\setlist{topsep=0pt,itemsep=-4pt} % 列表间距
\pagestyle{plain} % ctex 默认的页码在右上角,改成下方
\setlength{\parskip}{0.5em} % 段落间距
\usepackage[pdfusetitle]{hyperref}
\usepackage[pdfusetitle]{hyperref}
标题
\title{实验名称\ 实验报告}
\author{姓名}
\makeatletter
\begin{center}
\LARGE
\textbf{\@title}
\vspace{0.5cm}
\normalsize
实验者姓名: \@author\hspace{15pt}
学号: 2021000000\hspace{15pt}
实验日期: 2202年10月32日\hspace{15pt}
实验台号: 1\hspace{15pt}
\vspace{0.5cm}
\end{center}
\title{实验名称\ 实验报告}
\author{姓名}
\makeatletter
\begin{center}
\LARGE
\textbf{\@title}
\vspace{0.5cm}
\normalsize
实验者姓名: \@author\hspace{15pt}
学号: 2021000000\hspace{15pt}
实验日期: 2202年10月32日\hspace{15pt}
实验台号: 1\hspace{15pt}
\vspace{0.5cm}
\end{center}
章节
\section{实验目的}
\subsection{测一下这个东西}
\section{实验目的}
\subsection{测一下这个东西}
图表
\usepackage{graphicx}
\usepackage{float}
\usepackage[hidelinks]{hyperref} % 使用 hidelinks 选项来禁用链接的红框
\usepackage{cleveref}
\crefname{figure}{图}{图}
\crefname{table}{表}{表}
\usepackage{graphicx}
\usepackage{float}
\usepackage[hidelinks]{hyperref} % 使用 hidelinks 选项来禁用链接的红框
\usepackage{cleveref}
\crefname{figure}{图}{图}
\crefname{table}{表}{表}
可以用 \label
和 \cref
来在正文中引用图表,这样就可以避免添加图表时重新标号。
\begin{figure}[H]
\centering
\includegraphics[width=0.6\textwidth]{picture.png}
\caption{这是一幅图,老师说图的标题放下面}
\label{this-is-a-picture}
\end{figure}
如\cref{this-is-a-picture} 所示
\begin{figure}[H]
\centering
\includegraphics[width=0.6\textwidth]{picture.png}
\caption{这是一幅图,老师说图的标题放下面}
\label{this-is-a-picture}
\end{figure}
如\cref{this-is-a-picture} 所示
如\cref{this-is-a-table} 所示
\begin{table}[H]
\centering
\caption{这是一张表,老师说表的标题放上面}
\vspace{1em}
\begin{tabular}{|c|c||c|c|}
\hline
序号 & 值 & 序号 & 值 \\
\hline
1 & 1.14 & 6 & 5.14 \\ \hline
2 & 1.93 & 7 & 5.95 \\ \hline
3 & 2.74 & 8 & 6.75 \\ \hline
4 & 3.55 & 9 & 7.53 \\ \hline
5 & 4.35 & 10 & 8.32 \\ \hline
\end{tabular}
\label{this-is-a-table}
\end{table}
如\cref{this-is-a-table} 所示
\begin{table}[H]
\centering
\caption{这是一张表,老师说表的标题放上面}
\vspace{1em}
\begin{tabular}{|c|c||c|c|}
\hline
序号 & 值 & 序号 & 值 \\
\hline
1 & 1.14 & 6 & 5.14 \\ \hline
2 & 1.93 & 7 & 5.95 \\ \hline
3 & 2.74 & 8 & 6.75 \\ \hline
4 & 3.55 & 9 & 7.53 \\ \hline
5 & 4.35 & 10 & 8.32 \\ \hline
\end{tabular}
\label{this-is-a-table}
\end{table}
如果想把几张图/表放在单独一页,使得这一页没有其他文字,可以把 [H]
改成 [p]
。
斜线表头
\usepackage{diagbox}
\begin{tabular}{|c|}
\diagbox{左下}{右上}
\end{tabular}
\begin{tabular}{|c|}
\diagbox{左下}{中间}{右上}
\end{tabular}
\usepackage{diagbox}
\begin{tabular}{|c|}
\diagbox{左下}{右上}
\end{tabular}
\begin{tabular}{|c|}
\diagbox{左下}{中间}{右上}
\end{tabular}
还可以设置其它样式,但应该用不上。
多行/多列(合并单元格)
可以参考 Latex 表格技巧 - 合并单元格_TheNetAdmin的博客。
单位、科学计数法、不确定度、角度
\usepackage[separate-uncertainty=true]{siunitx}[=v2]
\usepackage[separate-uncertainty=true]{siunitx}[=v2]
其中 [=v2]
用来修复使用 T1
编码时 \micro
的样式: siunitx#619
siunitx
这个包解决了若干问题:
- 单位需要用正体,手写的话需要
\mathrm
- 数字和单位之间最好有一些间距
- 有的单位会让你纠结怎么写比较好,例如摄氏度
- 科学计数法写
\times 10^
比较麻烦
- 比较长的数字不分段的话看不清
- 不确定度和测量结果末位对齐
- 这个包还可以将不确定度写成括号的形式,只不过实验报告的要求是 ± 的形式
只记得单位的字母,不记得单位的英文名
例子:
$t = \SI{22.5}{\celsius}$
$v = \SI{1.91981 \pm 0.114514 e3}{\kilo\metre / \hour}$
$t = \SI{22.5}{\celsius}$
$v = \SI{1.91981 \pm 0.114514 e3}{\kilo\metre / \hour}$
其中下面那个的渲染效果大概是(没研究这个包的源码,只是看样子大概复刻一下):
v=(1.919810±0.114514)×103km/h
$v = (1.919\,810 \pm 0.114\,514) \times 10^3 \, \mathrm{km/h}$
可以用 \unit
来只有单位没有数字,用 \num
来只有数字没有单位,或者用 \SI
但把一部分留空。
可以用 \ang{1;02;}
来显示 1∘2′,用 \ang[parse-numbers=false]{1;02;}
来显示 1∘02′,用 \sisetup{parse-numbers=false}
来在当前环境(例如表格)内设置 parse-numbers=false
,就不用每条命令单独设置。
更多用法可以参考 siunitx 的文档。
模板
R
Arch 装 R package
arch4edu 有一些 R package,可以减少 AUR 的需求。
读取数据
data <- readr::read_csv(file = "data.csv")
data <- readr::read_csv(file = "data.csv")
平均数、标准偏差
ybar <- mean(data$y)
Sy <- sd(data$y)
ybar <- mean(data$y)
Sy <- sd(data$y)
线性回归
model <- lm(log(y) ~ x, data)
b <- coefficients(model)[2] # 线性回归系数
r <- cor(log(data$y), data$x) # 相关系数
nu <- df.residual(model) # 自由度 (n-2)
model <- lm(log(y) ~ x, data)
b <- coefficients(model)[2] # 线性回归系数
r <- cor(log(data$y), data$x) # 相关系数
nu <- df.residual(model) # 自由度 (n-2)
t 因子
t <- qt(p=0.025, df=nu, lower.tail=FALSE)
t <- qt(p=0.025, df=nu, lower.tail=FALSE)
R 里面有好几个和 student 分布相关的函数,我猜可能有的东西可以直接用这些函数算出来,但我懒得研究了,反正能拿到 t 因子自己代公式就是了(
非线性函数的拟合
model <- nls(
y ~ a * cos(2 * pi * (14.5 - x) / lambda),
data = data,
start = list(a = 200, lambda = 10)
)
co <- coef(model)
a <- co["a"]
lambda <- co["lambda"]
model <- nls(
y ~ a * cos(2 * pi * (14.5 - x) / lambda),
data = data,
start = list(a = 200, lambda = 10)
)
co <- coef(model)
a <- co["a"]
lambda <- co["lambda"]
如果一个函数长得很奇怪,不能线性拟合,可以用 nls
(Non-linear Least Squares) 来以减小残差平方和为目标进行拟合。
nls
需要传入 start
参数作为拟合的起点,可以自己大致估计一下参数大概是多少,如果估计的偏差太大,可能导致最后拟合的结果出错。
简陋的函数图像
画个简陋的图可以用来检查函数拟合的情况:
plot(data)
curve(a * cos(2 * pi * (14.5 - x) / lambda), add = TRUE)
plot(data)
curve(a * cos(2 * pi * (14.5 - x) / lambda), add = TRUE)
如果是在 non-interactive 模式下(例如使用 R -f foo.R
运行),生成的图像默认会放在 Rplots.pdf
中。
ggplot 画散点 / 折线图
library(tidyverse)
# 导入字体
library(extrafont)
font_import()
loadfonts()
fonts()
fonttable()
data <- readr::read_csv(file = "data.csv")
p <- data %>%
ggplot(aes(a, b + c)) + # 以表中的 a 为横坐标,b + c 为纵坐标
geom_point() + # 散点
geom_line() + # 折线
labs(x = "a", y = "b") + # 坐标轴标题
theme(text = element_text(family = "Source Han Serif SC")) # 字体
ggsave("plot.png", plot = p)
library(tidyverse)
# 导入字体
library(extrafont)
font_import()
loadfonts()
fonts()
fonttable()
data <- readr::read_csv(file = "data.csv")
p <- data %>%
ggplot(aes(a, b + c)) + # 以表中的 a 为横坐标,b + c 为纵坐标
geom_point() + # 散点
geom_line() + # 折线
labs(x = "a", y = "b") + # 坐标轴标题
theme(text = element_text(family = "Source Han Serif SC")) # 字体
ggsave("plot.png", plot = p)