自定义命令在 qtree 树中行为异常

自定义命令在 qtree 树中行为异常

这两棵树为何不同?

\documentclass[tikz,12pt,letterpaper]{article}
\usepackage{qtree}
\newcommand{\en}{\phantom{1}}
\begin{document}

Using phantom:

\Tree[.50   [.25    [.12 \phantom{1} 22 ]
                    [.47 33 50 ]]
            [.75 66 99 ]]

Using custom command:

\Tree[.50   [.25    [.12 \en 22 ]
                    [.47 33 50 ]]
            [.75 66 99 ]]
\end{document}

第一个将识别\phantom{1}为节点。但是,当将相同的命令放入自定义命令中时,它不再被读取为节点。为什么会发生这种情况?有解决方法吗?我需要制作一棵有多个空节点的树。

我正在研究forest但还没有弄清楚如何让它发挥作用。

感谢您的帮助。

答案1

每当 Qtree 看到空格时,它就会读取您的树并将其分解为标记。由于 TeX 的工作方式,当您写入\en 22空格时,TeX 的输入例程会在 qtree 有机会看到它之前对其进行处理。要使其工作,请使用以下标准方法之一:

  1. 由于您的目标是一个空分支,因此只需写入 ~ (不间断空格)而不是自定义幻影命令:

    \Tree [.12 ~ 22 ]
    
  2. 更一般地说,对于您想要以这种方式使用的任何自定义宏,请添加无害的语法,以避免在命令后立即出现空格:

    \Tree [.12 \en{} 22 ]
    \Tree [.12 {\en} 22 ]
    

或者你可以尝试以下稍微更有创意的解决方案

  1. 使用单个标点符号作为命令名称(但请确保不要覆盖所需的标准命令)。标点符号不能用于多字符名称(除非重新分配字符类,这没关系),因此 TeX 不会吞掉此类命令后的空格。

    \renewcommand\~{\phantom{1}}
    \Tree [.12 \~ 22 ]
    
  2. 使用 TeX(而非 LaTeX)语法定义一个命令,该命令在调用时必须跟有标点符号。标点符号(必须有,但不是命令名称的一部分)将命令名称与后面的空格分隔开。

    \def\en/{\phantom{1}}
    \Tree [.12 \en/ 22 ]
    

您还可以安排您的特殊命令仅在树中生效(这对于第三个选项特别有用,因为大多数单符号命令已经在使用中)。您无需全局定义命令,只需定义\qtreeinithook命令即可;只要您启动新树,钩子就会在本地范围内执行。

    \newcommand\qtreeinithook{\renewcommand\~{\phantom{1}}}

答案2

这是 Forest 版本:

\documentclass[border=10pt,tikz]{standalone}
\usepackage[linguistics]{forest}
\begin{document}
\begin{forest}
  delay={
    where content={}{content=\strut}{}
  }
  [50
    [25
      [12
        []
        [22]
      ]
      [47
        [33]
        [50]
      ]
    ]
    [75
      [66]
      [99]
    ]
  ]
\end{forest}
\end{document}

森林版

相关内容