因为第一年开始教学,我答应了太多人来写推荐信,这让我花了非常多的时间。从2020年起,我制定了推荐信规则:

  1. 三类学生可以获得我的推荐信机会:1)上过我的课的学生 2)我的毕业设计学生 3)跟我做项目的学生
  2. 其中,上过我的课的学生,有两种机会可以拿到推荐信:1)成绩列为前10% 2)前10位联系我,成绩在中位数之前
  3. 我可以帮你填写不超过5所需要在线推荐的大学,请慎重选择,不要海投。

Because I just start my teaching career from 2019, I agreed to write recommendation letters for too many students. It cost me too much time. From 2020, I made the following rule for recommendation letter:

  1. Three types of students can get RL from me: 1) students in my class 2) my fyp students 3) who did projects with me
  2. For the students in my class, two opportunities for you: 1) top 10% in terms of final marks 2) first 10 students who contact me and final marks is over median.
  3. No more than 5 universities for on-line RL. Please DO NOT apply too many universities.

前10%最低分 Lowest mark of Top 10%: 75

分数中位数 Median: 60

下面是被推荐学生的列表,为了保护隐私,采用了小写的学生邮箱的md5编码作为依据:

  1. c98e3c32b3307bff8653ea430e7faa94
  2. fc599040e894ed4614252e7bbbe0aa92 (top 10%)
  3. dd0420ffc7e21a62acb15a0ab9483e87
  4. e4440a54f1ad2318b07f332240196954
  5. 43cd58b48ae79ce0f88138b020fd441f
  6. 70cff10cd67c264801affbb7f5eb86c4

作者: 程飞

第一章 归零然后开始

1 PythonTIOBE指数

Python确实是一门神奇的计算机语言,从TIOBE编程语言指数上看,Python近年来上涨的非常快,已经稳居第三名,指数超过第四名——曾经无比神奇的C++4%之多。前两名是Java和C语言,一个是几乎所有安卓手机都在用的Java语言,另一个是几乎所有嵌入式系统和操作系统都在用的C语言。

Python可能是对于非计算机专业的学生、学者和爱好者非常友好的计算机语言了,上手难度在编程语言中是非常低的,而能够实现的功能和算法却非常专业和高效。Python就像是一辆调教良好的自动挡汽车,好开又省油。这并不是说计算机专业的学生就不要学Python了,恰恰相反,试问有多少人考了C1驾照还开手动挡汽车的?

那到底Python能做一些什么呢?这个问题应该反过来问:Python不能做什么呢?好像不能做的事情很少。就连安卓程序也都可以使用Python开发,只是不那么成熟。目前,Python被大量的用在了人工智能、科学计算、金融量化交易、云计算、网络编程、系统运维等重要领域。尤其是人工智能领域,几乎完全就是Python的天下。

为什么Python会这么火爆?按照我的理解,Python语法简洁明快并且丰富、不需要考虑内存管理、丰富的模块库、以及可以和C/C++无缝连接,成就了Python今天的流行。从语法角度看,Python非常贴近自然语言,没有C/C++那些奇怪的符号,没有严格定义的变量类型,非常自由灵活。在变量类型方面,又有着list(列表,类似于C的链表)和dict(字典,类似于hash表)这种神一般存在的类型,让编程变得无比舒服;而内存管理方面,Python并不需要编程人员考虑太多,也不需要通过指针直接操作内存,因为有list和dict两个类型,完全不需要C语言的指针了,对于编程人员来说绝对是一大幸事;而丰富的模块库,简直就是“拿来主义者”的天堂,Python打包好的模块叫做Wheel,扩展名是whl,寓意非常明确,不要发明两遍轮子,已经有的,就直接拿来用,Python强大的功能,几乎都是通过模块库来实现的,例如科学运算中必备的Numpy和Scipy,人工智能领域常用的Tensorflow;而这些模块库,可以通过Python编写,也可以通过C/C++编写,这一点可以保证效率,用Python编写可以保证开发效率,而用C/C++编写可以保证运行效率。所以Python也称作胶水语言,它可以利用现有的各种优秀的模块库,粘贴出一个非常优秀的程序。

如果你有幸没有学过任何编程语言,上面那段话可能让你感觉不知所措。但是幸运的是,你没有学过其他语言,所以你上手的学Python的速度可能更快。你只需要知道的是,Python可以很快的编写,也可以很快的执行,几乎无所不能,这就足够了。而不幸学过其他语言的同学,如果学的是类C语言,包括C、C++、Java这些,就要走出舒适圈,去适应新的语法了。

下面我们真正的开始学习Python了!

最一开始,我们需要让你的电脑可以运行Python代码以及可以写Python的程序。很多书把这一步描述的特别简单,粉饰太平,把问题留到后面,我认为是不对的。这一步可能是你学习Python的途中最难理解,最复杂,也是最讨厌的一步,没关系,一旦明白了一切就都明朗了。所以在这一步我们要有点儿耐心。

想运行Python的代码,就需要Python的运行环境,而一个运行环境包括一个Python解释器(通常在Win系统是python.exe文件,Linux和Mac系统是一个带有可执行属性的python文件),以及围绕在这个解释器周围的模块库。但是搭建运行环境的方式非常多样化,简单的说,主要分为两种方式:使用系统级的运行环境和使用虚拟环境两种。对于Win和Mac用户来说,我们从https://www.python.org下载好对应你操作系统版本的Python(推荐安装最新的稳定版,目前是3.7)的安装包后,如果你有管理员权限,双击后就可以安装了,所有都采用默认的设置(请记住安装的位置,这个很重要),完成之后,你就拥有了一个系统级的Python运行环境。看起来很简单,但是我们要确保安装正确了才能进行下一步:Win10系统按windows键后,输入cmd按回车键,打开命令行的黑框框,输入python然后回车,如果现实的是没有该程序,则需要添加环境变量(本章最后附加了操作方法);Mac系统从Lunchpad(四指一捏)找到终端(英文系统为Terminal)打开命令行的白框框,输入python3然后回车,就可以打开Python的Shell界面:

2 Python Shell界面 (我的Terminal改成了黑框框)

如果看到的是上面的景象,版本是Python 3.7.x,那基本上就对了。为了更好的使用Python,我们还需要确保pip工具安装正确,pip工具是用来给python安装周围的模块库的,仅需要非常简单的语句,就能从网络上直接帮你下载并安装好那些有用的模块,例如Numpy(Python + Numpy ~ Matlab)。目前新的Python安装包已经自带了pip工具,我们直接来尝试:依然是在命令行里输入exit()并回车,先退出Python的命令行模式(等会儿再说这个模式),在Win系统的cmd下输入pip -V并回车, 再输入 where python并回车来分别看到pip的路径和python的路径; 在Mac系统的Terminal中输入pip3 -V并回车,然后输入which python3并回车,查看pip3和python3的路径:

