我是 LaTeX 的长期用户和粉丝,但是我恨语法!我希望它更像 Python 或 Haskell。这些编程语言的语法比 LaTeX 更易读,这很讽刺,因为你更有可能花时间阅读原始 LaTeX 比编程代码更重要。
我希望它是这样的
We have
\equation
A =
\bmatrix
a & b
c & d
where ...
代替
We have
\begin{equation}
A =
\begin{bmatrix}
a & b \\
c & d
\end{bmatrix}
\end{equation}
where ...
这是一个简单的例子,但大家都知道在复杂的例子中花括号 \begin's 和 \end's 是多么繁重
有没有其他可以替代的 LaTeX 解释器更美好句法?
答案1
你需要一个非常最近的 expl3(2011 年 1 月 8 日)使以下代码可以工作(我\ior_str_map_inline:nn
几分钟前添加的)。
\RequirePackage{expl3,l3str}
\ExplSyntaxOn
\bool_new:N \g_strange_tmp_bool
\tl_new:N \g_strange_last_line_tl
\tl_new:N \g_strange_line_tl
\int_new:N \g_strange_indentation_int
\int_new:N \g_strange_last_indentation_int
\seq_new:N \g_strange_indentation_seq
\seq_new:N \g_strange_environments_seq
\tl_new:N \l_strange_tmpa_tl
\use:n
{
\ExplSyntaxOff
\int_set_eq:NN \tex_endlinechar:D \c_minus_one
\ior_str_map_inline:nn { \c_job_name_tl }
{
\tl_gset_eq:NN \g_strange_last_line_tl \g_strange_line_tl
\int_gset_eq:NN \g_strange_last_indentation_int \g_strange_indentation_int
\bool_if:NTF \g_strange_tmp_bool
{
\tl_gset_rescan:Nnn \g_strange_line_tl { } {#1~}
\int_gset:Nn \g_strange_indentation_int
{ \str_length:n {#1} - \exp_args:No \str_length:n { \use:n #1 } }
\int_compare:nTF { \g_strange_indentation_int > \g_strange_last_indentation_int }
{
\seq_gpush:Nx \g_strange_indentation_seq
{ \int_use:N \g_strange_last_indentation_int }
\seq_gpush:Nx \g_strange_environments_seq
{ \str_substr:Nnn \g_strange_last_line_tl {1} {-1} }
\seq_get:NN \g_strange_environments_seq \l_strange_tmpa_tl
\exp_args:No \begin { \l_strange_tmpa_tl }
}
{
\tl_use:N \g_strange_last_line_tl
\int_while_do:nn
{ \g_strange_indentation_int < \g_strange_last_indentation_int }
{
\seq_gpop:NN \g_strange_indentation_seq \l_strange_tmpa_tl
\int_gset:Nn \g_strange_last_indentation_int \l_strange_tmpa_tl
\seq_gpop:NN \g_strange_environments_seq \l_strange_tmpa_tl
\exp_args:No \end { \l_strange_tmpa_tl }
}
}
}
{
\str_if_eq:xxT { #1 } { \token_to_str:N \endinput }
{ \bool_gset_true:N \g_strange_tmp_bool }
}
}
}
\endinput
\documentclass{article}
\usepackage{amsmath}
\document
We have
\equation
A =
\bmatrix
a & b \\
c & d
where ...
%
尾部缩进%
与 相同\document
非常重要。我决定将\\
矩阵的行分开,因为支持这一点需要更改 的定义\bmatrix
。在这里,您只需要在文档开始之前包含代码,然后就不用担心它了。
答案2
是否有语法更好的 LaTeX 替代解释器?
总体来说,TeX 在“替代解释器”方面表现很差,因为编写一个能够理解 TeX 语法的程序是一个非常非常棘手的问题(并且也是图灵完备的)。
不要寻找 TeX 本身的“替代实现”,而是尝试寻找接近理想输入的、可以编译为 TeX 的“替代语法”。潘多克据称,Pandoc 是一款可以解析轻量级标记语言(例如 Mardown 和 reStructured Text)并将其转换为 LaTeX 的工具。Pandoc 也是用 Haskell 编写的,并且非常容易扩展。
或者,你可以自己动手。也许像CoffeeScript可以为 LaTeX 编写。CoffeeScript 是一种融合了 JavaScript、Python 和 Ruby 语法优点的语言,但可以编译为 JavaScript,从而省去了从头编写完整语言实现的开销。
答案3
我不确定这在评论和答案之间处于什么位置。长度使它向后者的位置靠拢。
这里也许可以推广一下 LaTeX 来代替你的恨因为它的语法与您的示例相当匹配。
每当你在 LaTeX 中定义一个环境时,例如通过
\newenvironment{myenv}
{<begin myenv>}% \begin{myenv}
{<end myenv>}% \end{myenv}
它(...LaTeX)定义了两个命令:\myenv
和\endmyenv
。为了测试这一点,当你尝试编译以下最小示例时,你会注意到控制台中出现错误:
\documentclass{article}
\newcommand{\mycmd}{test}% \mycmd
\newenvironment{mycmd}{hi}{there}% \begin{mycmd}...\end{mycmd}
\begin{document}
\mycmd
\end{document}
该错误是
!LaTeX 错误:命令 \mycmd 已定义。 或者名称 \end... 非法,请参阅手册第 192 页。 请参阅 LaTeX 手册或 LaTeX Companion 以获取解释。 输入 H 即可获得紧急帮助。 ... l.3 \newenvironment{mycmd}{hi}{there}
即使你没有定义额外的命令名为\mycmd
。那么,使用你的代码片段,如果你使用
We have
\equation
A =
\bmatrix
a & b
c & d
\endbmatrix
\endequation
where ...
equation
无论您对和的定义bmatrix
是什么(现有且重新定义或不存在)。事实上,以下最小示例编译时没有问题:
\documentclass{article}
\usepackage{amsmath}%
\begin{document}
We have
\equation
A =
\bmatrix
a & b \\
c & d
\endbmatrix
\endequation
where ...
\end{document}
正如 egreg 所评论的,有些情况下,这可能会“令人惊讶”,并产生与预期相反的结果。但是,如果没有更多细节,这种情况的程度可能不会对您产生影响。