带有 tikzpicture 的标签

带有 tikzpicture 的标签

我正在尝试编译下面的树,它正常工作。问题是,每当我将 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替换\#节点名称(该字母字符仅在您的代码中内部使用,并且无论如何都不会被排版)。

请注意,即使是大多数“特殊字符 [...] 包括逗号、分号、连字符、括号、点、圆括号、斜线、破折号等”(引自 TiZ 手册)不能用于节点名称中。

关于更改\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}

相关内容