vírgula no nome do nó

vírgula no nome do nó

No meu banco de dados alguns objetos possuem nome no A,Bformato, ou seja, há vírgula entre eles. eu queria fazer algo assim

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

No entanto, isso não é permitido. Como posso usar vírgula nos nomes dos nós ou, em geral, outros caracteres especiais no nome dos nós?

Responder1

Você não pode porque o TikZ realiza testes comoA expressão de coordenadas envolve dois pontos? Então vá para a sintaxe polar angle:radius. Envolve um ponto? Em seguida, mude para a sintaxe (nome do nó.ângulo) etc.

Um trecho de código dessa análise está abaixo;

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

Não importa o que aconteça, mas você pode sentir que há alguma tomada de decisão em andamento. Portanto, seria muito complicado escapar da vírgula ou de outra pontuação e tornaria seu código muito frágil.

Responder2

(Altamente não recomendado)

Já que você pediu e provavelmente precisa, podemos começar a alterar os catcodes, neste caso:

\catcode`\,=11

Mas estamos enfrentando uma série de problemas e mesmo assim você encontrará situações relacionadas à vírgula que precisariam de uma atenção especial. A razão é que as vírgulas são usadas como uma lista de parâmetros e separador de coordenadas de pontos. Portanto, restringimos seu uso tanto quanto possível usando um grupo.

Podemos limitar um comando ou vários comandos com { }ou com \begingroupe \endgroupcomo neste exemplo:

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

Podemos limitar um tikzpictureambiente específico:

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

Ou mesmo todos tikzpictureos ambientes, por exemplo, por:

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

Este é um exemplo que limita um ambiente 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}

Também podemos restringir uma área específica e evitar o uso de vírgulas diretamente nela com as ferramentas TikZ, porque estamos fixando uma lista de parâmetros, por exemplo [xshift=3cm,draw], bem como um par de coordenadas de pontos, por exemplo (1cm,2cm).

No primeiro caso, podemos definir um estilo fora do grupo limitante, por exemplo:

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

No segundo caso, podemos usar \coordinateo comando, por exemplo:

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

Você provavelmente se deparará com outras situações, como em \pgfmathparse{pow(2,4)}, receio, onde sua atenção seria necessária. Este é um exemplo deste 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}

Eu recomendo fortemente que você renomeie os nomes dos objetos, não precisa ser no nível do banco de dados, você pode usar o próprio código TeX gerado para essa finalidade.

No seu exemplo de trabalho mínimo, haveria uma necessidade de mudança de A,Bpara ABou para A-Betc. Estamos chegando ao nosso exemplo final e apropriado, se assim posso colocar:

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

informação relacionada