В моей базе данных некоторые объекты имеют имя в A,B
формате, т.е. между ними есть запятая. Я хотел сделать что-то вроде этого
\node (A,B) {Comma};
\node (x) {normal};
\draw (A,B) -- (x);
Однако это не разрешено. Как я могу использовать запятую в именах узлов или вообще другие специальные символы в имени узла?
решение1
Вы не можете этого сделать, потому что TikZ выполняет такие тесты, какВключает ли выражение координат двоеточие? Затем перейдите к синтаксису angle:radius polar. Включает ли оно точку? Затем перейдите к синтаксису (node name.angle) и т. д.
Фрагмент кода такого анализа приведен ниже;
\pgfutil@in@:{#2}%
\ifpgfutil@in@
\let\@next\tikz@parse@polar%
\else%
\pgfutil@in@,{#2}%
\ifpgfutil@in@%
\let\@next\tikz@parse@regular%
\else%
\let\@next\tikz@parse@node%
Неважно, что он делает, но вы можете почувствовать, что происходит принятие какого-то решения. Поэтому было бы слишком хлопотно избегать запятых или других знаков препинания, и это сделало бы ваш код очень хрупким.
решение2
(Крайне не рекомендуется)
Поскольку вы спросили и, вероятно, вам это нужно, мы можем начать менять каткоды, в данном случае:
\catcode`\,=11
Но мы сталкиваемся с рядом проблем, и даже тогда вы найдете ситуации, связанные с запятыми, которые требуют особого внимания. Причина в том, что запятые используются как разделитель списка параметров и координат точек. Поэтому мы ограничиваем их использование настолько, насколько это возможно, используя группу.
Мы можем ограничить команду или несколько команд с помощью { }
или с помощью \begingroup
and \endgroup
, как в этом примере:
\begingroup
\catcode`\,=11
\node (A,B) {Comma};
\endgroup
Мы можем ограничить одну конкретную tikzpicture
среду:
\begingroup
\catcode`\,=11
\begin{tikzpicture}
\node (A,B) {Comma};
\end{tikzpicture}
\endgroup
Или даже все tikzpicture
среды, например:
\tikzset{every picture/.style={execute at begin picture={\catcode`\,=11}}
Это пример ограничения одной среды TikZ:
\documentclass{article}
\usepackage{tikz}
\begin{document}
% All environments wrapper...
%\tikzset{every picture/.style={execute at begin picture={\catcode`\,=11}}
% One environment wrapper...
\begingroup
\catcode`\,=11
\begin{tikzpicture}
% One line wrapper...
%\begingroup
%\catcode`\,=11
%\node (A,B) {Comma};
%\endgroup
\node (A,B) {Comma};
\node[xshift=3cm] (x) {normal};
% It is not working when we add ", draw".
%\draw (x) -- (1cm,2cm);
%\draw (A,B) -- (x); % We cannot use "-- (1cm,2cm)".
\end{tikzpicture}
\endgroup
\end{document}
Мы также можем ограничить определенную область и избежать использования запятых непосредственно в ней с помощью инструментов TikZ, поскольку мы фиксируем список параметров, например [xshift=3cm,draw]
, , а также пару координат точки, например (1cm,2cm)
, .
В первом случае мы можем определить стиль вне ограничивающей группы, например:
\tikzset{mystyle/.style={xshift=3cm,draw}}
Во втором случае мы можем использовать \coordinate
команду, например:
\coordinate (myright) at (1cm,2cm);
Вы, вероятно, столкнетесь с другими ситуациями, как в \pgfmathparse{pow(2,4)}
, боюсь, где ваше внимание будет необходимо. Вот пример этого метода:
\documentclass{article}
\usepackage{tikz}
\begin{document}
\tikzset{mystyle/.style={xshift=3cm,draw}}
\begin{tikzpicture}
\coordinate (myright) at (1cm,2cm);
\begingroup
\catcode`\,=11
\node (A,B) {Comma};
\node[mystyle] (x) {normal};
\draw (A,B) -- (x) -- (myright);
\endgroup
\end{tikzpicture}
\end{document}
Я настоятельно рекомендую вам переименовывать имена объектов, это не обязательно должно происходить на уровне базы данных, для этой цели можно использовать сам сгенерированный код TeX.
В вашем минимальном рабочем примере потребуется изменение с A,B
на AB
или на A-B
и т. д. Мы подходим к нашему последнему и подходящему примеру, если можно так выразиться:
\documentclass{article}
\usepackage{tikz}
\begin{document}
\begin{tikzpicture}
\node (A-B) {Comma};
\node[xshift=3cm] (x) {normal};
\draw (A-B) -- (x);
\end{tikzpicture}
\end{document}