在我的資料庫中,有些物件具有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`\,=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}