3 结果表明pip3python3是对应的,因为路径是一致的

我们需要确认python和相应的pip是对应的,因为你的系统里可能会有很多版本的python和pip,如果使用了不对应的pip工具,则会出现明明安装了某个模块,但是python里却不能用,这是新手常见的烦恼之一。到这里,其实我们已经确保了我们的系统级的Python运行环境是可用的了。而另外一种虚拟环境的搭建方法,也有很多种,甚至是通过不同的工具进行建立,我们将在后面通过IDE软件来实现。

一般的教程,到这里就迫不及待的教大家开始写程序了,但我们还需要等等。在上面图2中,我们通过命令行启动了Python的Shell界面,在这个界面下,就已经可以写Python的代码,回车就可以执行:

4 猝不及防的Hello World

难道我们就这样写Python程序吗?当然不可能,这个Shell界面通常用来测试一些简单的代码,或者用来做一些简单的科学运算。更通常的做法是,我们把一段Python的程序写在一个扩展名为py的纯文本文件(就是使用Win系统的记事本就能直接打开的文件),然后去运行这个文件,这样就能运行一个完整的程序了。而能够运行这个文件的程序就是Python解释器,也就是前面提到的那个在Win系统下是python.exe在Mac和Linux下是python或者python3的可执行程序。操作方法十分简单:python your_python_code.py。然后就能在屏幕上看到执行的结果了。

下面的问题就是如何编写这个py文件了。既然记事本都能打开,当然可以用记事本来写Python程序,但是除非你是一等一的高手,否则不要这么做。我们需要借助IDE(Integrated Development Environment)工具,IDE是程序员的超级管家,帮你管理文件、管理版本、纠错调试、以及运行程序。事实上Python官方自带了一个叫IDLE的IDE,从名字就能看出来是一个被闲置不用的的工具,确实不怎么好用,虽然界面很简洁:

5 Mac下的IDLE因为连菜单栏都分离出去了,感觉和命令行差不多了

当然业界也流行着很多关于VIM和EMACS的神奇传说,他们确实很棒,也能打造成高效的Python IDE,只是学习成本太高了,不值得。下面,我就请出我们的主角:PyCharm,这个名字看起来就很优雅:

6 PyCharm 官网截图

PyCharm具有优秀IDE应有的特征:多种语法高亮主题、深色护眼界面主题、完善的语法提示、版本管理等。除此之外,PyCharm还可以直接帮助我们建立Python的虚拟运行环境。推荐大家从PyCharm的官网http://www.jetbrains.com/pycharm/download/ 下载社区版或者专业版,一般来说,大学的学生和老师邮箱可以免费享用专业版。所以我们还是使用专业版,顺便提一句,这家公司的其他软件也都很好用。安装的过程中需要注意下面这个界面最好全部都勾选了:

6-2 补充的一张Windows安装界面,Mac里似乎没这个问题

其他的选择默认的路径,默认的选项,直到你来到下面这个界面:

7 PyCharm 欢迎界面

单击 Create New Project:

8 New Project的创建页面

如果看起来不是图8的样子,就点击中间偏上的Project Interpreter左边的小三角来展开成这样。下面我们来仔细看看这个界面的右侧,Location这一栏是填写工程所在的路径,其中最后一段目录的名称就是工程名称了。然后我们需要重视Project Interpreter,首先PyCharm提供了两个大选项:New Environment 和 Existing Interpreter,我们先看后面一个——Existing Interpreter。当我们点击Interpreter后面的选型列表后,可以看到所有PyCharm记录过的解释器,无论是系统级的还是虚拟运行环境:

图9 选择Existing Interpreter

如果这里没有你所需要的解释器,请点击后面的…按钮:

图10 Add Python Interpreter

在弹出的Add Python Interpreter界面中,我们就可以选择System Interpreter或者前面建立好的虚拟环境了,虚拟环境我们通常使用Virtualenv或者Conda来搭建。下面我们退回到图8来搭建虚拟环境,我们重新选择New Environment,在using选项里,我们先尝试使用Virtualenv搭建一个虚拟环境。如果你选择了Virtualenv,然后右下角出现了一个闪电符号,就意味着你电脑上没有安装Virtualenv的工具,需要打开命令行,使用pip install virtualenv进行按照,如果不行可以参考https://virtualenv.pypa.io/en/latest/installation/。搭建的方法十分简单,我们其实只需要指定一个Base Interpreter就可以了,从下拉菜单选择一个合适的Python版本,可以通过路径来判别是哪一个Python环境,因为以后有可能你为某个解释器安过一些特殊模块,如果没有找到想要的,则通过…按钮直接选择一个python解释器的可执行文件,可以参考前文中在命令行使用where和which的办法先找到,然后在这里选择。虚拟环境的Location一般不建议更改,下面两个勾选框,第一个是从Base Interpreter继承所有的模块库,这个视情况勾选,如果你已经配置好了一些基础库,下次用的时候可以继承过去。第二个选项是让这个解释器可以被所有项目可用,一般不勾选。然后我们就可以单击Create按钮了来创建虚拟环境,并创建工程了。说了这么一大堆,如果顺利的话,可能你只需要点击几下鼠标就过去了,然后我们来到了真正开始工作的地方:

11 PyCharm的工作界面

