语法低迷

语法低迷

我是 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 所评论的,有些情况下,这可能会“令人惊讶”,并产生与预期相反的结果。但是,如果没有更多细节,这种情况的程度可能不会对您产生影响。

相关内容