TEX:高阶用法
文章目录
- 定制LATEX
- 记数器
- 创建记数器
- 改变记数器的值
- 显示记数器的值
- 长度
- 橡皮长度
- 用户定义命令
- 用户定义的环境
- 标题定制
- 正文中标题设置
- 使用titlesec宏包设置标题格式
- 目录中标题设置
- LATEX 2ε\varepsilonε程序设计语言
- 命令的层次
- 文件识别
- 上载其他类和宏包
- 输入文件
- 检测文件
- 选项的处理
- Latex内部命令
- TEX命令
定制LATEX
记数器
创建记数器
用户可以用下面的命令创建自己的记数器:
\newcounter{记数器名}[上级记数器]
这里记数器名
就是刚建立的记数器的名称。它可以是任一字母的组合,只要不与已存在的记数器名称相同就可以了。因此不能用列在上面的LATEX记数器或者前面已经定义的记数器名称作为记数器名。可省参数上级记数器是另一个已经存在的记数器( LATEX的或用户自定义的)的名称,其作用就在于只要.上级记数器被\stepcounter
或\refstepcounter
命令(见下面)增1,,就把新建立的记数器重设为零。
当用\newcounter
创建了一个新的记数器,它的初始值就是零。\newcounter
记数器不能位于用\include
命令读进的文件中。因此最好把所有的\newcounter
命令都放在导言中。
改变记数器的值
\setcounter{记数器}{数}
这条命令的意义从字面上就可以知道了:指定的记数器被赋予给定的数值(整数)。
\addtocounter{记数器}{数}
利用这条命令,指定记数器的值增加了给定数值,数可以是正值,也可以是负值。
\stepcounter{记数器}
指定记数器的值增1,同时所有从属记数器(即所有把这个记数器作为自己上级记数器的记数器)的值被重设为零(见上)。
\refstepcounter{记数器}
这条命令的效果与\stepcounter相同,但它也同时把counter设为交叉索引命令\label中的当前记数器(见8.3.1节)。
记数器的值可以用下面的命令当做一个数值处理:
\value{记数器}
这条命令并不改变记数器的值。它通常与\setcounter
或\addtocounter
结合使用。例如,若用户已经创建了记数器mypag,那么就可以用命令
\setcounter{mypage}{\value{page}}
使它取与页码记数器page
有相同的值。
显示记数器的值
\arabic{counter}
以阿拉伯数字显示,
\Roman {counter}
以大写罗马数字显示,
\alph{counter}
以小写字母显示,
\Alph{counter}
以以写字母显示,
\fnsymbol{counter}
以脚注符号显示。
有一些记数器,还存在下面这样形式的命令:
\the记数器
这里\the
紧接着记数器的名称,如\thepage
。这种命令通常与\arabic{记数器}
是一样的,但也可以是几条记数器命令组成的。例如,在文档类book和report中,命令\thesection就是用章和节号组成的:.
\arabi c{ chapter}. \arabic{section}
这里\thesection的结果就是7.1 。
页码、公式或章节编号等等的自动显示,都是通过调用适当的\the记数器命令完成的。如果需要另一种不同格式的自动编号,比如说字母型的公式编号,相应\the记数器命令的定义就可以用7.3 节中的方法进行修改。
长度
给长度参数赋值的标准LATEX方法是用下面的命令
\setlength{\长度命令}{长度指定}
这里长度指定可以是指定长度(要有单位)或者另一个长度参数。在后一种情形中,\长度命令
就取这个参数的当前值。因此在一个list 环境中用\setlength{\rightmargin}{\leftmargin}
就可以使得右页边与左页边相同。
可以用下面的命令增加长度值:
\addtolength{\长度命令}{长度指定}
这条命令就把长度指定
加到\长度命令
参数上去。若长度指定为负值,就减去相应的量。同样,可以用另一个长度参数作为长度指定,参数前面可以有负号,这样就可以加上或减去这个参数。在长度参数前面的数值会与参数中的值相乘: 0.5\textwidth
意味着文本列宽的一半,而2\parskip
是段间距的两倍。
利用命令
\settowidth{\长度命令}{文本}
可以使\长度命令
参数的值等于处于LR模式(通常是从左到右)的一块文本的自然宽度。
类似地,命令
\settoheight{\长度命令}{文本}
\settodepth{\长度命令}{文本}
把\长度命令
的值分别取为文本在基线上方或下方的高度与深度。
橡皮长度
有些参数的值为橡皮长度,即这个长度可以伸展或收缩给定的量。
橡皮长度的语法是:
正常值
plus 伸展值
minus 收缩值
这里的正常值
,伸展值
和收缩值
都是长度。例如:
\setlength{\parskip}{1ex p1us0.5ex minus0.2ex}
其含义为:两段间的行距(称为\parskip
)等于当前字体中x的高度,但是该行距可以伸长到1.5 倍或收缩到0.8倍这个长度。有一个特殊的橡皮长度是\fill
。其正常长度是零,但可以伸展到任何长度。
最后,命令
\stretch{小数}
生成一个橡皮长度,其可展性是\fill
的给定小数倍( 2.4.2节)。用户要自己定义长度,可以用如下命令:
\newlength{\新长度命令}
这样就可以建立起长度\新长度命令,初始值为0pt。上面所讲的命令都可以用来处理它的值。
命令
\addvspace{长度指定}
会在其所处的地方插入给定长度指定的额外竖直距离。如果同时多次使用这条命令,那么实际被插入的间距是其中最大的那个,而不是所有间距的总和。这条命令只能用在两段之间。把它应用于用户自己定义的命令和环境中,可以使得生成的结构更像段落。
用户定义命令
在LATEX中可以用下面的命令定义或重定义新的命令:
\newcommand{\命令名称}[参数个数][可省参数]{定义}
\renewcommnand{\命令名称}[参数个数][可省参数]{定义}
这两组中的第一条命令是用来定义不存在的新命令。命令名称可以是字母的任意组合,只要不与别的命令重名即可。第二条命令是用来重定义一条已存在的命令。对这两种情形,如果调用了不正确的变量,都会给出一条
错误信息。第一个可省参数参数个数是一个介于1到9之间的数,它规定了新定义的命令或者被改变了定义的命令中有多少个参数值。在LATEX2e中可以存在的第二个可省参数值可省参数给出了新命令可以为可省参数值取
默认值。命令的实际定义是包含在定义中。
如果不确定给命令选择的名称是否已经存在,那么可以用
\providecommand{\命令名称}[参数个数][可省参数]{定义}
这条命令的语法与\newcommand
和\renewcomnand
命令完全一样。差别就在于如果命令已经存在,新定义就被忽略。想取得相反的效果(在不用确知命令是否存在的条件下,覆盖命令的当前定义)可以用如下方法得到:首先调用\providecommand
确保命令存在,然后用\renewcommand
命令给出真正的定义。然而,做这一操作时需要特别细心!
在定义部分,#1表示第一个参数值,#2 表示第二个参数值。把#1想像成u或v,把#2想像成n或m ,那么就可以很容易知道\anvec{arg1}{arg2}的操作方式了。
这种方式可以适用于有更多的参数值。
\newcommand{\subvec}[3]{\ensuremath{#1_#2,\ldots,#1_#3}}
我们已经知道有很多LATEX命令可以有可省参数值,这其中最典型的例子就是\newcommand 命令自身。在LATEX2e中,同样也可以使用户定义的命令有一个可省参数值。这样做的好处就在于,虽然多提供了一个参数,但在绝大多数情况下它取得只是标准值,不需要显式改变其值。例如,在上一节用户定义的命令\subvec中有三个参数值,分别相应于字母和第一一个及最后一个下标。然而,通常字母就是x,因此把它做为-一个
省参数不失为一个好主意,这样只有在字母不同时才需要指定。要做到这一点,利用如下命令:
\renewcommand{\subvec}[3][x]{\ensuremath{#1_{#2}, \ldots,#1_{#3}}}
它与前面定义的区别就在于[3] 参数值后面多了[x] 。这就说明了三个参数值中的第一个是可省的,其标准值为x。现在\subvec{i}{j}的结果就是xi,…,xj,而\subvec[a]{1}{n}的结果为a1…,aj 。
在用户定义的命令中只能有一个可省参数,而且也必须是第-一个,即定义中的#1。
用户定义的环境
可以用下面的命令来创建或修改环境:
\newenvironment{环境名}[参数个数][可省参数]{开始的定义}{结束的定义}
\renewenvironment{环境名}[参数个数][可省参数]{开始的定义}{结束的定义}
-
环境名:对于
\newenvironment
,它不可以与任一已存在的LATEX或用户定义的环境或命令重名。另一方面,对\renewenvironment
,则就必须有同名的环境存在。要对LATEX环境进行任何修改,都要求用户对LATEX的内部工作机理有相当深入的了解。 -
参数个数:介于1到9之间的数,说明环境有多少个参数值;如果忽略了这个可省参数值,环境就没有参数值。
-
(2ε)可省参数:如果第一个参数值( #1 )是可省的,这是它的默认值;它与
\(re)newcommand
( 166页)中的同名参数值行为一样。 -
开始的定义:当\begin{环境名}被调用时,被插入的初始化文本;如果这一文本中包含形如#n,n= 1…参数个数项,那么环境就要用如下形式调用:
\begin{环境名}{参数1}...{参数n}...
在开始的定义中出现的每个
#n
都要用参数n
取代。 -
结束的定义:当调用了\end{环境名} 时,要插入的结束文本;这里不要用哑参数值
#n
,因为它们只允许出现在开始的定义文本中。
标题定制
正文中标题设置
\makeatletter
\renewcommand{\section}{ \@startsection{section} {1} {\z@} {-3.5ex \@plus -1ex \@minus -.2ex} {2.3ex \@plus.2ex} { \normalfont\normalsize\CJKfamily{hei} } } \makeatother
说明:
-
\makeatletter
,是因为renewcommand
中使用了带@的命令,此类命令只能用于package/class
中,如果用于正文中,要用\makeatletter
和\makeatother
包起来; -
\@startsection
命令参数\@startsection{name}{level}{indent}{beforeskip}{afterskip}{style}
name
表示所定义的节标题的名称(不带反斜杠),比如section和subsection。level
是一个数字,可以定义节标题的命令层次。这个数决定了定义的节标题是否编号(若是小于等于secnumdepth
则被编号)也决定了标题是否会被编进目录(若是小于等于tocdepth
则被编号)。indent
: 定义节标题到版心左边的距离。此度量若是负数则标题进入边空。beforeskip
是一个长度,其绝对值表示标题到上文之间的距离。若是此距离为负数,则标题后面的第一个段落不缩进。此度量最好是一个可以被伸长和缩短的长度。另外标题总是另起一段的。因而parskip
已被加入到标题与上下文的距离。afterskip
是一个长度,其绝对值表示独立显示的标题到下文之间的垂直间距或者是段内显示的标题到下文之间的距离。此度量若是负的,则定义的标题是段内显示的。对于独立显示的标题,parskip也已被加进标题与下文的距离。style
:决定标题的内容形式。可以是任意影响文本排版结构的命令如加入尺寸\huge \large \bfseries 对齐命令等
使用titlesec宏包设置标题格式
\usepackage[center]{titlesec} %其中 center 可使标题居中,还可设为 raggedleft (居左,默认), raggedright (居右)。
最常用的格式设置命令:
\titleformat{command}[shape]{format}{label}{sep}{before}[after]
各参数含义如下:
- command 是要重新定义的各种标题命令,比如 \part,\chapter,\section,\subsection,\subsubsection,\paragraph,\subparagraph等;
- shape 是用来设定段落形状的,可选的参数有 hang , block , display 等
- format 用于定义标题外观,比如使标题居中、字体加粗等;
- label 用于定义定义标题的标签,就是标题内容前面的标号;
- sep 定义标题的标签与标题内容之间的间隔距离。
- before 用于在标题内容前再加些内容;
- after 用于在标题内容后再加些内容。
目录中标题设置
首先你要引入相关的包
\usepackage{titletoc}
如果你要采用双栏排版,需要引入包:
\usepackage[toc]{multitoc}
最常用的目录格式设置命令如下:
\titlecontents{标题名}[左间距]{标题格式}{标题标志}{无序号标题}{指引线与页码}[下间距]
标题名
设置所需修改的某一层次标题格式的标题名,如chapter、section等层次标题名,或是table和figure图表标题名,或者是l+层次标题名
,如lchapter、lsection等(修改层次内容文本格式)左间距
可选参数,不能省略标题格式
设置标题的整体格式,如字体、字体尺寸、与上一个标题的垂直距离等。该参数可空置。标题标志
设置标题标志的格式,如序号格式、序号宽度、序号与标题内容之间的间距等。该参数不能空置, 否则标题将无标题标志。无序号标题
设置无序号标题的格式,,如字体、字体尺寸等。 该参数可以空置指引线与页码
设置标题与页码之间的指引线样式以及页码的格式, 该参数如果空置,标题将无指引线和页码。下间距
可选参数, 用于设置标题排版后还需要执行的命令, 例如与下个标题的垂直间距等。该参数常被省略。
示例如下,第一个参数的section表示标题名,第三个参数{\bf \large}表示字体,粗体,大号,最后一个参数中的\hspace*{3cm}是为了产生一个右间距,使左右对称,因为前边左间距设置的也是3cm。
\titlecontents{section}[3cm]{\bf \large}{\contentslabel{2.5em}}{}{\titlerule*[0.5pc]{$\cdot$}\contentspage\hspace*{3cm}}%
LATEX 2ε\varepsilonε程序设计语言
命令的层次
命令有许多层次,它们的安全程度也相应不同。
- 用户命令(最高级命令):在本书及其它手册中进行了描述,其名称由小写字母组成,例如\texttt,它是永久被支持的LATEX外部定义;
- 类与宏包命令:其名称要稍长一些,而且大小写混杂(如
\NeedsTeXFormat
),主要是为程序设计人员提供的,而且也是有保障的;绝大多数是只能用在导言中的命令,但在类和宏包文件中并没有这个使用限制; - LATEX内部命令:名称中包含@字符,只能用在类与宏包文件中;虽然其中有些命令对得到特殊效果是密不可分的,但也无法保证永远可用;开发人员要使用该命令,那就有可能将来某一天自己设计的宏包变得不再能用了;
- TeX低级命令:名称也是由小写字母组成,而且没有@ ;即使LATEX继续演化,其功能也应该是稳定的,但这也不是绝对的;只要有可能,就尽量避免使用它们;
- 内部专用命令:是用在其它人员开发的类与宏包文件内部的命令;建议所有命令都前缀大写字母(以表示宏包的名称)后接@ ,这样可以避免与其它宏包发生冲突;例如,showkeys 宏包中有一条命令为
SK@cite
。
注意:
- 要用\newcommand和\renewcommand,而不用\def ;如果要使用某一个TpX的定义命令(因为调用某模板,或者因为必须用\gdef 或\xdef),那么先调用一个空的\newcommand 命令,以检测名称是否有冲突。如果无法确定命令名称是否存在,而且该命令不是很重要的,那么就调用一条空的\providecommand,然后再调用\renewcommand 。现在高级命令中可以定义有一个缺省值的命令,这使得原来经常要用低级命令的理由中缺少了重要的一条。
- 利用\newenvironment 和\renewenvironment命令,而不用 \自己的环境和\end自己的环境命令对。
- 要用\setlength命令给长度和橡皮长度赋值,而不要用直接等号方式。
- 避免使用TEX盒子命令\setbox, \hbox以及\vbox ;而要用诸如\sbox,\mbox, \parbox 一类的命令。利用LATEX2ε提供的可省参考值,原来对等价TEX命令的需求现在大大降低,而且LATEX版本相比起来要透明得
多。另外,当用了color宏包时,LATEX的盒 子仍然工作正常,而其它的命令结果就无法预料了。 - 如果想给出错误和警告消息,就用\PackageError和\PackageWarning,不要用@latexerr或@warning;前面两条命令也同时告诉用户消息的来源,而不是只把它们标为LATEX消息。
- 我们不会建议你只使用ifthen宏包中的\ifthenelse命令,以代替TEX的条件命令。但是似乎用这个宏包可以简化对条件的应用,而且符合LATEX语法
文件识别
\NeedsTeXFormat{格式}[版本]
例子:\NeedsTeXFormat{LaTeX2e}[1994/06/01]
在类或宏包中的第一条语句就应该是所 需要的TpX格式声明。虽然已有很多其它名称的格式,但只有名为LaTeX2e的格式才认识这条声明。而所有其它格式都会给出错误消息:
! Undefined control sequence.
此时,这条消息实际上就给出了提示信息。
标明类或宏包文件自身:
\ProvidesClass{类}[版本]
\ProvidesPackage{宏包}[版本]
版本都是由三部分组成的:日期,版本号以及附加信息。日期与上面的格式相同,而版本号可以是任何没有空格的标志,附加信息可以是有或没有空格的文本。例如,
\ProvidesPackage{shortpag}[1995/03/24 v1.4 (F. Barnes)]
上载其他类和宏包
在主文档文件中,类的读入是利用初始化\documentclass
命令来实现的,而宏包用的则是\usepackage
命令。在类和宏包文件内部,就必须使用下述命令:
\LoadClass[选项]{类}[版本]
\RequirePackage[选项]{宏包}[版本]
其中第一条命令可使得一个类文件上载另一个类文件,并且需要的话,可以给出选项;而第二条命令使得类和宏包文件上载其它的宏包。在任何类文件。中只能有一条\LoadClass
命令;不能在宏包文件中使用。这两条命令都可以用在文档文件中。其中的宏包参数值可以是几个宏包名称组成的清单,中间用逗号分开。
可省版本参数与相应的\Provides… 命令之间的关系在前一节中做了介绍;而我们下面将介绍选项参数的处理方式。
输入文件
\IfFileExists{文件名}{真}{假}
\ InputIfFileExists{ 文件名}{真}{假}
这两条命令都会在latex文件搜索路径中看看有没有指定的文件名,如果找
到了文件,就执行真,否则就执行假。而且,在\InputIfFileExists
命令中,执行了真后还会读入该文件。
检测文件
\listfiles
这条命令可以放在导言中,甚至\documentclass
命令的前面。在处理过程结束后,它会生成并显示出所有输入文件的清单,同时包括文件的版本和发行数据。用这种方法,我们就可以得到所有被包含进来的文件记录,当要把个文件送到另外的地方,用不同的安装版本进行处理时,这一记录信息就可能非常有用。由于非标准文件也有可能被包含进来,那么从上面的清单中可以很容易识别出来。
\ProvideFile{文件名}[发行信息]
\ProvideClass{Class名}[发行信息]
\begin{filecontents}{文件名}
文件内容
\end{filecontents}
这个环境可以用在文档开头,即\documentclass
命令的前面。这个环境首先会检测系统中是否存在一个文件,名为文件名,如果不存在,它就会把文件内容照原样写到那个名称相应的文件中。该文件可以是一个宏包,随后要用\usepackage
上载它。利用这种方法,少掉的非标准文件就可以与主文档文件一起寄送了。
我们推广上面那个简单例子,在开头部分输入
\begin{filecontents}{mymacros}
\newcommand{\te}{the end}
\end{filecontents}
选项的处理
在类和宏包中都可以有选项,其定义方式为
\DeclareOption{选项}{代码}
其中选项就是选项的名称,而代码就是选项要执行的指令集。在latex内部,实际上创建了一条叫\ds@选项
的命令。通常这些代码并不做任何事,只是设置一些标志,或输入一个选项文件.(\RequirePackage 不可用在选项代码中)在article.cls文件中的两个示例为
\DeclareOption{f1eqn}{\input{f1eqn . clo}}
\DeclareOption{openbib}{\setboolean{\@openbib}{true}}
可以用\DeclareOption*
定义一个缺省选项,这条命令并不需要选项名称,只是指定适用于所有被调用的未定义选项的执行代码。
有两条特殊命令,可能用在缺省选项定义的代码中:
\CurrentOption
由正在被处理的选项名称组成;
\OptionNotUsed
把\CurrentOption
声明为未处理的。
接下来就用下面的命令处理选项:
\ExecuteOptions{选项清单}
\ProcessOptions
\ProcessOptions*
其中\ExecuteOptions
会为选项清单中的每个选项调用\ds@选项
命令。在默认方式下通常就是建立起特定的选项配置。\ProcessOptions
按照所有选项定义的顺序执行调用的选项,然后删除它们。这也就是说这条命令只能执行一次。有星号的命令功能类似,只是它是按调用的顺序执行。为了与IATEX2.09样式兼容,现在仍然保留了命令\@options
,它只是\ProcessOptions*
命令的另-一个名称而己。
也可以用下面的命令为类或宏包定义选项:
\Pass0ptionsToClass{选项}{类名}
\Pass0ptionsToPackage{选项}{宏包名称}
其中选项是一串指定类或宏包文件可以识别的合法选项。这两条命令可以用在其它选项的定义中。最常见的用法就是把缺省选项传递给另一个类。
-
所有在
\documentclass
语句中的选项标记为全局的;认为其要应用于后面所有宏包,但用\LoadClass
上载的类除外;如果在主类中没有定义该选项,不会给出错误或警告消息; -
所有其它语句(包括
\LoadClass
和\PassOptionsTo. .
)给出的选项都是局部的;如果在相应的类或宏包中没有定义该选项,会给出一条错误消息; -
当所有宏包都读进来后,如果某一个全局选项还从来没有用过(从没有被定义),就会给出一条警告消息;
-
无论是全局选项,还是局部选项,都按照定义的顺序执行(除非调用了
\ProcessOptions*
)。
Latex内部命令
\@namedef{命令}{定义}
\@nameuse{命令}
就会定义并执行名为\命令
的新命令,其中命令名称中并不包含反斜杠。这个名称中可以包含任意字符,即使通常在命令名称中禁止使用的字符也可以。
\@ifundefined{命令}{真}{假}
如果\命令
不存在,就执行真,否则执行假。同样这里命令中也不包含反斜杠,而且任何字符都可以出现在命令名称中。这个检测语句通常用来有条件地定义命令,其功能现在已经被\providecommand
代劳。也可以用它确
定主类是否是article : @ifundef ined{chapter}{…}{.}可以用来检测
\chapter命令是否存在。
\ifnextchar 字符{真}{假}
用来检测下一个字符是否是给定的字符,如果是的话,执行真,否则执行假。这条命令通常用来定义有可省参数的命令,这时字符就是[。新扩展的\newcommand
命令用高级方法得到了这一效果。
\@ifstar{真}{假}
用来检测下一一个字符是否是星号*,如果是的话,就执行真,否则执行假。可以用它来定义带星号的命令和环境,这是高级命令做不到的。
\@for \对象 := \列表 \do {命令}
其中\列表
就是一条命令,被定义成一串用逗号分开的元素,而\对象
就相继取值等于每个元素,并对每个元素执行一次命令代码。例如,
\newcommand{\set}{start, middle,end}
\@for \xx := \set \do {This is the \xx. }
就会显示出’This is the start. This is the middle. This is the end.’
TEX命令
\def\命令#参数形式#{定义}
基本的参数形式是\def\basic#1#2{定义}
调用格式:\basic{arg1,arg2}
还可以是\def\compl[#1]#2{定义}
调用格式是\compl[arg1]{arg2}
是TEX中标准的定义命令。它等价于\newcommand
,只是它不会检查是否有名称冲突,而且参数的指定也不同。例如,显示科学记数法的命令\Exp
可以如下定义:
\def\Exp#1#2{\ensuremath{#1\times10^{#2}}}
或者
\newcommand{\Exp}[2]{\ensuremath{#1\times10^{#2}}}
对于这两种定义方式,\Exp{1.1}{4}
的结果都是1.1×1041.1\times10^41.1×104。然而,\def
还可以做得更多。它可以把参数放在一个模板中,例如
\def\Exp#1(#2) {\ensuremath{#1\times10^{#2}}}
这样可以得到更方便的记号\Exp1.1(4)
,而这是\newcommand
命令所做不到的。当定义命令时,不知道(或不关心)是否已存在同名命令时,或者要用模板时就用\def。有可省参数的命令实际上就是用模板定义的。
\gdef \edef \xdef
是\def
的变形;第一条命令给出一个全局定义,所得命令即使在当前环境或者{…}括号对外面也仍然有效;第二条命令是一个展开的定义,其中任何命令都具有自己本身的意义,而并不是把命令插入在定义中;最后那条是前面两条的组合,即展开的全局性定义。
\let\命令一 = \命令二 或 \let\ 命令一\命令二
使得\命令一
取\命令二
当前含义。这通常用来在重定义命令前保存其原来定义,从而可以同时使用其原来定义。
\relax
不做任何事,但通常用来插在应该有些什么东西的地方,但我们不想有内容的地方。
\if条件 真 \else 假 \fi
就是TpX中条件语句的形式。有许多不同形式的条件,我们这里就不一一介绍了,但常见的应用就是等价于LATEX的boolean开关命令:
\newif\if标志 = \newboolean{标志}
\标志 true = \setboolean{标志}{true}
\标志false = \setboolean{标志}{false}
\if 标志 .. \else .. \fi = \ifthenelse{\boolean{标志}}{..}{..}
对那些经常用这些语句的人而言,TEX形式要紧凑- -些,但它并不与一般的LATEX行事方式一致。
ifcase 数 文本0 \or 文本 1 \or...\fi
会根据数
的值来决定执行哪个文本
。
\endinput
终止对当前文件的输入。这并不是必需的方式,但所有的文件都用它结束不失为一个好的程序设计习惯。在主文档中不必用它,因为\end{document}
可以得到同样的效果。
相关文章:

TEX:高阶用法
文章目录定制LATEX记数器创建记数器改变记数器的值显示记数器的值长度橡皮长度用户定义命令用户定义的环境标题定制正文中标题设置使用titlesec宏包设置标题格式目录中标题设置LATEX 2ε\varepsilonε程序设计语言命令的层次文件识别上载其他类和宏包输入文件检测文件选项的处理…...

UML 类图
车的类图结构为<>,表示车是一个抽象类; 它有两个继承类:小汽车和自行车;它们之间的关系为实现关系,使用带空心箭头的虚线表示; 小汽车为与SUV之间也是继承关系,它们之间的关系为泛化关系…...

项目实战典型案例1——redis只管存不管删除 让失效时间删除的问题
redis只管存不管删除 让失效时间删除的问题一:背景介绍二:思路&方案三:代码模拟1.错误示范通过班级id查询课程名称执行结果通过班级id修改课程名称(并没有删除对应缓存)执行结果2.正确示范在错误示范的更新接口上添…...

@RequestParam和@PathVariable的用法与区别
PathVariable PathVariable 映射 URL 绑定的占位符带占位符的 URL 是 Spring3.0 新增的功能,该功能在SpringMVC 向 REST 目标挺进发展过程中具有里程碑的意义通过 PathVariable 可以将 URL 中占位符参数绑定到控制器处理方法的入参中:URL 中的 {xxx} 占…...

【大数据 AI 人工智能】数据科学家必学的 9 个核心机器学习算法
如今,机器学习正改变着我们的世界。借助机器学习(ML),谷歌在为我们推荐搜索结果,奈飞在为我们推荐观看影片,脸书在为我们推荐可能认识的朋友。 机器学习从未像在今天这样重要。但与此同时,机器学习这一领域也充斥着各种术语,晦涩难懂,各种机器学习的算法每年层出不穷…...

IronPDF for .NET 2023.2.4 Crack
适用于 .NET 2023.2.4 的 IronPDF 添加对增量 PDF 保存的支持。 2023 年 3 月 2 日 - 10:23新版本 特征 添加了对 IronPdfEngine Docker 的支持。 添加了对增量 PDF 保存的支持。 重新设计了 PDF 签名和签名。 删除了 iTextSharp 依赖项。 在文本页眉/页脚中添加了 DrawDivider…...

3.4-前端的10个问题
01、null和undefined undefined是全局对象的一个属性,当一个变量没有赋值或者访问一个对象不存在的属性,这时候都是undefined。 null:表示是一个空对象。在需要释放一个对象的时候,直接赋值为null即可。 02、箭头函数 箭头函数…...

开发手册——一、编程规约_9.其他
这篇文章主要梳理了在java的实际开发过程中的编程规范问题。本篇文章主要借鉴于《阿里巴巴java开发手册终极版》 下面我们一起来看一下吧。 1. 【强制】在使用正则表达式时,利用好其预编译功能,可以有效加快正则匹配速度。 说明:不要在方法…...

23.3.4打卡 AtCoder Beginner Contest 291(Sponsored by TOYOTA SYSTEMS)A~E
F题题面都看不懂嘞!开摆! 没找到合适的markdown, 截图网页翻译了我真是天才 比赛链接: https://atcoder.jp/contests/abc291 A题 题意 给出一个字符串, 找到第一个大写字母的下标 简单题就不多说了, 直接放代码 代码 void solve() {cin>>str;nstr.size();str"…...

Gem5模拟器,一些运行的小tips(十一)
一些基础知识,下面提到的东西与前面的文章有一定的关系,感兴趣的小伙伴可以看一下: (21条消息) Gem5模拟器,全流程运行Chiplet-Gem5-SharedMemory-main(十)_好啊啊啊啊的博客-CSDN博客 Gem5模拟器…...

【JAVA】List接口
🏆今日学习目标:List接口 😃创作者:颜颜yan_ ✨个人主页:颜颜yan_的个人主页 ⏰本期期数:第四期 🎉专栏系列:JAVA List接口一、ArrayList二、LinkedList总结一、ArrayList ArrayLis…...

Hbase RegionServer的核心模块
RegionServer是HBase系统中最核心的组件,主要负责用户数据写入、读取等基础操作。RegionServer组件实际上是一个综合体系,包含多个各司其职的核心模块:HLog、MemStore、HFile以及BlockCache。 一、RegionServer内部结构 RegionServer是HBas…...

【Java开发】JUC进阶 01:Lock锁详解
1 Lock锁介绍已经在【JUC基础】04简单介绍过了,本文做进一步的拓展,比如公平锁和非公平锁、📌 明白锁的核心四个对象:线程,共享资源,锁,锁操作包括线程如何操作资源,使用锁锁哪个资源…...

关于登录校验的解决方案以及原理(回顾知识点)--项目开发那点事(自问自答版本)
开始前奏: 嘻嘻😄 通常一个完整的系统,需要安全性的保证。如登录校验,登录成功后,才可以访问服务资源。在服务端渲染项目中,我们通常使用 session来进行登录校验。在前后端分离的场景中,很多时…...

【数据结构】邻接矩阵和邻接图的遍历
写在前面 本篇文章开始学习数据结构的图的相关知识,涉及的基本概念还是很多的。本文的行文思路:学习图的基本概念学习图的存储结构——本文主要介绍邻接矩阵和邻接表对每种结构进行深度优先遍历和广度优先遍历先识概念话不多说,狠活献上学习思想等等&…...

设计跳表(动态设置节点高度)
最近学习redis的zset时候,又看到跳表的思想,突然对跳表的设置有了新的思考 这是19年设计的跳表,在leetcode的执行时间是200ms 现在我对跳表有了新的想法 1、跳表的设计,类似二分查找,但是不是二分查找,比较…...

基于神经辐射场(Neural Radiance Fileds, NeRF)的三维重建- 简介(1)
Nerf简介 Nerf(neural Radiance Fileds) 为2020年ICCV上提出的一个基于隐式表达的三维重建方法,使用2D的 Posed Imageds 来生成(表达)复杂的三维场景。现在越来越多的研究人员开始关注这个潜力巨大的领域,也…...

【AI面试】NMS 与 Soft NMS 的辨析
往期文章: AI/CV面试,直达目录汇总【AI面试】L1 loss、L2 loss和Smooth L1 Loss,L1正则化和L2正则化 一、NMS 非极大值抑制(Non-Maximum Suppression,NMS),并不是深度学习时期,目标…...

一文让你彻底理解Linux内核多线程(互斥锁、条件变量、读写锁、自旋锁、信号量)
一、互斥锁(同步) 在多任务操作系统中,同时运行的多个任务可能都需要使用同一种资源。这个过程有点类似于,公司部门里,我在使用着打印机打印东西的同时(还没有打印完),别人刚好也在…...

利用python写一个gui小公举--环境搭建
文章目录背景搭建环境安装必要库添加工具快捷方式检验背景 在实习过程中遇到一个问题,某项目是通过python代码实现的,而且需要一直修改参数实现功能,过程有些繁琐。虽然师兄用PHP study搭了一个网站用于查看结果,但是还是过于繁琐…...

英飞凌Tricore实战系列02_ENDINIT属性看门狗原理及应用
目录 1.概述2.ENDINIT功能及使用2.1 ENDINIT属性2.2 改写受ENDINIT保护寄存器的步骤3. Tricore 看门狗介绍及使用3.1 看门狗系统介绍3.1.1 安全看门狗介绍3.1.2 CPU看门狗介绍3.2 看门狗模式介绍3.2.1 Time-out模式3.2.2 正常模式(Normal Mode)3.2.3 禁用模式(Disabled Mode…...

Java Number类
Java Number 类是一个抽象类,它是所有数字类的基类。Java 中的数字类包括 Byte、Short、Integer、Long、Float 和 Double,它们都继承自 Number 类。Java Number 类提供了一些常用的方法,可以用于将数字类型转换为不同的格式,以及进…...

C++构造和析构
欢迎来观看温柔了岁月.c的博客 目前 设有C学习专栏 C语言项目专栏 数据结构与算法专栏 目前主要更新C学习专栏,C语言项目专栏不定时更新 待C专栏完毕,会陆续更新C项目专栏和数据结构与算法专栏 一周主要三更,星期三,星期五&#x…...

docker安装即docker连接mysql(window)
一 安装docker 1.什么是docker Docker容器与虚拟机类似,但二者在原理上不同。容器是将操作系统层虚拟化,虚拟机则是虚拟化硬件,因此容器更具有便携性、高效地利用服务器。 2.WSL2 WSL,即Windows Subsystem on Linux,中…...

HMM-维特比算法
HMM-维特比算法(viterbi)HMM回顾隐马科夫链解法:维特比算法(Viterbi)HMM回顾 最终的公式可以解释主要分为两个部分: P(xi|yi),发射概率,字面意思是从一个词性中发射/生成出某一个单…...

【C++初阶】2. 类和对象_1
1. 面向过程和面向对象的初步认识 2. 类的引入 C语言结构体中只能定义变量,在C中,结构体内不仅可以定义变量,也可以定义函数。比如: 之前在数据结构初阶中,用C语言方式实现的栈,结构体中只能定义变量&#…...

kotlin把函数作为参数转递给另一个函数
kotlin把函数作为参数转递给另一个函数 fun say(s: String, foo: (String) -> Unit) {print("hello")foo(s) }fun hi(str: String) {println(str) }fun main(args: Array<String>) {say("hello", ::hi) } 输出: hellohello...

海思嵌入式开发-005-OpenHarmony源码编译问题
海思嵌入式开发-005-OpenHarmony源码编译问题一、问题描述二、解决方案2.1解决原理2.2获取OpenHarmony 3.1.1 Release源码2.3最后解决问题,编译成功。一、问题描述 按照链接拉取master源码,出现如下问题,打开build.log文件 提示相应位置的文…...

指针的进阶续(笔试题强化练习)
写在前面:在上次我们学习了指针的相关类型的知识,对指针家族的成员基本有了了解,这次让我们跟着一些题目来练习和补充一些知识,这有助于我们强化理解这些知识。 话不多说,我们马上开始: 1.指针和数组的笔…...

一个供参考的计算机的学习路线
本文是介绍如何成为一个Geek,一个真正的计算机高手。 适合有成为IT领域技术大牛的人参考。 写给大一新生和所有向深耕IT领域的人,避免走一些弯路。 仅代表个人想法,供批判性参考。 第一门入门的必备功课-语法与算法 什么是计算机?…...