latex索引格式语法

一本书的引文、人名和专有名词索引是非常重要的,能够给读者提供很多帮助。在Latex里面,引文比较简单,用bib文件和\cite命令就可以自动完成。索引稍微麻烦一点。

首先,需要一个索引列表,类似下面的定义的每一个人名或者专有名词。

\newglossaryentry{name:Newton}{type=name, name=Newton, text=Newton, description={Isaac Newton(牛顿)}, sort=Newton}
\newglossaryentry{term:经典力学}{type=term, name=经典力学, text=经典力学, description=Classical Mechanics, sort=JingDianLiXue}
\newglossaryentry{term:Newton力学}{type=term, name=Newton力学,text=Newton力学, description=以Newton第二定律为核心的力学, sort=Newton力学, parent=term:经典力学}

其次,需要在正文中功过\gls{name:Newton}使用这些索引项。

接着,只要在Latex的声明部分做过如下的说明,在系统运行下面的命令之后,就会自动产生高质量的索引。

\usepackage[nomain,acronym,xindy,toc, style=alttreehypergroup,nolong,nosuper]{glossaries}
% The alttree type of glossary styles need to know the
% widest entry name for each level
\glssetwidest{term:Lagrangian方程} % level 0 widest name,找出来你的列表中最长(0级索引项)的名字,这样系统好对齐
\glssetwidest[1]{term:Lagrangian方程} % level 1 widest name,找出来你的列表中最长(1级索引项)的名字
\glssetwidest[2]{term:Lagrangian方程} % level 2 widest name,找出来你的列表中最长(2级索引项)的名字

\usepackage[xindy]{imakeidx}
\usepackage{listings}
\newglossary[tm]{term}{term}{te}{名词索引}
\newglossary[nm]{name}{name}{na}{人名与常用翻译}
\makeglossaries

编译阶段,在xelatex 文件名以及bibtex 文件名之间,加入运行一个makeglossaries 文件名,就会自动的到索引。为了索引格式正确,需要多次运行xelatex 文件名 这个命令。

万能格式转换器pandoc用于书稿格式转换

一直打算把我的latex格式的书稿变成markdown格式和mediawiki格式,或者html格式。原来latex2html可用,不过遇到中文,会出很多问题。现在终于找到了pandoc万能格式转换器。太牛了,基本上转换了以后是可读的,需要额外修改的工作量不是很大。

按照pandoc的介绍,它能够把Markdown, reStructuredText, textile, HTML, DocBook, LaTeX, MediaWiki markup, TWiki markup, TikiWiki markup, Creole 1.0, Vimwiki markup, OPML, Emacs Org-Mode, Emacs Muse, txt2tags, Microsoft Word docx, LibreOffice ODT, EPUB 和 Haddock markup 转化成HTML, Word,Ebooks,TeX家族,PDF。实在太强大了。

理想中的教和学的体系

学科边界是存在的——研究对象和问题、思维方式、分析方法有共性自然就成了更加紧密联系在一起的知识和研究者了,于是就成了学科。同时,跨越和融合边界的问题、思维方式和分析方法也是存在的——有的时候某些问题就是放到不受具体学科限制的框架里面来解决更合适。在这样一个背景下,如何培养学生,用什么样的体系?

我认为,这个可以依靠一个仅仅受知识之间的联系——也就是各个学科的合起来的概念地图——制约的教和学的体系,来解决。

首先,这样的整体知识概念地图——我称之为知识高速公路——要建立起来。当然,建立的方式,可以先从目前的学科分科课程分科体系下的课程和学科开始。但是,将来是要突破这个分科的体系的。也可以直接从构造整个学科甚至整个人类知识的知识骨架开始。

接着,有了这个知识高速公路,可以通过算法和人合作的方式,重新来构造一些课程分类——实际上就是这个知识高速公路上的聚类分析。做了聚类分析之后,我们得到了粗粒化的课程主干道(连边通常是有向的):每一门课程是如何和其他课程联系起来的,内部存在哪些逻辑上的依赖关系,以及内容上的重叠关系等等。当然,实际上,也可以不做这个聚类过程,直接走到下一步。

然后,对于每一门课程,或者直接就是每一个概念,构建教和学的资源,例如书籍、论文、视频课程、讲得好的老师等等。到这里为止,呈现在老师和学生面前的就是一个概念层面的加了资源的知识高速公路,或者是在课程层面的加了资源的课程主干道。

