No meu banco de dados alguns objetos possuem nome no A,B
formato, 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 \begingroup
e \endgroup
como neste exemplo:
\begingroup
\catcode`\,=11
\node (A,B) {Comma};
\endgroup
Podemos limitar um tikzpicture
ambiente específico:
\begingroup
\catcode`\,=11
\begin{tikzpicture}
\node (A,B) {Comma};
\end{tikzpicture}
\endgroup
Ou mesmo todos tikzpicture
os 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 \coordinate
o 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,B
para AB
ou para A-B
etc. 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}