LaTeX 中文字体配置
LaTeX说到底还是一个排版系统,字体是排版关注的核心内容之一,但是由于历史原因,字体系统在设计和使用中混乱不堪, 深究起来就是巨坑,这里简单整理一下LaTeX在中文排版时的字体配置相关知识。 由于版权等原因,Tex Live 虽然已经打包了很多内容,但是并不会包括一些常见的中文字体,需要用户自行配置处理。 由于本文中的命令需要直接或间接依赖 fontspec 宏包,它是一个基于 XeLaTeX 和 LuaLaTeX 的字体配置宏包,因此不支持 pdfLaTeX,这个宏包可能会影响数学字体,在使用时可以传入no-math选项。 本文只考虑ctex宏包,在Windows/Linux系统的中文字体排版,并且只使用XeLaTeX。 本文主要参考ctex用户文档,以及LaTeX 中文字体配置基础指南 中文字体常识 与书法字体不同,中文印刷/显示字体主要有以下几种: 楷体:源自实际书写中的楷体得到的字体 宋体:从唐宋直到明清,印刷行业对字体从楷体进行的简化,典型的特点是横平竖直,并且有尖角等辅助结构。(与宋朝没什么特别关系,主要定型于明朝,在清朝被改称宋体,在日本被称为明体) 仿宋:...
LaTeX 定理与证明环境 + tcolorbox 宏包使用
amsthm 宏包提供了定理类和证明类环境,但是它们并不是开箱即用的,这里记录一下相关的使用方式和配置。 定理类环境 基于 amsthm 包可以创造定理类环境,语法包括如下几类 123456\newtheorem{name}{text} % 独自使用计数器\newtheorem{name}{text}[section-level] % 基于section层级设置计数器\newtheorem{name}{text}[counter] % 基于计数器层级设置下一层的计数器\newtheorem{name}[counter]{text} % 共享其它环境的计数器\newtheorem*{name}{text} % 不使用计数器 其中 name:必选的定理类环...
LaTeX 论文排版笔记
整理一下LaTeX论文排版中的基本要素,从默认的article文档类开始,并不涉及具体的期刊模板。 关于数学公式、数学字体和参考文献等更具体的内容,由于比较复杂,对其单独整理。 这里主要关注技术性内容,不讨论英文论文写作表达等非技术性的内容。 页面布局 通常需要在使用文档时首先全局地规定一些排版参数,如字号、纸张大小、单双面等等。 比如调用 article 文档类排版文章,指定基本字号为 11pt,双面排版,纸张为 A4 大小: 1\documentclass[10pt,twoside,a4paper]{article} 常用的参数如下: 指定字号,例如10pt,11pt,12pt,默认10pt 指定纸张大小,默认为美式信纸 letterpaper(大约 21.6 cm × 28.0 cm)。可指定选项还包括 a4paper,b5paper,executivepaper 和 legalpaper等。有关纸张大小页边距的更多细节主要通过geometry包设置,当然在这里设置也可以 单面/双面排版,twoside,oneside。双面排版时,奇偶页的页眉页脚、页...
LaTeX 数学公式与字体
整理一下 LaTeX 关于数学公式、数学字体以及相关的细节内容。 AMS 宏包 AMS 提供了一系列最常用的 LaTeX 数学宏包: amsmath 宏包: 提供了一套增强的数学排版命令和环境,使得数学公式的编辑和排版更加灵活和方便。 引入了一些新的数学环境,例如 align 和 gather,以便更好地控制多行公式的排版。 提供了诸如 \text, \DeclareMathOperator 等命令,用于在数学模式中插入文本或定义新的运算符。 amssymb 宏包:扩展了 amsmath,提供了额外的数学符号,如各种箭头、关系符号、集合符号等。 amsfonts 宏包:提供了一些额外的字体,例如 \mathbb 命令用于黑板粗体字母。 amsthm 宏包:提供了 theorem, lemma, proof 等定理或证明环境,方便用户在文档中定义和使用定理。 下面的数学公式绝大部分都需要这些宏包,默认已经被导入 1\usepackage{amsmath,amssymb,amsfonts,amsthm} 这些宏包在实际使用时可能要注意一下导入的先后顺序,...
LaTeX 命令行编译
整理一下关于 pdflatex,xelatex 和 latexmk 的基本使用和配置。 这部分的中文资料其实比较少,因为大部分资料都在关注 LaTeX 应该怎么写,而不是怎么用命令去编译, 本文参考: LaTeX技巧912:使用latexmk自动编译LaTeX 在终端中编译 LaTeX latexmk 的学习 Latex 编译和编写方案配置 — latexmk + latexworkshop Using Latexmk pdflatex & xelatex 基本使用 这里只考虑 pdflatex 和 xelatex 的命令行基本用法,对于含有中文的文档只考虑使用 xelatex 编译。 最基本的用法如下,使用 pdflatex 和 xelatex 编译指定的源文件,源文件的.tex后缀名可以省略。 12pdflatex [options] main.texxelatex [options] main.tex 在源文件之前可以添加若干的选项,选项形如-<option1>、-<option2>=<string>,具体选项见下文,注意必须...
LaTeX 图片与表格
整理一下关于LaTeX中插入图片和表格的笔记。目前使用的发行版为 TexLive 2024,系统为 Windows 和 Linux(Ubuntu22)。 图片 只考虑 pdflatex 和 xelatex 这两种编译引擎,考虑的图片格式包括:矢量图(pdf, eps),位图(png, jpg)。两种编译引擎都直接支持这些图片格式。 includegraphics LaTeX 本身不支持插图功能,需要 graphicx 宏包提供支持(或者更基础的 graphics 宏包,graphicx 宏包相当于其扩展) 1\usepackage{graphicx} 导入这个宏包之后,就可以使用 \includegraphics 命令来插入图片 1\includegraphics[<options>]{<filename>} 例如 12\includegraphics{example.png}\includegraphics{figure/example.png} 这里的图片文件名可以用相...
LaTeX 基本概念
这是关于 LaTeX 基础概念的笔记,不涉及具体的 LaTeX 语法细节,而是从宏观层面,包括历史和命令行用法等,来进一步理解 TeX 和 LaTeX 。(标准写法是 \(\TeX{}\) 和 \(\LaTeX{}\),但是显示效果不好,下文不采用) TeX 语言 TeX 排版系统是 Knuth 发明的一种宏语言,提供了几百个类似 \def 的基础指令用于排版,主要解决的是自动断行,以及公式布局等排版问题。TeX 语言的版本在升级到 3.0 之后,主版本号就不再发生变动,而是以 3.1,3.14,3.141 的形式在更新时不断接近 pi,这体现了 TeX 语言的稳定性。 关于排版系统的基本介绍,有一篇博客可以参考: 排版引擎纵谈:程序员的视角 TeX 语言并不适合直接使用: 最早设计时不支持非 ASCII 编码,更不要说 Unicode 字符和中文支持等 字体需要额外配置,不能利用系统现有的字体 原始的几百个基础指令太繁琐又太简陋,需要考虑很多细节 后续有很多基于 TeX 基本指令封装的宏集,让使用者可以忽略很多细节,例如在 LaTeX 格式中的 center 环境是如下...
LaTeX Tex Live 安装
整理一下 Tex Live 2024 在Windows和Linux(Ubuntu22)中的安装过程,主要参考TeX Live 2024 安装教程(Windows/WSL/Linux)以及一份简短的关于 LATEX 安装的介绍。 在Linux系统上的LaTeX编译速度普遍比Windows更快,而且速度提升非常明显,并且TexLive的安装也是如此,在Linux中的安装过程比Windows更快,这种优势即使是在WSL2中也是很明显的,因此我选择在Windows和WSL2中都进行安装。 下载Texlive镜像 随便找一个 CTAN 镜像站下载 texlive2024 即可,例如清华镜像。 texlive 的下载安装其实非常友好,在不同系统上都只需要同一个镜像文件(texlive2024.iso,大约 5 个 G)。 安装Texlive Windows 直接点击install-tl-windows.bat脚本安装即可,默认有GUI显示,根据提示进行确认即可。 其实也可以加上--no-gui选项关掉GUI,此时的安装过程和Linux类似。 最好重新设置一下安装目录,例如D:/texlive...
Brainfuck 语言与解释器
图灵机 图灵机(Turing machine)是图灵提出的一种抽象计算模型,它主要包括一个无限长的纸带(tape)、一个读写头(head)以及一系列状态和指令规则: 纸带(tape):图灵机的纸带被划分为单元格,每个单元格上可以存储一个字符。纸带是无限长的,可以向左或向右无限延伸。 字符表(alphabet):即字符的集合,它包含纸带上可能出现的所有字符。其中包含一个特殊的空白字符(blank),意思是此格子没有任何字符,这是默认状态。 读写头(head):读写头是指向纸带上的一个单元格的指针,可以读取/擦除/写入当前单元格的内容,也可以根据移动到相邻的单元格。 指令集(instructions table):包括一组有限长度的指令,它根据当前机器所处的状态以及当前读写头所指的格子上的符号来确定读写头下一步的动作,并改变状态寄存器的值,令机器进入一个新的状态。 状态寄存器(state register):它用来保存图灵机当前所处的状态。图灵机的所有可能状态的数目是有限的,并且有一个特殊的状态,称为停机状态。 图灵机可以接受一些输入并产生输出,并根据状态转换规则进行计算。这个模...
C语言 宏的学习笔记
对于宏有很多花里胡哨的用法,虽然C++已经不推荐使用复杂的宏,但是也要看得懂,因此整理一下。 基本概念 预处理器是一个正式编译C语言的源代码之前的文本处理工具,它负责执行预处理指令(#开头的指令),通常包括头文件包含,条件编译,宏等。 宏是预处理器支持的一种重要功能,允许程序员定义一些简单的代码替换规则:通过宏创建符号常量或者简单的代码片段,并在代码中多次使用。 这些宏会在编译前被预处理器替换为相应的内容。值得注意的是,预处理器只是文本处理工具,它不会分析任何语法层面的内容,行为完全是文本层面的。 预处理器支持的命令主要包括 文件包含:#include 用于在源文件中包含其他文件的内容 条件编译:#if、#ifdef、#ifndef、#elif、#else、#endif 用于条件编译,根据条件决定编译部分代码 宏定义:#define 用于创建宏,可以是简单的文本替换或带参数的宏 取消宏定义:#undef 用于取消已定义的宏 除此之外,还有几个不常见的命令: 错误指示:#error 用于在预处理阶段生成一个错误消息,编译终止,通常是用在条件编译中终止某个错误情形。警告指示#w...
