为学习曲线较差的中级用户提供的 LaTeX 课程

为学习曲线较差的中级用户提供的 LaTeX 课程

背景:这个问题主要针对那些已经使用 LaTeX 很长一段时间但感觉他们对它没有一个非常“原则性的理解”的人,尽管他们很想这样做(即那些想要从中级到高级但却感到迷失的人)。

总结:有谁知道有类似结构的课程(MOOC 或其他...Udemy 和 Coursera 没有任何价值)供中级 LaTeX 用户以“原则性方式”学习 LaTeX?你们这些在大学里教 LaTeX 的人,你们的课程是如何组织的(如果你不介意分享的话)?


为了使这个问题相对简短,我只想说我已经使用 LaTeX 好几年了,并且从未停止对它的功能感到惊讶,尤其是 TeX.SE 上令人难以置信的支持小组。我读过其他几个与此相关的问题:

令人沮丧的是,大多数教育性 LaTeX 材料似乎都是针对刚入门或水平更高的人。例如,我查看了 Udemy 课程的内容(这并不是要批评它),并对其“高级内容”(所有我完全熟悉并曾经做过的内容)感到相当惊讶。但我看到 Eijkhout 的 TeX/LaTeX 背后的计算机科学之类的东西时,立即感到有些力不从心。

到目前为止,我的学习方法是,在遇到不同问题时,简单地学习必要的内容(当我无法进步时,我会在 TeX.SE 上发帖)。即使我看到这里的问题,我觉得我可能知道如何回答,我也从来不回答,因为我知道这里的几位大师都有一种“正确”的方法来处理这一切。我还知道一些成员在他们的大学里教授 LaTeX(我想到了 egreg 和 gonzalo)。

总之,我渴望以“原则性的方式”学习 LaTeX(理解软件包的代码,能够编写自己的代码等等),但是如果没有课程结构,我不知道如何有效地做到这一点。仅仅阅读 TeXbook、LaTeX and Friends、The LaTeX Companion 等已经不够了(很容易被大量不同的书籍淹没,很难以线性方式进行学习)。一个定义明确的结构会有很大帮助。

答案1

问题在于:不同的用户有不同的兴趣(和需求),因此对于什么才是“中级”(超越基础)有不同的看法,正如 Joseph Wright 在一篇文章中指出的那样以上评论。Christian Feuersänger 在这是 2011 年的答案:他将初级 (La)TeX 用户可能喜欢学习的东西分为三类(我重新表述了一下),只有您才能决定什么对您来说是重要的:

  1. TeX 的功能排版具体来说:框粘合惩罚模型、对齐、程序中内置的一些参数和功能\parshape等。基本上:将 TeX 的输出(每个页面)视为一个巨大的框,由垂直(例如文本行)和水平(例如行内的字符)顺序排列的框组成,框之间有适当的粘合,并学习如何使页面看起来像您心中已经预先确定的理想。

  2. TeX 的功能编程:宏扩展的复杂性:诸如\xdef、、\expandafterprotected 和 Fragrance等术语是什么\csname意思?如何编写宏来执行您希望它们执行的工作?如何使用提供的功能expl3使这变得更容易?

  3. 包裹生态系统:LaTeX 本身提供的功能,以及 CTAN 上数千个软件包中最重要的软件包提供的功能。例如,LaTeX 本身提供自动编号(您只需键入\section,后台的某个计数器就会递增并显示编号)、交叉引用(\label\ref)等功能。有针对特定领域(数学、化学、语言学)、特定语言、特定类型文档(演示文稿、图纸)等的软件包。


事实是,对于大多数人来说用户对于 LaTeX 来说,对他们来说最有用、最值得了解的是 (3)。“如何在 TikZ 中绘制 X”是关于 TikZ 包中存在的功能。包 Y 用于绘制化学图表或语法分析树的知识是你所从事的领域所特有的。关于“推荐”的设置页边距的方式是使用包geometry,还是使用beamerpowerdotprosper进行演示,或者\usepackage{hyperref}应该放在包含的包列表的末尾的知识,都是这种性质的。

简而言之,其中很多都是关于“世界状况”的知识:关于人们碰巧编写了哪些软件包,这些软件包碰巧具有哪些功能(和错误!),甚至这些软件包有多好和多新——所有这些都是“偶然的”,甚至会随着时间而变化。这没有“核心”,也不一定有很强的一致性,因为它们是由许多不同的人编写的。您可以在以下网址查看“横幅广告”https://www.ctan.org/pkg看看现有的软件包。这是你在问题中提到的困难的核心(以“原则性的方式”学习 LaTeX [...] 很难以线性方式进行......一个明确的结构会有所帮助),据我所知,这是不可避免的。

