普物实验 TeX & R 急救指北

这学期选了物理实验B。

以前基本上只在 Markdown 里写 LaTeX,没怎么写过 .tex,R 则完全没有接触过。理论上我应该好好学一学再用,但实际上没时间好好学。总不能用 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}$

也可以只有单位 / 只有数字(用来显示科学计数法以及数字分段),把数字 / 单位留空即可。

模板

实验报告完整模板
\documentclass[UTF8, 11pt, fontset=none]{ctexart}
\setCJKmainfont{Source Han Serif SC}
\usepackage[T1]{fontenc}

\pagestyle{plain}
\ctexset{section/format=\Large\bfseries}
\usepackage[a4paper, hmargin=1.5cm, vmargin=1.9cm]{geometry}
\setlength{\parskip}{0.5em}
\usepackage{enumitem}
\setlist{topsep=0pt,itemsep=-4pt}

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

\usepackage{multirow}
\usepackage{diagbox}

\usepackage[pdfusetitle, hidelinks]{hyperref}
\usepackage{graphicx}
\usepackage{float}
\usepackage{cleveref}
\crefname{figure}{}{}
\crefname{table}{}{}
\crefname{page}{}{}
\crefname{section}{}{}

\begin{document}

\title{XXX\ 实验报告}
\author{姓名}
\makeatletter

\begin{center}
    \LARGE
    \textbf{\@title}

    \vspace{0.5cm}
    \normalsize
    实验者姓名: \@author\hspace{15pt}
    学号: 2021000000\hspace{15pt}
    实验日期: 2022年XX月XX日\hspace{15pt}
    实验台号: XX\hspace{15pt}
    \vspace{0.5cm}
\end{center}

\section{实验目的}

\begin{enumerate}
    \item
    \item
    \item
\end{enumerate}

\section{实验仪器}

\begin{itemize}
    \item
    \item
\end{itemize}

\newpage

\section{数据处理及结果}

% \begin{table}[H]
%     \centering
%     \caption{}
%     \vspace{1em}
%     \begin{tabular}{|c|c|c|}
%     \end{tabular}
%     \label{}
% \end{table}

% \begin{figure}[H]
%     \centering
%     \includegraphics[width=\textwidth]{.png}
%     \caption{}
%     \label{}
% \end{figure}

\newpage

\section{原始数据记录}

\begin{center}
\includegraphics[width=\textwidth]{data.jpg}
\end{center}

\end{document}

R

Arch 装 R package

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

读取数据

data <- readr::read_csv(here::here("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 参数作为拟合的起点,可以自己大致估计一下参数大概是多少,如果估计的偏差太大,可能导致最后拟合的结果出错。

画图

画出来好像还挺容易的,但要画得好看还得学一学,所以咕了,暂时在用 Excel(

但是画个丑陋的图可以用来检查函数拟合的情况:

plot(data)
curve(a * cos(2 * pi * (14.5 - x) / lambda), add = TRUE)

如果是在 non-interactive 模式下(例如使用 R -f foo.R 运行),生成的图像默认会放在 Rplots.pdf 中。