再次,对于学习者,除了有些主干道上的道路所代表的有向联系,不能再有其他学习上的约束。学习者想学习什么,只要逻辑关系上是大概相符的,就可以选来学(部分学生可以跳着学的,就可以让老师个案判断是否允许这么学)。于是,在学习的层面来说,没有专业的边界的限制。同时,在具体课程上,尽量开设同一个主题的多层次课程——豆腐可以凉拌、红烧、麻辣甚至做成臭豆腐——供学习者自己选择。

那么,这个时候,怎么授学位呢?尽管学习过程是不受限制的,除了知识和课程之间的逻辑关系,但是,某专业的证书是可以提出来要求的。例如,物理学专业可以要求,力学、理论力学、统计力学和量子力学是必学课程。具体什么课程当然是要讨论的和选择的,我仅仅举个例子。这四门课分别是什么呢?力学是物理学导论课,知识部分很少有新的,主要是讲物理学家思考什么问题、如何思考、如何计算。后面三个,或者还可以加上相对论,是物理学后续学习的知识和方法的基础。例如学习到最小作用量原理以及用这个原理来统一物理学这个思路和梦想。也就是说,任何一个学科,要有这个学科的导论课——初步交代这个学科的大图景的,然后要有尽量少的核心课程。这些可以作为这个专业毕业授予学位的要求。

顺便,在这样的提一个体系下面,除了临近毕业的时候,学生是完全没有专业和所属的学科和学院的。学什么决定权在学生手上。当然,学科的老师可以去影响和宣传,方式就是通过开设自己的最好的学科导论课和学科核心课。

顺便,说到这个学科导论课,可能有人会觉得和通识课差不多。是的,这就是通识课的意思,但是,不是很多人开设的通识课:通识教育不是肤浅教育,导论课或者通识课一定要用足够简单的例子足够好地体现好学科大图景,在对学科的理解上不能有丝毫的放松,放松的仅仅是更细节的知识。从这一点上来说,通识课的开设比专业核心课,难得多。没有深入永远也不可能浅出,不站在山顶,永远也不可能一览众山,看到概貌。

最后,在教和学的细节方法的层面,要强调系联性思考、批判性思维,要做理解性学习,要培养学生对学科的情感和责任感,要让学生学会学习和思考,要喜欢去做问题解决和提出问题。

我不知道什么时候,这个我理想中的体系能够实现。希望能够找到一群志同道合的以来来实现。

在这样的体系下面,更多的学生有可能可以找到自己,更多的学生可以成为自己,而且鼓励成为自己。每一个毕业生的知识和能力背景,完全就是自己在知识高速公路上用自己的汗水染出来的一张自己的图。我都不能预期培养出来的会是什么样的人,但是,至少是具有创造性的,理解深刻又不太受限制的人。

研究和教学中的数学建模

提出问题,把问题转化成一个数学问题是科学研究中非常非常重要的两步。当然,解决问题和检验,也是重要的,不过,我认为比不上前者。把一个问题用合适的数学结构来表达,需要考虑这个问题内在的结构——也就是这个问题里面有哪些关键因素,这些关键因素之间有什么关系,这个系统的状态如何描述,如果有变化呢,则还关心如何变化、什么导致的变化。而这一步,传统上,叫做数学建模。

采用什么样的数学结构来描述所面对的系统的状态,这是数学建模要解决的第一个问题。理想情况,我们希望这个表示是忠实的:任何这个系统的状态都可以用这个数学结构来描述,任何这个数学结构的状态都在所面对的系统上找得到对应的状态;任何一个对这个状态的操作,正好对应这个数学结构上的一种映射;任何一个这个数学结构上的映射,正好对应着对这个实际系统的一个操作。当然,这样的理想情况一般是做不到的,这个时候,我们只要在我们关心的范围内满足上面的忠实性就可以,甚至只要近似地满足忠实性就可以。

于是,这个时候,我们自然要通过了解系统的状态,以及可能的对这些状态的操作,来寻找合适的数学结构。另一方面,我们也必须考虑,某一个在这个数学结构上能够做的计算,对应着什么样的实际系统的性质或者操作。

实际上,我认为,大多数时候,理论科学家,尤其是理论物理学家、系统科学研究者,都在做这样的数学建模的事情。因此,我也打算什么时候来建设一门数学建模的课程。实际上,这个帖子就是供我自己慢慢整理,形成一个这样的课程用的。当然,也非常欢迎有人给我提供线索。

比如说,量子系统的数学模型——以Hilbert空间矢量为基础的量子力学,就是这样的数学模型的极好的例子。当然,经典力学的质点——刚体——弹性体——流体也是,甚至背后的确定性方程——随机性方程也是。不过,有一些可能需要比较多的数学和物理的基础,不一定适合当做数学建模的例子。

