如何从 LaTeX2e 过渡到 expl3 语法?

如何从 LaTeX2e 过渡到 expl3 语法?

我当时正在查看LaTeX3Github 存储库,特别是。 对我来说这是一个惊喜,因为过去几周l3auxdata.dtx我一直在练习和研究语法和模块。 惊喜是这样的:expl3

\def\auxwrite{\auxdata_write:nn}
\def\auxshipout{\auxdata_write_shipout:nn}

我不太确定使用该代码是否有理由\def,但这让我想起了自己在语法方面遇到的困难。

刚开始学习时,人们很容易expl想避开语言的冗长和expl使用原语。刚开始学习时,我实际上是在脑子里翻译代码,然后写下来。这很像学习外语时的情况。\defTeXexpl3LaTeX2e

到目前为止,我已经基本克服了这个问题,因为我强迫自己做以下事情:

  1. 避免\def了。
  2. 由于太多下划线让我很烦,一开始我将函数写成 \module_dosomething:nn。这样调试和输入时会快一点。直到很久以后或重构代码时才开始l_添加g_
  3. 我在心里不断地阅读命令和参数说明符,直到开始理解。就像module dosomething en en。我一直忘记写说明符的原因。
  4. 当我使用tex_<cs>:D类似的命令时,我稍后会返回并重构代码以将其删除。
  5. 当我练习命令时,用例子做笔记。这对其他人也很有用。

您还有其他技巧和窍门可以分享吗?

答案1

由于太多的下划线困扰着我,......

+1,因为下划线太多。我真的无法使用这种语法。

对于不喜欢 LaTeX3 编程层 ( expl3) 中下划线的人来说,现在有一个新的functional软件包。它为 提供了直观的 LaTeX2 界面expl3

它还模拟了其他编程语言中的函数式编程,例如Lua。复合函数的求值是从内到外的。这是一个简单的例子:

\documentclass{article}

\usepackage{functional}
% make every function become a group
\Functional{scoping=true}

\begin{document}

\IgnoreSpacesOn
\PrgNewFunction \MathSquare { m } {
  \IntSet \lTmpaInt { \IntEval {#1 * #1} }
  \Return { \Value \lTmpaInt }
}
\IgnoreSpacesOff
\MathSquare{5}
\MathSquare{\MathSquare{5}}

\end{document}

请注意,使用此包,您需要通过\Return命令传递函数的返回值。

相关内容