在 \NewDocumentCommand 中使用键值

在 \NewDocumentCommand 中使用键值

我使用\NewDocumentCommandxparse 来创建自定义命令。我创建的实际命令有很多参数,因此我在这里给出一个更简单的示例。我希望拥有 pgfkeys 提供的键值(或命名值)。我尝试阅读一些文档并尝试使用它(大约 2 小时),但没有取得太大成功。

当前版本(可用但不理想):

\documentclass[11pt]{article}
\usepackage{xparse}
\usepackage{tikz}

\NewDocumentCommand \myline {O{0}O{0}O{0}O{0}}
{
    \draw [very thick, ->] (#1,#2) -- (#3,#4);
}

\begin{document}
\begin{tikzpicture}
\myline[7][5][][1] %uses default value (0) for #3
\end{tikzpicture}
\end{document}

输出:

输出

问题是,当参数数量变大(10 个左右)时,编写如下内容:

\diagram[arr][4][600][2][4][8][6][{1,7,2,9}]

显然是一种糟糕的设置方式 :(

我想要的是:

\documentclass[11pt]{article}
\usepackage{xparse}
\usepackage{tikz}

\NewDocumentCommand \myline {O{0}O{0}O{0}O{0}}
{
    \draw [very thick, ->] (#1,#2) -- (#3,#4);
}

\begin{document}
\begin{tikzpicture}

%--------- RELEVANT CHANGE -------
\myline[x1=7, y1=5, y2=1] %want to use default value for x2

\end{tikzpicture}
\end{document}

对于任何有兴趣了解问题范围的人来说,调用和输出实际代码:

\begin{tikzpicture}
\memory{data}{8}{320}{6}{4}{4}{8}{{12.5, 6.4, 8.5, 9.6, -3.4, -6.8, 0, -4.5}}
\end{tikzpicture}

内存图

答案1

另一种选择是将值存储在键中,而不是宏中。我更喜欢这种方法,因为键无论如何都存在,所以您也可以使用它们。这也使得设置默认值变得容易——通过\pgfkeys在环境内调用,您可以将任何键更改“本地化”到该环境。

您可以使用访问键值\pgfkeysvalueof,因此当我大量使用键值时,我定义了一个“辅助函数”作为获取键值的快捷方式:

 \newcommand\MyVal[1]{\pgfkeysvalueof{/myline/#1}}

无论使用哪种方法,都有一个问题:您需要在使用密钥之前定义它们(还有一个.unknown用于处理未知密钥的处理程序,因此如果需要,可以处理“随机”密钥)。

完整代码如下:

\documentclass[tikz, border=4mm]{standalone}

\usepackage{pgfkeys}
\usepackage{xparse}

\pgfkeys{/myline/.is family, /myline,
  x1/.initial=1,
  y1/.initial=1,
  x2/.initial=1,
  y2/.initial=1,
}
\newcommand\MyVal[1]{\pgfkeysvalueof{/myline/#1}}

\NewDocumentCommand\myline{m} {
  \begin{tikzpicture}
    \pgfqkeys{/myline}{#1}% keep key changes local
    \draw[very thick, ->] (\MyVal{x1},\MyVal{y1}) -- (\MyVal{x2},\MyVal{y2});
  \end{tikzpicture}
}

\begin{document}

  \myline{x1=0, y1=0, x2=2, y2=2}

\end{document}

这会产生相同的输出:

在此处输入图片描述

答案2

使用pgfkeys其实很简单。按键排列成树状结构,类似于目录,因此要做的第一件事就是选择命令按键的“主”目录,比如说/myline

然后,您可以通过命令来设置键\pgfkeys,或者像本例中那样,通过\pgfqkeys命令来设置键(其不同之处仅在于允许您为使用它设置的所有键设置默认路径)。

通过为密钥分配“处理程序”来创建密钥,该处理程序指定密钥值的解释方式。在下面的示例中,我选择使用处理程序.store in,它将密钥的值集分配给给定的宏,但在手册(实用程序/密钥管理/密钥处理程序部分)中,您会发现很多处理程序可以为您的密钥实现各种逻辑。

可以一次性设置所有键,然后每次调用命令时,\pgfqkeys都会使用另一个调用来使用用户提供的参数设置键。如您所见,您实际上不需要xparse在这里执行任何操作,一个简单的操作\newcommand就可以完成工作。

\documentclass{standalone}

\usepackage{pgfkeys}
\usepackage{xparse}
\usepackage{tikz}

\pgfqkeys{/myline}{
  x1/.store in=\xone,
  y1/.store in=\yone,
  x2/.store in=\xtwo,
  y2/.store in=\ytwo
}

\NewDocumentCommand\myline{m} {
  \pgfqkeys{/myline}{#1}
  \begin{tikzpicture}
    \draw[very thick, ->] (\xone,\yone) -- (\xtwo,\ytwo);
  \end{tikzpicture}
}

\begin{document}

  \myline{x1=0, y1=0, x2=2, y2=2}

\end{document}

输出

相关内容