我们可以看到工程文件夹下有一个venv文件夹,这就是虚拟环境所在的地方,里面就包含了python解释器以及一堆模块。将虚拟环境目录放在工程目录里的好处很多,你可以直接把工程打包发给你的团队成员,让他们可以不用配置环境就能运行你的程序(当然需要同一种操作系统。而使用虚拟环境可以尽量将项目之间的模块需求进行隔离,随着你后面项目会越做越大,不同的程序甚至对同一个模块的版本有细微的要求,虚拟环境可以有效解决这个问题,在虚拟环境里你不需要担心把事情搞砸了。值得注意的是,这里的虚拟环境和虚拟机不是一个概念,这个Python的虚拟环境要轻量级的多,本质上是将程序运行的环境变量修到一个特定的Python目录,从而实现一个隔离的Python运行环境,让你可以方便的切换版本。通过Conda创建创建虚拟环境的方法和上面也是差不多的,只不过不需要选择是不是继承全局模块库。

我写了这么多,其实当你明白了之后,每次操作都是几秒钟的事情,但是这几秒钟的背后是一个项目顺利开始的根基。所以我希望你一开始把事情都搞得比较明白,然后再着手学习代码。

下面我们尝试一个极为简单的Hello World:在左侧的项目目录上右击,选择 New -> Python File,然后输入一个名字,比如说Hello,然后创建文件。输入一行语句:print(‘something’),然后在Run菜单里选择 Run… 然后选择Hello:

12 尝试Hello World

下次运行这个文件的时候,只需要在Run菜单里选择第一个——Run ‘Hello’就行了。当然你也可以根据不同的操作系统记忆快捷键,如果你使用带有Touchbar的Macbook,也可以自己配置Touchbar的快捷操作。

至此,你已经拥有了一个功能强大的Python IDE了,并且你对这里面的运行细节也有了一定的了解,当然,后面随着编程学习的深入,你会逐渐体会更多。

PS: Windows如何设置环境变量:

  1. 按Win键,选择左边的齿轮图标——设置;
  2. 搜索“环境变量”;
  3. 选择“编辑系统环境变量”;
  4. 在界面的右下方,选择“环境变量”;
  5. 在“系统环境变量”的列表里找到 Path并双击;
  6. 添加python和pip的路径。

通常情况下,python的路径是:

C:\Users\xxx.xxx\AppData\Local\Programs\Python\Python37

pip的路径是:

C:\Users\xxx.xxx\AppData\Local\Programs\Python\Python37\Scripts

树莓派 零,Raspberry Pi Zero 无疑是非常给力的一片嵌入式小板子。在刷好系统之后,稍加修改就能支持OTG直插到Windows或者Mac系统上虚拟出一张网卡,然后SSH操作。特别方便。

具体步骤网上很多,主要是三步,修改/boot下的config.txt 文件,在最后加上 dtoverlay=dwc2

然后,修改/boot下的cmdline.txt 在rootwait后面增加 modules-load=dwc2,g_ether,注意每个参数之间空格分开,且都是在同一行

最后在/boot下新建一个ssh的空文件,就行了。

但是,WIN10并不带相应的驱动,会错把树莓派识别成一个串口设备,这显然是不对的,需要驱动成RNDIS设备才行。直接双击那个错误识别的设备,然后更新驱动,从磁盘安装(不会的去搜索一下)。WIN10的驱动文件网上不是很好找,很多CSDN上的帖子都是要积分才能下,我在后面直接贴出来了,点击就能下载:RNDIS驱动程序

一些具体的内容之后在更新吧,这次主要记录关键的信息。

很多人都说STM32F103自带的硬件IIC不好用,其中,问的问题最多的是在 I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_MODE_SELECT) 这个地方卡住。其实吧,ST这么大的公司,也不至于在IIC这种基础总线上犯这么大的错误。

我使用的实际情况是IIC总线接口是单机热拔插的,我发现如果是冷插入,就是先连接好设备,在上电,就没什么问题,或者是先给从机上电,然后主机重启之后就一定没问题了。这很奇怪,我感觉是遇到了Error,于是就打开了所有的Error中断,最后发现在接口被拔下的时候,或者重新插上,会进入Bus Error  Flag,处理器会认为总线出了问题,当然没办法检测到已经设置为主机。我尝试了清除这些错误标记,但是依然不能用。

这个问题的一个解决办法是:每次主机发送完毕就关闭IIC功能,然后下次发送的时候重新初始化。

首先贴一个初始化的代码(STM32F103XXXX,固件库:V3.5.0):

void IIC_Configuration()
{
    // Clock Enable
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO | RCC_APB2Periph_GPIOB, ENABLE);
    RCC_APB1PeriphClockCmd(RCC_APB1Periph_I2C1, ENABLE);
    // Port Setting
    GPIO_InitTypeDef  GPIO_InitStructure;
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6;
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_OD;
    GPIO_Init(GPIOB, &GPIO_InitStructure);
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_7;
    GPIO_Init(GPIOB, &GPIO_InitStructure);
    // IIC Setting
    I2C_InitTypeDef I2C_InitStruct;
    I2C_InitStruct.I2C_ClockSpeed = 400000;
    I2C_InitStruct.I2C_Mode = I2C_Mode_I2C;
    I2C_InitStruct.I2C_DutyCycle = I2C_DutyCycle_2;
    I2C_InitStruct.I2C_OwnAddress1 = 0x55;
    I2C_InitStruct.I2C_Ack = I2C_Ack_Enable;
    I2C_InitStruct.I2C_AcknowledgedAddress = I2C_AcknowledgedAddress_7bit;
    I2C_Init(I2C1, &I2C_InitStruct);
    // IIC Enable
    I2C_Cmd(I2C1, ENABLE);
}

发送时,首先要检测总监是否空闲,然后发送一个起始位,然后检查是否已经设置为主机模式,主要是检测总线是否有错误之类的,可以进去仔细跟每一位都有什么,我卡住的时候,跟到的是总线错误以及有未知的未读取的数据,因为我连接的两个从机在上电的时候其中一个也作为主机进行通信。然后发送地址,并检测状态。通过之后就可以发送数据了,然后检测是否发送完毕,最后发送一个结束标记。整个通信就完成了。具体代码如下:

while(I2C_GetFlagStatus(I2C1, I2C_FLAG_BUSY));// Wait IIC Bus Idle
I2C_GenerateSTART(I2C1, ENABLE);// Send Start Flag
while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_MODE_SELECT));// Wait Master Mode Ready
I2C_Send7bitAddress(I2C1, addr, I2C_Direction_Transmitter);// Send Slave Address
while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED));// Wait TX Mode Ready
I2C_SendData(I2C1, 0xAA);// Send One Byte
while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_BYTE_TRANSMITTED));// Wait Transmittion
I2C_GenerateSTOP(I2C1, ENABLE);// Send Stop Flag

这段代码可以基本解决发送,大家基本上卡在第三行或者第五行。所以在这段代码的最前面加上:

IIC_Configuration();

作用就是在发送之前再初始化,相应的,在MCU初始化的时候取消IIC的初始化。并且,在最后面加上:

I2C_Cmd(I2C1, DISABLE);

我是这样解决的我遇到的卡住问题的。虽然感觉也不是最根本的解决了问题,因为飞利浦公司的官方文档里写了IIC是支持热拔插的。不过经过很多次测试,这个方法很稳定。

最后说一下卡死这个问题,卡死是一个特别低级和特别要命的问题。一个好的单片机嵌入式程序(应该说是所有程序),遇到任何错误,都不应该卡死。卡死给所有用户的交互体验都是最糟糕的。像很多人习惯使用while循环来判定一个状态标记位,这其实是非常偷懒和不负责任的用法,最多在开发初期使用,之后一定要换成安全可靠的方案。下面提供我使用的一个方式:

