我当时正在查看LaTeX3
Github 存储库,特别是。 对我来说这是一个惊喜,因为过去几周l3auxdata.dtx
我一直在练习和研究语法和模块。 惊喜是这样的:expl3
\def\auxwrite{\auxdata_write:nn}
\def\auxshipout{\auxdata_write_shipout:nn}
我不太确定使用该代码是否有理由\def
,但这让我想起了自己在语法方面遇到的困难。
刚开始学习时,人们很容易expl
想避开语言的冗长和expl
使用原语。刚开始学习时,我实际上是在脑子里翻译代码,然后写下来。这很像学习外语时的情况。\def
TeX
expl3
LaTeX2e
到目前为止,我已经基本克服了这个问题,因为我强迫自己做以下事情:
- 避免
\def
了。 - 由于太多下划线让我很烦,一开始我将函数写成
\module_dosomething:nn
。这样调试和输入时会快一点。直到很久以后或重构代码时才开始l_
添加g_
。 - 我在心里不断地阅读命令和参数说明符,直到开始理解。就像
module dosomething en en
。我一直忘记写说明符的原因。 - 当我使用
tex_<cs>:D
类似的命令时,我稍后会返回并重构代码以将其删除。 - 当我练习命令时,用例子做笔记。这对其他人也很有用。
您还有其他技巧和窍门可以分享吗?
答案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
命令传递函数的返回值。