在 tikz 宏的前言定义中包含分号吗?

在 tikz 宏的前言定义中包含分号吗?

假设我在序言中定义了一个宏\arr,用于tikzpicture。最佳做法是:

排除从定义中删除分号并将其包含在tikzpicture,

\documentclass{article}

\usepackage{tikz}
\newcommand*{\arr}[2]{\draw[-latex] (0,0) -- ({#1},{#2}) }
                                    % no semicolon here ^

\begin{document}

\begin{tikzpicture}
  \arr{2}{1};  % semicolon here
  \arr{4}{-3}; % semicolon here
\end{tikzpicture}

\end{document}

或者

包括定义中的分号并将其从tikzpicture,中排除

\documentclass{article}

\usepackage{tikz}
\newcommand*{\arr}[2]{\draw[-latex] (0,0) -- ({#1},{#2});}
                                    %    semicolon here ^

\begin{document}

\begin{tikzpicture}
  \arr{2}{1}  % no semicolon here
  \arr{4}{-3} % no semicolon here
\end{tikzpicture}

\end{document}

我倾向于在定义中包含分号,因为它适用于包含多个绘图命令的宏。然而,当宏在循环中使用时\foreach,调用时仍需添加分号,这看似多余,但是为了避免错误,这是必要的。

答案1

我认为这里没有真正的最佳实践,让我们看看两种可能性:如果你在的定义中使用分号\arr并且如果你忘记了,tikzpicture你就会得到一个错误:

\newcommand*{\arr}{\draw (0,0) -- (1,1)}% No semicolon in definition
\begin{tikzpicture} \arr  \end{tikzpicture}% Forgoten semicolon → "Giving up on this path..."
\begin{tikzpicture} \arr; \end{tikzpicture}% With semiconlon → Ok

如果你无论你是否在命令后面放置分号,代码都会编译。如果有多余的分号,你会在日志文件中收到“缺少字符”消息。

\newcommand*{\arr}{\draw (0,0) -- (1,1);}% Semicolon in definition
\begin{tikzpicture} \arr  \end{tikzpicture}% Forgoten semicolon → Ok
\begin{tikzpicture} \arr; \end{tikzpicture}% With semiconlon → "Missing character"

因此,最糟糕的情况是出现常见的“ Giving up on this path”错误。我个人认为,我不会在定义中放置分号,因为我习惯于将它们放在行末,并且我希望代码保持一致。


就像密钥一样insert path,它会在调用密钥的任何地方插入指定的路径。因此,无论你在其中输入什么路径,都会在调用密钥时调用。例如,你可以这样说:

\tikzset{
  arr/.style args={circle at #1 to arrow at #2}{
    ->,
    insert path={#1 circle[radius=2mm] -- #2}
  }
}
\tikz \draw[arr={circle at (0,0) arrow at (1,1)];

定义样式的其他方法,如/.style n args={<n>}{style}也可以使用,并且在 Ti 中有广泛的记录Z 手册。

相关内容