首先,在开发初期,为了快速验证,难免会使用while来判定状态,这时候,就直接避免掉,以上文中的 while(!I2C_CheckEvent(I2C1, I2C_EVENT_XXXXXXXXX)); 为例:使用一个u8型的函数,Safe_I2C_CheckEvent(I2C_TypeDef* I2Cx, uint32_t I2C_FLAG) 来代替。这个函数的写法如下:

uint8_t Safe_I2C_CheckEvent(I2C_TypeDef* I2Cx, uint32_t I2C_FLAG) 
{
    while(!I2C_CheckEvent(I2Cx, I2C_FLAG))
    {
        //Complete Later #1
    }
    return 0; //Completed Flag
}

然后把原来程序里的while写法全部替换掉,虽然这时候的执行效果是一致的。在解决完基础问题之后,重新写 #1 部分。在内部加入超时判定,同时也可以做一些需要高速做的事情。如果判定为超时,则 return 1。这时候,我们会发现一个小问题,就是程序里并没有支持对于return 1之后的退出处理,反而return 1之后程序会继续运行,造成故障。

这时候,我推荐使用#define大法。#define是一个被诟病很多,但其实用好了非常神奇的预处理语句。我们把Safe_I2C_CheckEvent这个函数的名字改成 Safe_I2C_CheckEvent_Function,反正名字再长也无所谓嘛。然后写下如下代码:

#define Safe_I2C_CheckEvent(x,y) if (Safe_I2C_CheckEvent_Function(x,y)) return 1

这句话的意思就等于是保留了Safe_I2C_CheckEvent这个名字,这样原来程序里的内容都不需要变。并且,带有了可以让发送函数也return 1返回发送失败标记的功能。是不是非常巧妙!

今天就写到这里,希望大家能够解决问题!

将IAR升级到8.22之后,连带着Jlink的应用程序也会跟着升级到6.30,这个版本不支持在某宝上购买的OB的Jlink驱动,会弹出“The connected J-Link is defective”错误,还会引发整个IAR的崩溃。搜索IAR和上面问题的关键字,目前还找不到解决方案,但是很多人在Keil下解决了。虽然解决了,但是事实上对问题的理解是不太对的。

首先,问题的产生并不是因为驱动,而是Jlink的应用程序问题,Jlink驱动只是用来操作Jlink硬件底层的,在上面还有一个应用程序,而IAR事实上就是调用这个应用程序来下载程序。

所以,更新驱动是没用的。要找到Jlink的应用程序所在之处,由于本机上有7.5版本,因此我就在7.5版本的C:\Program Files (x86)\IAR Systems\Embedded Workbench 7.5\arm\bin文件夹下,发现了几个和Jlink有关的文件:

然后复制到8.0文件夹下的同样位置,然后再打开8.22,事情就这么解决了。

没有老版本的同学,可以点击免费下载: 覆盖文件

就是这样了!

下面是打赏二维码:

问我的人越来越多,意味着越来越多的人开始尝试LaTeX了,这是一件好事。不过我还是希望大家能够在我的文章下面直接提问,我一定会在一天之内回答的。因为我目前在+1区,和国内有时差,很多人问我问题的时候,我事实上在忙。而且,留言和解答也是给其他人一个参考。

参考文献一直是学术文章特别重要的一个环节。大家不禁要问,为什么要有参考文献呢?甚至不断有学生问我,Report要不要加参考文献?我来谈谈我对参考文献的理解好了。

为什么要有参考文献

我认为参考文献既有其实用价值,又体现学术道德。

在实用价值方面,合理的参考文献首先是用来表明某观点或结论的出处,为读者提供进一步研习的参考,或者为自己的观点提供可靠的论据。这种类型的参考文献在文献综述的时候会非常多的被使用。举个例子,如果你是个新手,从今年的顶级期刊或者会论文里找关于计算机视觉的文章,我敢保证绝对看不懂,基本上从第二句话就开始看不懂了,但是你可以顺着那句话的参考文献往前找其引用的文章,然后在看那篇,然后看不懂再看参考文献列表,这样只要花上一段时间就能找到相对的源头,然后就可以向后理解目前的最新进展了。

在学术道德方面,参考文献可以区别前人的成果和该文章的成果。一篇学术文章,本质上是用来“邀功”的,当然不能把别人的功劳算到自己头上。所以任何不是你自己提出的观点或者方法,都需要给出一个出处,也就是参考文献。

另外要特别提到的一点,几乎在任何时候,都不可以直接复制粘贴别人的话,尤其是整句整段的复制,这绝对是禁忌。

当然还有很多种关于参考文献的说法,无外乎是用处和道德两个方面的阐述。所以,学术文章必须要参考文献的。

回到Lab Report上来,那些电路知识是你自己提出的吗?肯定不是,从哪里来的呢?学术文章、课本、老师的ppt、网络资料、维基百科等等。当然网络资料和各种百科不推荐放在参考文献里,因为各种百科都是任何人可以随意编辑修改的,并不是真正可靠的信息。那为什么学术文章是可靠的参考文献来源呢?

这就要讲讲学术圈是怎么回事了(后面两段是故事,没时间可以跳过)。学术圈里最重要的一个事情就是论文发表,而到底怎么样才能发表一篇论文呢?都是谁来评审的呢?是不是有一些权威来评审这些投稿的论文呢?其实并不是的,学术圈的评审规则是同行评审(Peer review),一篇投稿的文章,会被期刊主编或者会议的主席按照细分领域分发给相应的副主编,然后有副主编来找若干名(一般3到5人)合适的审稿人,然后发给审稿人,审稿人要在规定的时间内给出符合规定的审稿意见(双规^-^),审稿意见一般包含是否同意接收以及相应的评语。是否同意接收也不是接收或者拒绝,而是中间也有好几类。然后副主编根据审稿人的审稿意见来下结论,对于期刊论文来说,一般除了彻底拒绝之外,都有机会根据审稿意见进行修改,再提交的。会议论文有时候有机会再次提交,有时候是一锤子买卖。审稿过程也有双盲审稿和单盲审稿,双盲就是投稿人不知道审稿人是谁,审稿人也看不到投稿人名字;单盲审稿的话,审稿人是知道投稿人的名字的。总之,投稿人一定不能知道审稿人名字,否则就可以各种腐败了(事实上这个圈子搞的很熟了,是比较容易审稿人中有熟人的,不过即便有熟人,学术圈毕竟也不太做特别离谱的事情,很差的文章必然不会被轻易放水)。所以,一经发表过的论文,尤其是好的期刊和会议上的论文,可以认为是可靠的参考文献来源的。

