![在 \NewDocumentCommand 中使用键值](https://linux22.com/image/362752/%E5%9C%A8%20%5CNewDocumentCommand%20%E4%B8%AD%E4%BD%BF%E7%94%A8%E9%94%AE%E5%80%BC.png)
我使用\NewDocumentCommand
xparse 来创建自定义命令。我创建的实际命令有很多参数,因此我在这里给出一个更简单的示例。我希望拥有 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}