coma en el nombre del nodo

coma en el nombre del nodo

En mi base de datos, algunos objetos tienen un nombre en A,Bformato, es decir, hay una coma entre ellos. queria hacer algo como esto

\node (A,B) {Comma};
\node (x) {normal};
\draw (A,B) -- (x);

Sin embargo, esto no está permitido. ¿Cómo puedo usar comas en los nombres de los nodos o, en general, otros caracteres especiales en los nombres de los nodos?

Respuesta1

No puedes porque TikZ realiza pruebas como¿La expresión de coordenadas implica dos puntos? Luego vaya a ángulo: sintaxis polar de radio. ¿Se trata de un punto? Luego cambie a la sintaxis (nombre de nodo.ángulo), etc.

A continuación se muestra un fragmento de código de dicho análisis;

\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%

No importa lo que haga, pero puedes sentir que se están tomando algunas decisiones. Por lo tanto, sería demasiado complicado escapar de la coma u otra puntuación y haría que su código fuera muy frágil.

Respuesta2

(Muy poco recomendable)

Como lo has pedido y probablemente lo necesites, podemos empezar a cambiar catcodes, en este caso:

\catcode`\,=11

Pero nos encontramos con una serie de problemas e incluso entonces encontrará situaciones relacionadas con comas que necesitarían una atención especial. La razón es que las comas se utilizan como lista de parámetros y separador de coordenadas de puntos. Por lo tanto, restringimos su uso tanto como sea posible mediante el uso de un grupo.

Podemos limitar un comando o varios comandos con { }o con \begingroupy \endgroupcomo en este ejemplo:

\begingroup
\catcode`\,=11
\node (A,B) {Comma};
\endgroup

Podemos limitar un tikzpictureentorno particular:

\begingroup
\catcode`\,=11
\begin{tikzpicture}
\node (A,B) {Comma};
\end{tikzpicture}
\endgroup

O incluso todos tikzpicturelos entornos, por ejemplo mediante:

\tikzset{every picture/.style={execute at begin picture={\catcode`\,=11}}

Este es un ejemplo que limita un entorno 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}

También podemos restringir un área particular y evitar el uso de comas directamente en ella con las herramientas TikZ, porque estamos fijando una lista de parámetros, por ejemplo [xshift=3cm,draw], así como un par de coordenadas de puntos, por ejemplo (1cm,2cm).

En el primer caso, podemos definir un estilo fuera del grupo limitante, por ejemplo:

\tikzset{mystyle/.style={xshift=3cm,draw}}

En el segundo caso, podemos usar \coordinateel comando, por ejemplo:

\coordinate (myright) at (1cm,2cm);

Probablemente se encontrará con otras situaciones como en \pgfmathparse{pow(2,4)}, me temo, donde se necesitaría su atención. Este es un ejemplo de este método:

\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}

Le recomiendo encarecidamente que cambie el nombre de los objetos, no tiene que estar en el nivel de la base de datos, puede usar el código TeX generado para este propósito.

En su ejemplo de trabajo mínimo, sería necesario un cambio de A,Bhacia ABo hacia A-B, etc. Estamos llegando a nuestro ejemplo final y apropiado, si se me permite decirlo de esta manera:

\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}

información relacionada