节点名称中的逗号

节点名称中的逗号

在我的数据库中,一些对象的名称A,B格式为,即中间有逗号。我想做这样的事情

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

但是,这是不允许的。我如何在节点名称中使用逗号,或者在节点名称中使用其他特殊字符?

答案1

你不能,因为 TikZ 会执行如下测试坐标表达式是否包含冒号?然后转到角度:半径极坐标语法。它是否包含点?然后切换到(节点名称.角度)语法等。

此类解析的代码片段如下;

\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,在这种情况下:

\catcode`\,=11

但我们遇到了一系列问题,甚至会发现与逗号相关的情况需要特别注意。原因是逗号用作参数列表和点坐标分隔符。因此,我们通过使用组尽可能限制其使用。

{ }我们可以使用或 和 来\begingroup限制一个或多个命令,\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,BAB更改为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}

相关内容