网络科学的例子应该有很多,例如网络上的传染病模型,以及我们自己的汉字学习和检测的工作,广义投入产出分析的工作等。另外,昨天偶然得到一个很好的小例子:一个学生在计算地铁网络在攻击下的抗毁能力,主要通过攻击之后剩下的最大连通集团的大小来当指标;这个时候,一个自然的问题就是,为什么选择这个指标是有实际意义的,在实际问题中意味着什么,如果要让这个指标有实际意义我们需要做什么假设,这个假设是否具有合理性。在实际问题中,这样的思考往往就能够创新性的来源,并且这也是任何数学模型必须解决的问题——为了这个表示具有合理的“忠实性”,我们的假设是什么,数学结构和实际对象之间的联系是什么。

有了这个大原则——数学建模就是找到能够忠实或者近似忠实地表示实际系统的数学结构,我们还有一些更小的典型思维方式。比如说,数学建模更多的是艺术,而不是技术,尽管我们会非常努力地技术化一般化。因此,在教和学数学建模的过程中,就必须采用欣赏、临摹、创作的方式,而不是做大量的习题求解的方式。再比如说,数学建模不应该按照模型解法来分类教学,而是按照建模的思想,建模所需要的思维方式来做教学。更多的其他思维方式以后再整理,或者等遇到合适的例子再总结在这里。

基于这个数学建模的典型思维方式的重要性,在系统科学和物理学导论里面,都应该增加一小节关于数学模型的介绍、讨论和欣赏,除了专门开设数学建模课程之外。其实,这个小节比较简单,只需要用之前讲过的例子,但是从数学模型的角度来再一次欣赏和讨论一下就可以,而且可以放在数学和科学的关系那个大标题下面。

顺便,数学模型应该由科学家来教,而不是数学家。当然,非常厉害的数学家是能够看到数学和实际问题之间的联系的,也是受实际问题启发的。这方面可以看看Gowers的《Mathematics, a very short introduction》,或者丘成桐、陶哲轩对这个问题的讨论。不过大多数数学家就会进入某一个已经数学化形式化的问题里面去做。这也是由数学的特性决定的——严密的逻辑演绎在数学里面的特殊重要性:不想科学还可以实践检验,数学就只能检验内在自洽性,于是自然也就更强调严密。因此,这个不是数学家或者数学的缺陷,而是自然使然。那么,谁来教数学建模?科学家,有具体领域背景的科学家和没有具体领域背景的计算机科学家,一起来完成。

致病和治病同时传播的传染病

根据我们的汉字检测模型——那里实际上是一个字的状态——被认得和不被认得(加上未确定,其实三状态)——两个相互冲突的状态在网络上传递或者说推断,我们提出来一个三状态——待感染、染病和染药三个状态的传染病模型。待传染的个体可以通过接触染病个体变成染病个体,也可以通过接触染药个体变成染药个体。同时,染病个体也可以通过接触染药个体变成染药个体,甚至三个状态的任意一个;染药个体也可以通过接触染病个体变成染病个体,甚至三个状态的任意一个。

任何一个时候每一个个体\(j\)的检测状态记为(\(k_{j}=\left\{1, 0, -1\right\}\))分别代表染病、待感染和染药。我们有一个接触网络\(A\),代表这些个体之间可能的接触。染病和染药两种传播可以在一个网络上,也可以在同样顶点的两种网络上,传播矩阵(意义稍后定义)分别记为\(\Omega^{\left(\pm\right)} = \left(\omega^{\left(\pm\right),i}_{j}\right)\)。再简单情况下,可以直接取\(\Omega^{\left(\pm\right)}=A\)。在\(t\)时刻,任意一个个体的状态描述是\(p\left(k_{j}, t\right)\)。

这个模型和同一网络,或者双关系网络——同样的一组顶点通过两种关系形成两个网络,上的两种传染病独立传播模型最大的区别是:这里的两种传染病是可以相互抵消的。下面我们来考虑抵消的动力学。

两种传染病抵消机制的简化描述