那任何判定一个期刊或者会议是不是好的呢?对于期刊来说,有SCI影响因子可以判定,一般在一个学科领域内,影响因子高的会比影响因子低的要好一些。SCI影响因子的重要判定依据就是引文数量,如果一个期刊中的论文被引用的次数很多,那说明受到同行的认可。所以,影响因子高的期刊的副主编为了维护期刊的声誉,比如要把控审稿的质量,胡来的成本还是相当高的。对于会议论文来说,在不同的圈子里都会流传着各种言论,基本上在哪个圈子自然就会知道哪些学术会议比较好。一般会议名称比较短,领域专一,区域覆盖范围大的会比较好,当然也有例外的。另外一个影响因素是录用率,录用率低的必然会好一些。学术圈里还有很多故事可以讲,之后有时间我再来说道说道。

参考文献的两种形式

对于英文学术写作,翻译成汉语叫参考文献的有两种,一种是Reference,一种是Bibliography。我的理解是Bibliography的范围要比Reference大一些,Reference一般就是指的引文,你在文中已经提过了,引文可以提供证据、提供更详尽的解释以及规避学术道德风险。而在Bibliography中,可以在文中不着重提到而添加参考文献,意思是这个文献对你的文章有启发,或者带有很基础的作用,你加进来也是为了给读者更全面的信息。

一般的文章都是用的Reference,在毕业论文中,因为涉及面会很广,所以会用Bibliography。其实也没有必要特别区分这两种引文的区别。

参考文献的各种格式

随便打开一篇正规的学术文章来看,都会发现参考文献的格式是很规范的,但不同的期刊或者会议之间要求的可能是不同的。常用的参考文献格式有:

IEEE格式

IEEE的全称是电气电子工程师学会,已经成为电子信息领域统治地位的组织了。旗下所有的期刊和会议论文的引文格式均使用其自己的格式。特点是在文中用[N]来编号,在文中末尾处将所有引文按照引用的顺序排列,引文的格式遵照其规定的格式(点击查看IEEE引文规范指导)。在EEE系,使用IEEE肯定是最正确的了。不过大家并不需要记住怎么排列标题作者这些信息,Bibtex帮我们来解决。IEEE的具体形式是这样的:

This is a sentence [1].

[1] X.-C. Yin, X. Yin, K. Huang and H.-W. Hao, “Robust text detection in natural scene images,” IEEE transactions on pattern analysis and machine intelligence, vol. 36, no. 5, pp. 970-983, 2014.

APA格式

APA是美国心理学会的简称。其特点是参考文献列表使用姓氏字母顺序排列。具体要求也很复杂(点击参考,最好别看)。其具体的形式是这样的:

This is a sentence (Yin, Yin, Huang, & Hao, 2014)

Yin, X.-C., Yin, X., Huang, K., & Hao, H.-W. (2014). Robust text detection in     natural scene images. IEEE transactions on pattern analysis and machine intelligence, 36(5), pp. 970-983.

Chicago格式

这种格式在北美比较常用。文献列表也是用姓氏排列的。但是在文中,作者的名字很短,不占篇幅。其他和APA很接近。

This is a sentence (Yin, et al. 2014).

Yin, Xu-Cheng, Xuwang Yin, Kaizhu Huang, and Hong-Wei Hao. 2014. “Robust text detection in natural scene images.” IEEE transactions on pattern analysis and machine intelligence, 970-983.

GB/T 7714-2015 中国标准

这是中文论文中的要求规范,由于我们今天主要说英文的文献规范,中文的就不给例子了。

Harvard格式

Harvard格式和Chicago格式其实比较接近,只是引文列表不缩进。列表也是按照姓氏排列的。

This is a sentence (Yin, et al., 2014).

Yin, X.-C., Yin, X., Huang, K. & Hao, H.-W., 2014. Robust text detection in natural scene images. IEEE transactions on pattern analysis and machine intelligence, 36(5), pp. 970-983.

MLA

MLA中,不在正文中出现年份,而是使用所有作者的姓氏。而且引文格式也比较简洁。

This is a sentence (Yin, Yin and Huang).

Yin, Xu-Cheng, et al. “Robust text detection in natural scene images.” IEEE transactions on pattern analysis and machine intelligence 2014: 970-983.

LaTeX中的参考文献管理与插入

干货来了!管理和插入参考文献,对于Word来讲绝对是噩梦的二次方,尤其是在不是用Endnote的情况下。即便用了Endnote,也是噩梦,并且Endnote是收费软件,价格非常贵。而在LaTeX里,简直就是特别轻松的事情。这一点很好理解,想想前面我们讲过的交叉引用,就知道有点像编程的LaTeX是多擅长这方面了。

首先确认使用的是我最新提供的完全版的模板,没有的请在github上同步,注意,原来的轻量级版本是没有Reference功能的,是刚刚更新的。Github地址为:https://github.com/feimax/latex_template_for_xjtlu_eee_light,和https://github.com/feimax/latex_template_for_xjtlu_eee

有请Bibtex隆重登场,听这个名字就挺LaTeX的,而且专门管参考文献的。Bibtex是个可以将一种统一的数据格式类型的参考文献按照要求变成各种格式的工具。这种统一的格式类似于下面这样:

@article{yin2014robust,
title={Robust text detection in natural scene images},
author={Yin, Xu-Cheng and Yin, Xuwang and Huang, Kaizhu and Hao, Hong-Wei},
journal={IEEE transactions on pattern analysis and machine intelligence},
volume={36},
number={5},
pages={970--983},
year={2014},
publisher={IEEE}
}

在这段代码中,所有的重要信息都已经定义好了,而用还是不用,以什么格式用,全部有Bibtex来生成。这就方便太多了。

而这种数据格式如果让我们自己输入,是不是也挺烦的,虽然会比Word方便一下。好在Google Scholar或者其他出版社网站(像IEEE)已经将绝大部分的文献都帮我们整理成上面这种格式了。

Google Scholar截图

IEEE网站截图