初级以上(“中级”或“高级”)的 LaTeX 课程如果深入探讨这些内容,将仅限于某些人对 LaTeX 的使用,并且可能会过时。然而,这正是大多数人想要和需要的,因此您可以考虑针对特定用户需求的特定书籍:链接LaTeX 在行政工作中的应用由 Nicola Talbot 撰写(见其目录)或 Grätzer 的将更多数学知识融入 LaTeX(不是免费的,但看看CTAN 上有哪些内容以获得一个想法)就是很好的例子。


剩下的是类别 (2)(宏)和 (1)(排版原语)。有些人所说的“中级”或“高级”是指 (2):能够编写和理解宏。与您可能熟悉的任何其他形式的编程相比,这本质上是一种新的编程方式。请参阅 TeX 编程笔记寻找(非常有用的)事物的味道。人们已经写了一个 BASIC 解释器、无与伦比的xii.tex、一个 Othello 游戏(为了向前者致敬而命名为 reverxii)、一个火星探测器控制器……所以绝对可以在其中做事情。迄今为止,许多 LaTeX3 工作显然已经投入其中,这expl3使得这变得更容易。这可能是人们可以追求的东西,尝试越来越难的练习,直到他们精通编写宏。(我不知道有这样的书或资源。)

我个人认为用宏编程是相当不合理的。:-)(不仅仅是xii.tex诸如此类,甚至典型软件包的代码,以及 LaTeX 本身的代码也是如此。)无论 TeX 有什么样的优点,它都不是一个很棒的编程语言(参见这个问题)。(Knuth 的一些评论表明这是有意为之,但他没有预见到人们会不遗余力地用它来编程。)因此就我个人而言(这是 TeX 社区中的少数人观点,也许我甚至是少数人,只是因为我没有充分考虑这一点):我更喜欢一种尽可能少使用宏的 TeX 使用风格。(这并非特定于 LaTeX:它适用于 ConTeXt,适用于纯 TeX 包,例如奥普麦克,可能就是目前使用 TeX 的所有方式。)

尽管如此,它(熟练掌握 TeX 宏)是可以学习的,并且可能是对您的问题的具体答案。


最后,剩下 (1)(排版)。TeX 的核心是出奇简单且出乎意料地多功能的排版模型:使用 box-glue-penalty 模型将段落分成行。它声音就像只处理普通文本段落的东西(这就是它的设计目的),但只要选择合适的盒子、粘连和惩罚,您就可以使用 (La)TeX(以及更多)实现您在文档排版中见过的几乎所有功能。尽管该模型具有统一的简单性(这是 TeX 早期评论者(如从事 troff 工作的 Kernighan)所指出的),但其强大功能甚至让 Knuth 感到惊讶,他说他花了数年时间才学会了更多可以用它做的事情。(当然,从某种角度来看,你可以称这些东西为黑客,但我发现它们非常优雅。)

这是我个人最感兴趣的部分(我觉得有点不寻常);这也是直接违背 LaTeX 理念的,即专注于内容/文档结构,将格式化留给您使用的软件包。如果您对此感到满意,您可能不必在这里深入了解(除非您想编写自己的提供格式化的软件包,然后突然您必须学习您的软件包试图向您隐藏的所有内容)。如果您想要了解更多关于我认为的 TeX 排版核心的知识,我可以推荐我认为最好的两个资源(甚至比TeXbook,您可以接下来阅读):

  • 这本书TeX 初学者指南Seroul 和 Levy 著。这是一本非常可爱的书:它很温和,没有任何假设,只关注 TeX 的一个子集,但所有内容都介绍得恰如其分,看起来很自然(包括犯一些典型的错误并解释为什么会出错),TeX 的设计看起来很合理。

  • 论文将段落分成几行作者:Knuth 和 Plass。绝技:讨论问题,用数学公式表达,定义可取性标准,比较方法,展示该模型的威力(大量复杂的例子),然后首先介绍算法的“花哨功能”,然后总结出一段鼓舞人心的历史。

有关 TeX 这方面的更多信息,您可以阅读TeXbook,还有一些由 Knuth 和他的同事在斯坦福 TeX 项目中产生的其他东西,一些 Frank Mittelbach 的演讲和文章,一些编写过类似 TeX 或受 TeX 启发的系统的人写的东西(目前存在一些,比如 SILE 和 Patoline,以及一个更大的未完成系统的坟墓,但其中一些作者在他们的项目消亡之前写了一些有用的东西),等等。

但我先说一句:虽然学习起来很有趣,但在实际使用 LaTeX 时它不会对你有多大帮助。现有的软件包已经达到了你从第一原理中可以轻易达到的强大和复杂程度(例如,LaTeX 的浮动/图形放置完全在层)。下面将详细介绍……


你提到

理解包的代码,能够编写自己的代码等等

