在我的数据库中,一些对象的名称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,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}