这两个网站都特别容易找得到。查找到这段bib格式化的文本之后,在模板的根目录里找reference.bib文件,用sublime打开,然后把上面的文本粘贴进去,保存。然后就可以在正文中调用了。在上面这段代码里,大家需要注意的是 “@article{yin2014robust,” 里的 yin2014robust。这个是之后引用引文的名称。在需要引用的时候我们只要输入:

\cite{yin2014robust}

然后编译,就可以生成正确的引文编号,并且后面的参考文献列表也就更新好了。如果是使用的sublime编辑器,并且正确安装了插件,在输入完 \cite{ 的时候就会弹出提示窗口了,非常的方便。如果是要在同一个地方cite两篇文章,就在中间用逗号隔开就行了,sublime也会自动提示,尝试一下就知道了。

最后说一下如果要换其他格式怎么办,注意看report.tex文件的最后几行:

\bibliographystyle{IEEEtran}
\bibliography{reference}
\addcontentsline{toc}{chapter}{Reference}

事实上在网上找一个任何其他格式的.bst 和 .cls 文件,然后放到工程文件夹里,并修改\bibliographystyle{IEEEtran}大括号中的文字为相应的格式的文件名,然后再重新编译就行了。就是这么简单。

今天写了这么多,看似只有最后一点是干货,其实我反而觉得这最后一点是所有网站都这么讲的,而前面是我自己很多想法和观点。希望对大家有些帮助。


确实写点东西不容易,还有很多同学不仔细看老是问我的。请大家继续支持。支付宝帐户是13584435676,比特币钱包是:1NBzPagXqFHrwzxT4haGnX7S9FuwTkvX39。新用了微信的赞赏码,这个也是长按就能扫描的,我将最低金额设置为了7.8,也就是一欧元,不多吧。


作者:程飞。未经作者允许请勿转载其他网站,可以转载朋友圈。6,612 次浏览

在我很小的时候,我妈妈不知道为什么断定我会喜欢软笔书法,就送我去学了很多年书法,大概从小学一年级一直到初中。其实我那时候更喜欢音乐~学书法的过程中,我确实临摹了不少字体,从大的方面看,有篆书、隶书和楷书,每一种我都能写的有模有样,我的微信头像的那个字就是我自己写的。那时候说不上多喜欢书法,毕竟每次练习都要连续站几个小时。我妈妈的初衷肯定是让我写好硬笔字,可惜的是我直到现在硬笔写的也是很糟糕。直到大学,我发现无论是中文还是英文排版,无论是Word还是PPT,我还是能够弄得有模有样。用什么字体,用多少字号,什么时候加粗,什么时候斜体,我似乎都能很好的掌控。

古罗马角斗场(Colosseo)

古罗马角斗场(Colosseo)

字体(font)是纸质印刷排版、电子出版物排版和各种广告传媒文章排版中最关键的因素没有之一。字体的学问还是很大的,虽然我自幼研习书法,但毕竟没有经过完善理论的学习,在这一讲中,我仅从我这么多年的文字排版的经验(since 1998,那时候还有一些同学没出生吧)来浅谈和闲扯一些字体知识。再者,我最近刚好游历人类文化的瑰宝、千年古城、意大利首都罗马,而西文中最常用的字体,就是Times New Roman了,在罗马城写字体这一讲确实有点意思。

首先,我们今天只说印刷字体。印刷字体就是看起来比较正规,比较不搞笑的字体。像什么娃娃体、手写体、书法字体(宋体不算)之类的,就不是印刷字体,这种字体当然几乎不会被用在纸质媒介和电子媒介中,除非是真的想不开,或者别有用意。

衬线or无衬线

如果想讲清楚什么字体用在什么地方,那必须对字体进行分类。首先我们按照是否带有衬线来进行分类:无论是中文还是西文,字体都可以被分为衬线字体serif和无衬线字体sans-serif。中文典型的衬线字体是宋体,典型的无衬线字体是黑体。而西文中,最常用的衬线字体是Times New Roman和Morden字体,最常用的无衬线字体是Arial,Tahoma,Helvetica等。

大家肯定发现这两种字体的区别了:衬线字体的笔画开始和结束的地方会有修饰性的衬线,笔画的粗细会有变化,尤其是横竖笔画会有较大差异,一般都是横笔画比较细,竖笔画比较粗;而非衬线字体的笔画是光滑的,而且笔画粗细比较一致。

这两种字体的应用场合众说纷纭,有人说衬线字体美观有利于阅读,有人说衬线字体很多多余部分,容易视疲劳。咱们用事实说话,绝大多数的期刊论文和报纸的,无论是中文还是英文,正文都是采用的衬线字体,这足以证明衬线字体是适合印刷品阅读的了。

衬线字体在分辨率高的介质上表现更好,印刷品是典型的高分辨率,一般在600dpi以上,我小时候用的喷墨打印机就已经支持到1200dpi了。而电脑显示器支持到retina级别(也就不到300dpi)才是最近几年的事情,还没有普及。有人可能会抬杠,说手机屏幕的分辨率早就到retina级别了,为什么手机几乎没有使用衬线字,手机上字体的实际尺寸实在是很小,如果用衬线字体,横线实在很细,我在Kindle Whitepaper3 (接近300dpi)用宋体字,字号合适的话效果也是不错的。有一次我用macbook pro做了一个阅读型ppt,用的宋体,自我感觉显示效果是很棒的,放到低分辨率的windows电脑上立刻就逊色特别多。两个原因,一是屏幕分辨率差异,二是即便是在同样分辨率的情况下,MacOS的字体渲染是要比Windows强很多的。

什么是字体渲染呢,目前无论是Windows还是MacOS用的字体文件都是矢量字体,可以无限放大不模糊,矢量图的概念之前我已经在插图那两讲讲过了。但是有一个问题,就是很多时候通过计算得到的点的位置不在屏幕上的整数像素上,如果只是简单的取整,字体显示就会特别垮,尤其在分辨率不高的情况下,如果是简单的加权取灰度,会好一些,但也很垮,这是一门挺深的学问,我也只是略知一二。所以在windows下,为了应对这种情况,就出现了Cleartype技术,通过这项技术可以让字体渲染的更好,但还是比Mac逊色很多。而无衬线字体因为粗细均匀,在低分辨率的情况下,即便有一些像素点无法精确渲染,但也能清晰显示,所以Windows在7之后都直接将系统字体改为无衬线字体,最新的字体是“等线”。Mac系统目前使用的系统字体也是无衬线字体,最新的版本是“苹方”。

为什么操作系统都倾向于用无衬线字体呢?因为系统界面上文字毕竟还是少的。我们看一下文字很多的情况:

从我自己的感觉上来说,衬线字体在文字密集的情况下的可读性是比无衬线字体好的。所以我的结论就是:正规的印刷品正文字体,建议使用衬线字体,标题可以使用无衬线字体,但也可以使用加粗的衬线字体。对于大家的Report和其他文章来说,一般认为是印刷品,虽然PDF也是在电脑上看的,但我自己还是把PDF认为是电子印刷品,所以,除非某些老师对无衬线字体有特殊癖好,否则大胆且自信的使用衬线字体一定没错的。别再都用Tahoma字体了,我个人是真心不喜欢看到Tahoma字体。

这是我在罗马角斗场里拍的一处遗迹,这个很显然是衬线字体。这个角斗场几次兴衰,我无法确定这块文字的年份,不过可以肯定的是,这种字体在欧洲肯定是非常流行的。

说到衬线字体,我们要对比一下Times和Modern系列。Times New Roman是1932年有Monotype公司设计,对传统的衬线字体进行了简化和美化,然后泰晤士报使用了这个字体。我个人也比较喜欢这个字体。而LaTeX的默认西文字体是Modern。从前面那张字体对比图来看,Modern字体更加传统一些,也是很漂亮的字体。我一开始也是常用Modern,后来还是把LaTeX模板改成了Times字体,看起来更加正式一些。

当然,无衬线字体自有它们的用武之地。除了在标题上使用,在PPT和海报中也是很常用的。PPT可以分为演讲型和阅读性两种,演讲型的PPT就是你作为讲者去现场演讲时配合你的讲述而使用的PPT,这种PPT只能有简要的提纲和图片,来辅助听众理解你的讲述,绝对不能放太多文字,以免听众只看不听。对于文字少的情况,那就可以使用无衬线字体了,会让文字看起来更加醒目。另外一种是你讲完,如果要留给大家你的PPT的话,最好是在演讲版本上加入辅助文字,让听过的人,甚至是没听过的人都可以基本理解你的演讲内容,如果文字很多,可以使用衬线字体。至于怎么做PPT咱们之后专门讲。

最后我想说的是,如果你没有太多字体使用经验,可以先按照我说的来做,可以迅速让自己变得专业起来。如果已经很有经验了,就可以很自如的发挥了。

等宽字体or比例字体

另外一种字体的分类是等宽字体和比例字体。我举一个简单的例子就很清楚了,大家看一下i这个字母,是不是很瘦。如果考虑整个句子的平衡和美观,那i的宽度应该是比A要小的,这就是比例字体,每个字母的比例是不同的。但是,对于早期的打字机和计算机来讲,处理这种比例字体是比较困难的,而把每一个字母的宽度设计出一样,会很方便,因此就有了等宽字体。后面计算机技术的发展就很牛叉了,当然不可能处理不了比例字体,但是程序员给等宽字体带来了第二春。写程序,很讲究格式上的对齐和缩进,比如说C语言里的大括号要对齐,大括号内的程序要缩进,而python直接使用缩进来标识作用域。

我们常用的等宽字体是Consolas,在Windows下的Sublime里,默认的就是Consolas字体,同时这也是无衬线字体。另一个常用的等宽字体是Courier New,这是一种衬线字体。另外,所有的汉字都是等宽字体,汉字是方块字,当然是等宽的。他们的效果如下:

如何在LaTeX里如何操作字体

字体设置

字体的设置在LaTeX里还是有点复杂的,我们下一次再讲。我在模板里已经规定好了,正文用Times字体,而且给了添加代码的方式,代码用的是等宽字体。

字体风格

斜体字:\textit{italic},或者 \emph{italic}

粗体字:\textbf{bold font}

细体字:\textlf{light font}

使用等宽字体:\texttt{code}

使用无衬线字体:\textsf{sans-serif}

所以字母大写:\uppercase{CAPITALS}

所有字母大写,但小写字母比较小:\textsc{Small Capitals}

字号(字体尺寸)

首先,在模板中,我们已经规定了对于A4纸张的最佳的字号是11pt了,最好不要乱改这个值。如果在局部需要改,从小到大请使用如下指令:

\tiny

\small

\normalsize

\large

\Large

\LARGE

\huge

\Huge

在需要变化的文字之前加入指令,结束之后用\normalsize让字体回到正常字体。或者用{\small Some Texts}来对若干文字进行修改。这部分之后会和字体修改一样细讲,目前掌握到这里就可以了。

这一讲,我们简单的讲了一下两种字体分类的方法,衬线字体or无衬线字体,等宽字体or比例字体,并且给出了相关的使用场景和案例。然后又在LaTeX里教大家如何运用。

参考:

https://en.wikibooks.org/wiki/LaTeX/Fonts

https://en.wikipedia.org/wiki/Times_New_Roman


旅途辛苦,写文不易。我不也是专业写手,但想把我掌握的一些知识“分享”给大家。打赏越多,必然我会写的更快,质量更好。请大家多多支持,扫码支持或者通过支付宝13584435676。比特币钱包是1NBzPagXqFHrwzxT4haGnX7S9FuwTkvX39.


作者:程飞。未经作者允许请勿转载其他网站,可以转载朋友圈。4,031 次浏览

从访问数据和打赏上看,能跟着我继续走下去的人我估计会越来越少了。不知道是大家已经掌握了LaTeX还是放弃了LaTeX。如果你真的放弃了,我觉得你可能这辈子都不会再学得会LaTeX了,你会越来越忙,越来越没时间学一个好的工具,然后因为没有好的工具,会越来越忙,进入死循环。相信我,可能没有什么比你在大二的时候能学会用LaTeX更重要的了,从现在到你硕士毕业少说有50到80篇的各种文章要写,用LaTeX给你的益处可能真的是无穷的。

从安装LaTeX和Sublime、基本写作框架、图片到公式,我相信一路能一起走过来的同学已经对LaTeX有所了解了,并且已经有人表示再也不想用Word了,这让人很欣慰。我也顺便简要的讲了Matlab的用法,基本上只要想学会的同学,经过练习一定可以学会。不过我要再次声明一下,如果是第一次看到这篇文章的同学,请从第一讲开始看,否则很多内容会非常迷茫。

今天我们主要来说一说表格。表格是学术写作非常常用的表达形式之一,通常用来总结归纳结果或者展示可归类数据,也有一些时候用于将一些同类的内容进行归类展示。当然,用LaTeX是必然可以做出高质量的表格的。

虽然我非常不喜欢Word,但是不可否认的一点是,我非常喜欢Word的表格功能,因为非常直观,尤其是Word相对早期的版本,大概是Office 98(比很多同学年龄都大)的版本,表格线的位置非常好控制,后期的版本知道现在的Word最新版,表格线的控制都是有些难度的。而LaTeX在表格绘制上虽然非常专业,但是很麻烦,尤其是遇到极为复杂的表格的时候,其语句的可读性比较差。

并且由于LaTeX是开源的,不断的有人编写新的Package来处理表格,所以也出现了不同的方法,我们在本文中先来讲述基本的表格使用方法,也就是并不需要新增更多的Package。我会将最传统的方法、一些好用的工具、以及一个非常“缺德”但可能也好用的损招。

LaTeX中正常的表格绘制基本方法

\begin{table}[h]
\label{tab:tab1}
\centering
\caption{ Title Of Table }
\begin{tabular}{ |p{2cm}|p{2cm}|p{3cm}| } % #1
\hline % 绘制横向表格线,在LaTeX中需要自己定义每一行的表格线
cell 11 & cell 12 & cell 13  \\
\hline
cell 21 & cell 22 & cell 23  \\
cell 31 & cell 32 & cell 33  \\
\hline
\end{tabular}
\end{table}

这个表格的绘制结果如下:

语法总是有点枯燥的,但我们还是要解释一下细节。首先,在这里我们使用了两种环境,最外层的是 table 环境,table 环境的作用是对表格添加标题和编号。在 table 环境下,我们定义了 \centering 是表格居中,对应的,如果想让整个表格居左,就用\flushleft,
局右显示就是 \flushright。并且定义了表格的标题,在 \caption 里进行定义。

在 table 环境下,我们需要再使用 tabular 环境来定义表格主体。在上面的代码中的#1位置,第二个大括号里就是定义表格每一列的情况。LaTeX允许定义多种单元格列的形式,通过如下表格列的格式标识符来实现:

p{宽度}: 指定宽度的单元格,支持多行文字自动换行,顶端对齐

m{宽度}: 指定宽度的单元格,支持多行文字自动换行,单元格垂直居中对齐

b{宽度}: 指定宽度的单元格,支持多行文字自动换行,底端对齐

l: 根据内容调整单元格宽度,不支持多行文字自动换行,左对齐

c: 根据内容调整单元格宽度,不支持多行文字自动换行,居中对齐

r: 根据内容调整单元格宽度,不支持多行文字自动换行,右对齐

上面所有的宽度单位建议使用公制的厘米,也就是cm,除非你真的熟悉英制单位。事实上由于我小时候竟然画电路板,所以对英制很了解,但依然不喜欢在日常中用英制。

在各个列之间,如果想需要绘制竖线,则使用 | 将上面的标识符隔开,如果需要双竖线,就使用 || 将标识符隔开。

这里会有一个小问题,如何既然设置了单元格宽度,又让内容居中呢?使用 p{宽度}<{\centering},就可以实现这个功能了。偶尔还是挺有用的。

另外,我们有时候会面临让一列都加粗,这时候可以通过在标识符的左边添加 >{\bfseries}p{3cm} 来实现加粗,而将 bfseries 替换为 itshape 后,则是斜体。粗体的英文是 bold,斜体的英文是 italic,italic 这个词是Italy的派生词,很好记,意大利有比萨斜塔,所以意大利体就是斜体字(一个猜想)。下一讲咱们来说道说道字体,我最近正在罗马,正好咱们用到的最常用的字体就是Times New Roman,而且斜体字又是以意大利这个神奇的国度命名的。我会在罗马写完字体这一讲。

我们再回到上面的例子中,还有几个特殊符号和命令我们没有解释。首先是 \hline,这个就是水平线,LaTeX制表需要指定每一行的水平线;然后是 & 符号,这个是在一行中,区分每一列的;最后是 \\ 符号,在表格中是重新起一行表格,注意别和C++的单行注释弄混了,方向是不一样的.由于在正常的段落中,\\就是换行符,但是在表格中换的是整个表格的一行,而不是单元格里段落的一行了,所以在单元格中,则使用\newline来进行换行。

有时候,我们并不想让所有的水平线覆盖所有的列,这时候可以使用 \cline{i-j}来替换 \hline,i和j分别是起始列和结束列。

初次使用表格,大家总会觉得LaTeX表格的行距特别紧,看起来不是很舒服。
在表格环境之外,定义这句:\renewcommand{\arraystretch}{1.5}
,其中的1.5就是1.5倍行距,根据相应的情况改变就可以了。如果不直接指定列宽,那么LaTeX表格会根据内容进行调整宽度,并在最后留出空隙;在指定列宽的情况下,也会在文章和表格线直接留出空隙。这个空隙也是可以调整的,通过语句:\setlength{\tabcolsep}{6pt}来调整,默认就是6pt,也可以使用cm作为单位。这两条语句都是放在 table 环境里,tabular环境外。

下面给出一个简单的例子,用上上面所有讲过的语法:

\begin{table}[h]
\label{tab:tab1}
\centering
\caption{ Title Of Table }
\renewcommand{\arraystretch}{2}
\setlength{\tabcolsep}{10pt}
\begin{tabular}{ |>{\itshape}c|p{2cm}| >{\bfseries}m{3cm}<{\centering}| }
\hline % 绘制横向表格线,在LaTeX中需要自己定义每一行的表格线
cell 11 & cell 12 & cell 13   \\
\hline
cell 21 & cell 22 & cell 23 \\
\cline{1-2}
cell 31 & cell 32 \newline 456& cell 33  \\
\hline
\end{tabular}
\end{table}

效果是这样的:

通过上面讲述的表格绘制的基本方法,已经可以绘制出相当专业的表格了。不过还要大量的细节功能还没有讲。后面慢慢讲。接下来我要说一些“损招”。

LaTeX表格损招

我前面已经表扬过Office系列在表格处理上确实很好用,并且在图片插入等章节已经讲过如何在Office PowerPoint里作图并且插入到LaTeX中。同样的道理,也可以在PowerPoint利用其可视性和便利性迅速绘制表格,并导出矢量图。这里唯一的问题就是如何让Figure的标识编程Table。于是乎,我想出来了如下损招:

\begin{table}[h]
\label{tab:tab2}
\centering
\caption{ Title Of Table }
\includegraphics[width=10cm]{fig/table.pdf}
\end{table}

原理很简单,就是把figure环境变成table环境就行了。然后在稍微调整一下图片宽度,让字体大小和正文匹配。这样你就可以做出任何复杂的表格了。是不是很绝的一个手段!

效果如下:

真的是爱怎么折腾就可以怎么折腾啊!哈哈哈!我在这里测试的时候并没有把字体改成一样的,请大家注意这一点,改成一样的字体,否则容易被看出来。

今天就写到这里,明天给大家更新在罗马写的字体专题。


罗马消费很高啊,写东西不容易,请大家多多支持,扫码支持或者通过支付宝13584435676。比特币钱包是1NBzPagXqFHrwzxT4haGnX7S9FuwTkvX39.


作者:程飞。未经作者允许请勿转载其他网站,可以转载朋友圈。5,231 次浏览