不幸的是,对于任何不平凡的事情来说,这都需要一些工作,因为整个系统并不是为你成功设置的(它针对最终用户而不是软件包编写者进行优化)。LaTeX 或主要软件包的宏往往非常复杂,因为它们是数十年(LaTeX 的情况是 30 多年)开发的成果:从简单的东西开始,它们已经发展到涵盖所有可以想象的情况,对各种故障模式具有很强的鲁棒性,等等。(\section{...}当你将宏插入其参数时,你是否希望不中断?你是否希望代码\section简单易读?选择一个。)

此外,大多数软件包都是假设各种功能其他包(并且,如果它们与格式化有关,则是其他包的确切格式),它们可能会使用高级宏技术来变得健壮和全面,这些宏反过来又假设其他包的方面,等等。

简而言之,从“我知道使用一些软件包”到“我理解大多数软件包的大部分内容,如果不能,我可以阅读和理解它们,或者编写自己的软件包”(就像这个网站上的一些顶级用户一样),涉及以下几方面的组合:全部(1)、(2)和(3):您需要了解宏的工作原理,了解现有的排版功能,以及您使用的所有其他软件包或典型用户可能与您的软件包一起使用的软件包的上述两项功能。(您可以找到文档中提到“此软件包已与以下软件包结合测试过……”的软件包。)


所以总结/重申:有这三个不同的类别,如果你真的关心所有这些(而不是如何成为一个更熟练的 LaTeX 用户,知道如何使用哪些包,这最终是在现实生活中有用的),那么你可能必须同时追求所有这三个,而不是以任何结构化的方式。

我自己的偏好(“学习风格”:P)是自下而上地学习事物,从最简单的开始(不关心实用性),这通常也是历史顺序(事物通常随着时间的推移变得越来越复杂:它们变得更轻松但很少更简单),因此我建议采用以下路径:

  • 了解(或思考)编写 TeX 的主要原因:设置类型(换句话说:一种不太麻烦的方式来指定如何从某些字体中挑选字符并将其放置在页面上)、盒式粘合模型、其宏存在的原因、简单的宏(例如\def\line{\hbox to\hsize}\def\centerline#1{\line{\hss#1\hss}})、构建更复杂的东西,如页面布局等。即使您不打算使用它,也要充分了解纯 TeX。(我提到的 Seroul & Levy 的书基本上采用了这种方法。)阅读TeXbook. 阅读历史资料数字排版. 浏览早期的拖船
  • 使用 LaTeX 带来的重大飞跃:查看一些 LaTeX 源代码(打开texdoc source2e并跳转到随机页面),学习你需要的任何内容,直到它有意义为止。:-)
  • 查看一些您感兴趣的示例包,或者查看此站点上似乎包含复杂代码的答案,了解它们的工作原理等。

当然,这条路与学习使用 LaTeX 做有用的事情有很大不同,所以我不会向任何人推荐它(而且我甚至在第一步中还没有走得足够远!)。不过,这种方法可能在某种程度上是您所指的“结构化”的。就我而言,它让我更少地感到困惑和“力不从心”:我可能不理解所有事情(或太多),但至少现在我通常可以了解发生了什么,并在考虑任何给定情况时了解我需要首先学习什么。

答案2

既然你问大学里教这门课的人如何组织课程,下面是我的课程。我为各个学科的研究生开设了一系列讲习班。(一般来说 - 偶尔,我会为某个学校的一群学生上课。)

结构如下:

我还分发了一堆讲义,包括 LaTeX“小抄”、基本数学资料清单等。(这些都是标准内容 - 不是我做的。)

  • LaTeX II - 中级,是一个为期一天的研讨会,但最近改组为 4 个针对特定主题的简短研讨会(材料位于https://github.com/cfr42/latex-2):

    1. 编写宏、类和包
    2. 使用 Biblatex/Biber 查找参考书目
    3. 比默
    4. 浮点管理、函数图形和使用外部数据、使用 Ti 绘图

这些研讨会大部分内容是说“这是一个有用的软件包或工具,以及几个非常简单的用途,这样你就能了解大概意思了”。每个研讨会都附有附录,为那些急于求成的学生提供一些进一步的信息,并指明进一步的资源方向。尽管这些主题很笼统,但不同的学生需要不同的东西,有不同的兴趣。

我还提供了包含软件包推荐的讲义(一面是一般性推荐,另一面是特定主题的推荐)、Biblatex“备忘单”、字体样本和字体软件包列表。(我不得不写下这些,因为我找不到已经写好的。)

但我非常怀疑这是否正是您所想的。

答案3

Joseph Wright 有。LaTeX 最初严格适用于大学计算机科学和数学系,但现在它已根据用户的个性化需求向各个方向发展。

我认为我们大多数人都是在摸索的过程中,参考不同的资源,并在需要新功能时阅读软件包描述。我使用 LaTeX 进行非常基础的创建商务信函和其他文书工作的模板。我也是一名注册培训师/评估师,但如果我根据我对 LaTeX 的了解来构建 LaTeX 课程,那么对于许多人来说,它太过局限,而对于其他人来说,它包含太多无关紧要的材料。

相关内容