我们也可以定义一套新的状态变量\(\eta^{\left(1\right)}_{j}, \eta^{\left(-1\right)}_{j}\),并且上面的几率分别表达成
\begin{align}
q^{\left(1\right)}=p\left(1_{j},t\right) = \frac{\eta^{\left(1\right)}_{j} \left(t\right) – \eta^{\left(-1\right)}_{j} \left(t\right)}{\eta^{\left(1\right)}_{j} \left(t\right) + \eta^{\left(-1\right)}_{j} \left(t\right)}\theta\left(\eta^{\left(1\right)}_{j} \left(t\right) – \eta^{\left(-1\right)}_{j} \left(t\right)\right) \notag \\
q^{\left(-1\right)}=p\left(-1_{j},t\right) = \frac{\eta^{\left(-1\right)}_{j} \left(t\right) – \eta^{\left(1\right)}_{j} \left(t\right)}{\eta^{\left(1\right)}_{j} \left(t\right) + \eta^{\left(-1\right)}_{j} \left(t\right)}\theta\left(\eta^{\left(-1\right)}_{j} \left(t\right) – \eta^{\left(1\right)}_{j} \left(t\right)\right) \notag \\
p\left(0_{j},t\right) = 1-\frac{\left|\eta^{\left(1\right)}_{j} \left(t\right) – \eta^{\left(-1\right)}_{j} \left(t\right)\right|}{\eta^{\left(1\right)}_{j} \left(t\right) + \eta^{\left(-1\right)}_{j} \left(t\right)} = 1- q^{\left(1\right)} -q^{\left(-1\right)}
\end{align}
注意,采用\(\eta^{\left(1\right)}_{j}, \eta^{\left(-1\right)}_{j}\)这组变量以后,问题极大简化了,这是一个假设。

现在,我们已经清楚了系统状态的描述\(P\)(每一个个体都有一个状态分布函数,整体状态构成一个分布函数大矢量。这个矢量的具体写法可以采用直积或者直和,再说,现在用不着)和初始条件\(P\left(0\right)\),我们来构造一个动力学过程\(P\left(t-1\right)\rightarrow P\left(t\right)\)。将来,我们要讨论这样的问题:末状态如何依赖于初始条件和模型参数。

我们先讨论动力学过程。每一步(记为\(t\)时刻),我们选择一个个体\(i\)来看其状态变化。

考察这个个体的一级近邻。对于每一个一级近邻\(j\)按照如下方式来影响\(i\)的状态:

  1. 如果\(k_{j}=0\),则没有影响
  2. 如果\(k_{j}=1\)(这个时候可以约定\(\eta^{\left(1\right)}_{j}=1,\eta^{\left(-1\right)}_{j}=0\)),则采用乘性传播
  3. \begin{align}
    \eta^{\left(1\right)}_{i}\left(t\right) = \eta^{\left(1\right)}_{i}\left(t-1\right) + \omega^{\left(1\right),j}_{i}\eta^{\left(1\right)}_{j}\left(t-1\right)
    \end{align}
    或者加性传播
    \begin{align}
    \eta^{\left(1\right)}_{i}\left(t\right) = \eta^{\left(1\right)}_{i}\left(t-1\right) + \omega^{\left(1\right),j}_{i}
    \end{align}

  4. 如果\(k_{j}=-1\)(这个时候可以约定\(\eta^{\left(1\right)}_{j}=0,\eta^{\left(-1\right)}_{j}=1\)),则采用乘性传播
  5. \begin{align}
    \eta^{\left(-1\right)}_{i}\left(t\right) = \eta^{\left(-1\right)}_{i}\left(t-1\right) + \omega^{\left(-1\right),j}_{i}\eta^{\left(-1\right)}_{j}\left(t-1\right)
    \end{align}
    或者加性传播
    \begin{align}
    \eta^{\left(1\right)}_{i}\left(t\right) = \eta^{\left(1\right)}_{i}\left(t-1\right) + \omega^{\left(-1\right),j}_{i}
    \end{align}

把以上的过程合起来,也就是
\begin{align}
\eta^{\left(k_{j}\right)}_{i}\left(t\right) = \eta^{\left(k_{j}\right)}_{i}\left(t-1\right) + \omega^{\left(k_{j}\right),j}_{i}\eta^{\left(k_{j}\right)}_{j}\left(t-1\right)\left(k^{j}\right)^{2}
\end{align}
或者
\begin{align}
\eta^{\left(k_{j}\right)}_{i}\left(t\right) = \eta^{\left(k_{j}\right)}_{i}\left(t-1\right) + \omega^{\left(k_{j}\right),j}_{i}\left(k^{j}\right)^{2}
\end{align}

必要的时候可以回来计算概率\(p\left(k_{j},t\right)\) 。这样这两种传染状态就能够相互抵消了。

更一般的两种传染病抵消机制的描述

例如,当一个健康顶点周围的染病或者染药顶点多余某个值,就会变成相应的状态。类似的,染病(染药)顶点周围的染病或者染药顶点多余某个值,就会变成相应的状态。