запятая в имени узла

запятая в имени узла

В моей базе данных некоторые объекты имеют имя в 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

Но мы сталкиваемся с рядом проблем, и даже тогда вы найдете ситуации, связанные с запятыми, которые требуют особого внимания. Причина в том, что запятые используются как разделитель списка параметров и координат точек. Поэтому мы ограничиваем их использование настолько, насколько это возможно, используя группу.

Мы можем ограничить команду или несколько команд с помощью { }или с помощью \begingroupand \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}

Связанный контент