我正在尝试编译下面的树,它正常工作。问题是,每当我将 DP 或 LP 的标签更改为\#P
(即\node(\#P) {\#P}; \#
)时,我都会收到以下错误消息:
! Missing \endcsname inserted.
<to be read again>
\#
l.17 ...LP}; L [.YP Y [.FP ] ] ] ] ] ] ]
]
The control sequence marked <to be read again> should
not appear between \csname and \endcsname.
Missing character: There is no # in font nullfont!
Missing character: There is no P in font nullfont!
\documentclass[12pt]{article}
\usepackage[utf8]{inputenc}
\usepackage{tikz-qtree-compat}
\tikzset{every tree node/.style={baseline=(top.base), level distance=2em, sibling distance=4em, align=center, parent anchor=south, child anchor=north, anchor=north}, sibling distance=15pt}
\usetikzlibrary{positioning}
\begin{document}
\begin{tikzpicture} [inv/.style={overlay, coordinate }]
\Tree [.XP X [.ZP Z [.\node(DP) {DP}; D [.\node(LP) {LP}; L [.YP Y [.FP ] ] ] ] ] ] ] ]
\node [ right=1cm of DP,font=\itshape] (X) {Blah};
\draw[<-] (X.west) -- (DP);
\node [ right=1cm of LP,font=\itshape] (X) {Blah};
\draw[<-] (X.west) -- (LP);
\end{tikzpicture}
\end{document}
答案1
#
是 TeX 中的一个特殊字符,如果要打印,则必须对其进行转义。因此,您必须在普通文本中对其进行转义。但是,节点名称不允许使用宏,因此您不能\#
在节点名称中使用。
因此,我建议您使用另一个字母字符来x
替换\#
节点名称(该字母字符仅在您的代码中内部使用,并且无论如何都不会被排版)。
请注意,即使是大多数“特殊字符 [...] 包括逗号、分号、连字符、括号、点、圆括号、斜线、破折号等”(引自 Ti钾Z 手册)不能用于节点名称中。
关于更改\catcode
,请参阅这里。
编辑可能的解决方案:1)只需将节点命名为与其文本不同的名称即可;2)如果节点名称和节点文本必须相同,则可以使用宏来xD
替换\#D
:
\documentclass[12pt]{article}
\usepackage[utf8]{inputenc}
\usepackage{tikz}
\usepackage{xstring}
\newcommand{\xtohash}[1]{\StrSubstitute[0]{#1}{x}{\#}}
\begin{document}
\begin{tikzpicture}
\node at (0,0) (xD) {\#D};
\node at (0,1) (xD) {\xtohash{xD}};
\end{tikzpicture}
\end{document}