LaTeX介绍

LaTex是一种基于TeX的排版系统,最初由美国计算机学家Leslie Lamport在20四级80年代初开发,在对于生成包含复杂表格和数学公式的书籍质量的印刷品,TeX发挥着强大功能。

TeX在不同的系统下有不同的实现版本(MiKTeX、pdfTeX、xelaTeX、CTeX),有时一种操作系统中也会有几种TeX系统。目前系统对应推荐关系如下:

Unix(mac) 类Unix(Linux) windows
MacTex Texlive MikTex

CTeX指的是CTeX中文套装的简称,是把MiKTeX和一些常用的相关工具,如GSview,WinEdt 等包装在一起制作的一个简易安装程序,并对其中的中文支持部分进行了配置,使得安装后马上就可以使用中文。

TeXLive 是由国际 TeX 用户组织 TUG 开发的 TeX 系统,支持不同的操作系统平台。其 Windows 版本又称 fpTeX , Unix/Linux 版本即著名的 teTeX 。

linux环境下LaTeX配置

总体方案介绍

TexLive + Atom编译器(3个Atom插件) + 添加win字体

LaTeX基础环境配置

  • 在有apt包管理的Linux发行版本上,如(ubuntu,deepin,debian),其安装相对容易。命令如下:
1
2
sudo apt-get update
sudo apt-get install texlive-full

其中,-full注明安装所有扩展组件(xelaTeX、语言字体包等),建议直接安装-full版本,虽然硬盘空间占用较大,但免去了单个配置的苦恼。

  • 非apt的Linux发行版本可能需要自行texlive官网下载最发行版本并安装。

atom(IDE)相关配置

Atom 是github专门为程序员推出的一个跨平台文本编译器。具有简洁和直观的图形用户界面,经过简单的配置,足够胜任各类语言的IDE(集成开发环境)

因为atom在大多数的linux发行版本中均未有收录,需要自行添加仓库源,或者去官网下载安装,这里为了便于更新,提供添加apt源,以及apt安装方式介绍:

1
2
3
sudo add-apt-repository ppa:webupd8team/atom
sudo apt-get update
sudo apt-get install atom

atom若作为latex的开发环境,需要配合以下插件使用(直接在atom中安装):

  • atom-latex
  • language-latex
  • pdf-view

另外建议安装simplified-chinese-menu插件,对atom菜单进行汉化。

因对兼容性的设置,若对一般latex编写,建议Latex编译器使用xelatex,在atom-latex插件中设置如下:

  • Toolchain to use 选择 custom Toolchain
  • LaTeX compiler to use 修改为 xelatex
  • bibTeX compiler to use 修改为 xelatex
  • Preview PDF after building process 选择 Do nothng

将win下字库迁移到linux下

因为win下大多字体均是微软公司授权或其他公司向用户授权,大多是非开源字体,因此在Linux或TeX发型版本中均不自带。但在发型书籍时候,使用的大多字体:英文下的新罗马字体(Times New Roman),中文下宋体(SimSun),楷体(KaiTi)均为非开源字体。若在Linux下使用,需要自行移植安装。

注意:不能直接安装,直接安装后会存在于本用户的目录下,texlive仅仅调用系统共有字体文件夹下所有字体步骤如下

复制win字体到Linux字体文件夹

windows字体文件夹位置:C://WINDOWS/Fonts

Linux下字体文件夹位置:/usr/share/fonts

建议将windows下所有字体复制到/usr/share/fonts/windows-fonts下,使用cp命令。

例如在windows字体文件夹下打开终端

1
2
sudo mkdir /usr/share/fonts/windows-fonts
sudo cp * /usr/share/fonts/windows-fonts

刷新字体缓存,使字体生效

1
sudo fc-cache -f -v

Win环境下LaTeX配置

windows环境下方案很多,这里推荐直接安装相同的Texlive套件,其直接包含MiKTeX和CTeX

