为什么$j=f$在森林中会引起错误?

为什么$j=f$在森林中会引起错误?
\documentclass[oneside,12pt]{article}
\usepackage{geometry}
\usepackage{microtype}
\usepackage[utf8]{inputenc}
\usepackage[T1]{fontenc}
\usepackage{lmodern}

\usepackage{amssymb}
\usepackage{amsmath}
\usepackage{forest}

\begin{document}
\begin{forest}
  [$j=f$]
\end{forest}
\end{document}

导致以下错误。

ERROR: Extra }, or forgotten $.

--- TeX said ---
\forest@temp@nodeformat ...nchor=base](node@2){$j}
                                              ;
l.15 \end{forest}

--- HELP ---
The braces or math mode delimiters don't match properly. You probably
forgot a {, \[, \(, or $.

答案1

萨索问我如果我回答这个问题并向我保证我在评论中给出的答案就是他会给出的答案。

=在节点和值的内容中,例如,,需要用花括号保护,因为 Forest 存储内容的方式是添加content'=<content>到节点的选项列表中。这是一个键值列表,因此=,都具有它们在此类列表中的含义,需要保护。因此,我们需要

[{$j=f$} ...

以避免尝试将其读取为将值分配f$给键“$j$”。

有关详细信息,请参阅手册第 22 页“括号表示”。

不过,我认为这不能被称为“问题”。任何语法都必须使用某些东西。这就像问某些东西是否与 TeX 有相同的“问题”,问题在于我们必须写\{或某些东西而不是{。只有在没有标记的文字处理器或类似程序中才能避免这种情况。我不明白你设想的替代方案是什么。

当然,你可能的意思是:为什么他们必须选择在证明中节点的内容如此有用?嗯,是的,但人们写诸如而不是说或之类的东西也是=直观的。=color=redcolor?red

我不是程序员,所以我不熟悉编程语言的语法(除了 shell 脚本和类似gawk/sed等),所以我无法将它们的语法与 TeX/TikZ/Forest 的语法进行比较。

但这是关于文本标记和任何因此字符有可能用于内容中。至少在许多编程语言中,所有此类内容都需要某种保护(例如通过引用)。在输入文档(或树)时,这会很麻烦,但不这样做的代价可能是知道何时需要保护当然,我们可以制作一些新字符来避免这种情况,但这样就没有人能够输入它了。

=但是,您可能会争辩说,Forest 应该将第一个逗号之前的所有内容解析为内容,并在传递给 TikZ 时对其进行适当保护。在其他情况下,例如指定或其他情况,您仍然需要保护等label。所以可能会更加令人困惑。

本质上,我认为关键在于自然语言标记在很多方面比常规编程语言的语法设计更为复杂。

请注意,我们可以通过将以下内容括起来来避免歧义全部节点、labels 等,用大括号括起来。这样我们就不必考虑这个节点是否特别需要保护。如果我们记住,我们给出的本质上是一个键值列表,那么我认为哪里需要特别保护就会变得更加清晰。

相关内容