
Я пытаюсь скомпилировать дерево ниже и оно работает. Проблема в том, что всякий раз, когда я меняю метку DP или LP на \#P
(ie \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 manual) нельзя использовать в именах узлов.
При изменении \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}