点击转至Texlive国内清华源

下载文件类型为ios,请解压或挂载后安装。

针对前端的IDE仍建议使用Atom,有了能力者可以使用WinEdt。

  • Atom 配置见2.2,但注意:请从官网直接下载atom并安装,其余配置一致;
  • 因为不存在字体缺失问题,直接使用即可。

引用调用方式

类型名 &引用名 (变量名)
或
类型名 &引用名 = 变量名

  • 引用是别名,建立引用时必须初始化
  • 形参是引用,实参是变量

内联函数

inline 类型说明符 被调用函数名(形参表)

  1. 必须提前声明和定义
  2. 内联函数不交换控制权
  3. 不支持递归、循环、switch选择等复杂语句

面向对象三大特性

  • 继承性
  • 封装性
  • 多态性

类特性

抽象性 隐藏性 封装性 多态性

类是对象的抽象, 对象是类的实例

  • public 权限开放
  • private 仅成员和友元
  • protected 成员、友元、派生
继承方式 public protected private
public public protected private
protected protected protected private
private private private private

复制构造函数

类名 (const 类名 &对象名);

const 为保护实参对象可读,可省略
对象名是本类对象的引用,根据需求确定

1
2
3
4
5
6
7
8
9
class A
{
public:
A(int a);
A(const A &a);
};
A a(1);
A b(a); // 方式1
A c = b; // 方式2

静态成员(static)

静态数据成员

  • 静态数据成员必须初始化,且必须单独初始化
  • 定义时候不加 private/public/protected
  • 静态数据成员也可以定义为私有的静态数据成员

数据类型 类名:: 静态数据成员 = 值;

静态成员函数

  • 静态成员函数可以引用静态成员,不能直接引用非静态

类名::静态成员函数(参数表)

友元

友元函数
可放在类中任意位置,效果相同

friend 返回类型 函数名(参数表)

友元类

派生类构造函数

1
2
3
4
派生类名(派生类构造函数总参数表):<基类构造函数>(<参数表1>),<子对象名>(<参表2>)  
{
<派生类中数据成员初始化>
}

派生类的析构函数

  • 先执行派生类的析构函数,再执行基类的析构函数
  • 各个基类构造函数的执行顺序取决于定义派生类时所指定的各个基类的顺序,而与派生类构造函数的成员初始化列表中给定的基类顺序无关。

动态联编

三条件

  1. 虚函数
  2. 满足复制兼容规则
  3. 成员函数/指针/引用调用虚函数

抽象类

  • 至少含一个纯虚函数

virtual <返回值类型> <函数名> (<参数表>)=0;

  • 不能建立对象

运算符重载

1
2
3
4
5
6
7
8
9
10
//成员函数
<返回值类型> operator<运算符>(<参数表>)
{
……
}
//友元函数
friend <返回值类型> operator<运算符>(<参数表>)
{
……
}

C

= [ ] () -> 这四个运算符只能被重载为类的非静态成员函数

赋值兼容规则

  • 派生类对象可以赋值给基类对象
  • 派生类对象可以初始化基类引用
  • 基类对象可以指向派生类对象

其他

  • 代码复用的三种方式:继承、模板、组合
  • 提取运算符>> ,插入运算符<<
  • 运算符重载要求保持其原来的操作数个数、优先级、结合性和语法结构

一级标题

二级标题

三级标题

四级标题

五级标题
六级标题

无序列表

  • 项目一
  • 项目二
  • 项目三
    • 子项目
    • 子项目

有序列表

  1. 项目一
  2. 项目二
  3. 项目三
    1. 二级项目
    2. 二级项目
      1. 三级项目
      2. 三级项目
  4. 项目四

一级引用

二级引用

三级引用


粗体:Markdown
斜体:Markdown
粗体+斜体:Markdown
删除线:MarkDown
网址\邮箱引用:liuchang.men smile@liuchang.men
使用脚注[1]


