这两棵树为何不同?
\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 有机会看到它之前对其进行处理。要使其工作,请使用以下标准方法之一:
由于您的目标是一个空分支,因此只需写入 ~ (不间断空格)而不是自定义幻影命令:
\Tree [.12 ~ 22 ]
更一般地说,对于您想要以这种方式使用的任何自定义宏,请添加无害的语法,以避免在命令后立即出现空格:
\Tree [.12 \en{} 22 ] \Tree [.12 {\en} 22 ]
或者你可以尝试以下稍微更有创意的解决方案
使用单个标点符号作为命令名称(但请确保不要覆盖所需的标准命令)。标点符号不能用于多字符名称(除非重新分配字符类,这没关系),因此 TeX 不会吞掉此类命令后的空格。
\renewcommand\~{\phantom{1}} \Tree [.12 \~ 22 ]
使用 TeX(而非 LaTeX)语法定义一个命令,该命令在调用时必须跟有标点符号。标点符号(必须有,但不是命令名称的一部分)将命令名称与后面的空格分隔开。
\def\en/{\phantom{1}} \Tree [.12 \en/ 22 ]
您还可以安排您的特殊命令仅在树中生效(这对于第三个选项特别有用,因为大多数单符号命令已经在使用中)。您无需全局定义命令,只需定义\qtreeinithook
命令即可;只要您启动新树,钩子就会在本地范围内执行。
\newcommand\qtreeinithook{\renewcommand\~{\phantom{1}}}