普物实验 TeX & R 急救指北

这学期选了物理实验B

以前基本上只在 Markdown 里写 LaTeX没怎么写过 .texR 则完全没有接触过理论上我应该好好学一学再用但实际上没时间好好学总不能用 Word 写实验报告并且手算吧

这里总结一下我写实验报告用到的 TeX 和 R

TeX

中文

\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}        % 段落间距

PDF metadata

\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}

章节

\section{实验目的}

\subsection{测一下这个东西}

图表

\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} 所示
\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}

还可以设置其它样式但应该用不上

多行/多列合并单元格

可以参考 Latex 表格技巧 - 合并单元格_TheNetAdmin的博客

单位科学计数法不确定度角度

\usepackage[separate-uncertainty=true]{siunitx}[=v2]

其中 [=v2] 用来修复使用 T1 编码时 \micro 的样式: siunitx#619

siunitx 这个包解决了若干问题

  • 单位需要用正体手写的话需要 \mathrm
  • 数字和单位之间最好有一些间距
  • 有的单位会让你纠结怎么写比较好例如摄氏度
  • 科学计数法写 \times 10^ 比较麻烦
  • 比较长的数字不分段的话看不清
  • 不确定度和测量结果末位对齐
  • 这个包还可以将不确定度写成括号的形式只不过实验报告的要求是 ±\pm 的形式
  • 只记得单位的字母不记得单位的英文名

例子

$t = \SI{22.5}{\celsius}$

$v = \SI{1.91981 \pm 0.114514 e3}{\kilo\metre / \hour}$

其中下面那个的渲染效果大概是没研究这个包的源码只是看样子大概复刻一下

v=(1.919810±0.114514)×103km/hv = (1.919\,810 \pm 0.114\,514) \times 10^3 \, \mathrm{km/h}

$v = (1.919\,810 \pm 0.114\,514) \times 10^3 \, \mathrm{km/h}$

可以用 \unit 来只有单位没有数字\num 来只有数字没有单位或者用 \SI 但把一部分留空

可以用 \ang{1;02;} 来显示 121^\circ 2'\ang[parse-numbers=false]{1;02;} 来显示 1021^\circ 02'\sisetup{parse-numbers=false} 来在当前环境例如表格内设置 parse-numbers=false就不用每条命令单独设置

更多用法可以参考 siunitx 的文档

模板

R

Arch 装 R package

arch4edu 有一些 R package可以减少 AUR 的需求

读取数据

data <- readr::read_csv(file = "data.csv")

平均数标准偏差

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)

t 因子

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"]

如果一个函数长得很奇怪不能线性拟合可以用 nls (Non-linear Least Squares) 来以减小残差平方和为目标进行拟合

nls 需要传入 start 参数作为拟合的起点可以自己大致估计一下参数大概是多少如果估计的偏差太大可能导致最后拟合的结果出错

简陋的函数图像

画个简陋的图可以用来检查函数拟合的情况

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)