TODOLIST

  • [x] 待办事务一
  • [x] 待办事务二
    • [x] 待办事务三
    • [ ] 待办事务四

关于 latex 公式

行内公式:$E=mc^2$

单行公式:

$x=\frac{-b\pm\sqrt{b^2-4ac}}{2a}$


来张图片吧


这是表格

Tables(左对齐) Are(居中对齐) Cool(右对齐)
1 right-aligned $1600
2 centered $12
3 are neat $1

代码测试

行内代码 nano

代码块

1
2
import math
print("hello world!")
1
2
3
4
5
6
#include <stdio.h>

int main() {
printf("hello world!\n");
return 0;
}
1
2
3
4
5
6
7
#include <iostream>
using namespace std;

int main() {
cout << "hello world!" << endl;
return 0;
}

  1. Hi 这是一个注脚,会自动拉到最后排版 ↩︎

App Inventor开发

App Inventor 2

Android应用开发者(英语:App Inventor)是一款卡通图形界面的Android智能手机应用程序开发软件。它起先由Google提供的应用软件,现在由麻省理工学院维护及营运。

借助IA2 建立一个简易的游戏手柄。因为AI2 的蓝牙串口通讯协议是基于SPP(Serial Port Profile)串行端口配置。我们目的是并设定相对应代码,在手机发送,在树莓派解析,并对小车进行运动控制。

对应代码如下:

  • u –> 前进 gofront()

  • d –> 后退 goback()

  • l –> 左转 turnleft()

  • r –> 右转 turnright()

  • s –> 停止 istop()

每次代码运行周期为20ms

ai2截面图

树莓派蓝牙SPP设置

树莓派蓝牙配置

  1. 安装支持包

    1
    2
    sudo apt-get install pi-bluetooth
    sudo apt-get install bluetooth bluez blueman
  2. 添加pi用户到蓝牙组

    1
    2
    sudo usermod -G bluetooth -a pi
    service bluetooth status
  3. 启动/增加SPP

    1
    sudo nano /etc/systemd/system/dbus-org.bluez.service

    修改内容如下:

    1
    2
    ExecStart=/usr/lib/bluetooth/bluetoothd -C
    ExecStartPost=/usr/bin/sdptool add SP
  4. 重启,启动蓝牙串口

    1
    sudo rfcomm watch hci0

串口调试软件xgcom

1
2
3
4
5
6
7
sudo git clone https://github.com/helight/xgcom.git
sudo apt-get install make automake libglib2.0-dev libvte-dev libgtk2.0-dev
cd xgcom
sudo ./autogen.sh
sudo make
sudo make install
xgcom

展示与控制代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
import serial
import time
from btbu_robot.motor import motor
bluetooth = serial.Serial("/dev/rfcomm0",9600,timeout=0.5)

#bluetooth.open()
left = motor(22, 27, 17)
right = motor(24, 23, 18)
def gofront():
left.run(70)
right.run(70)
# print("前进")

def goback():
left.run(-70)
right.run(-70)
#print("后退")

def turnleft():
left.run(-70)
right.run(70)
#print("左转")

def turnright():
#print("右转")
left.run(70)
right.run(-70)

def istop():
left.run(0)
right.run(0)
#print("停止")

status = '' # 记录当前状态
if __name__ == '__main__':
while True:
data = bluetooth.readline().decode('utf-8')
if status == 'u': # 前进
gofront()

elif status == 'd': # 后退
goback()

elif status == 'l': # 左转
turnleft()

elif status == 'r': # 右转
turnright()

elif status == 's': # 停止
istop()
while data != '':
status = data[0]
if status == 'u': # 前进
gofront()

elif status == 'd': # 后退
goback()

elif status == 'l': # 左转
turnleft()

elif status == 'r': # 右转
turnright()

elif status == 's': # 停止
istop()
data = data[1:]
time.sleep(0.02)
time.sleep(0.02)
0%