Skip to content

本文简单介绍一下如何在 LaTeX 定义一个可接受 key-value(键值对)参数的命令(如 \foo[height=3in, shadow = true ]{bar}), 在 LaTeX 中, 想要使用键值对,其实有很多宏包,比如 l3keys, pgfkeys, keyval, xkeyval, kvoptions, 等等.

这里简单介绍一下 keyval 宏包,在导言区使用 \usepackage{keyval} 即可使用,这个包主要提供了两个命令

  • \define@key
  • \setkeys

\define@key

该命令用于定义一个 key, 使用如下

latex
\define@key{family}{key}{code}
  • family 可以理解为该 key 所处的模块
  • key 为 key 的名字
  • code 块中暴露一个参数占位符 #1 用于对接受到的 value 进行操作
latex
\def\myname{Ljguo}
\define@key{test}{name}{\def\myname{#1}}

如上定义了一个 test 模块下的名为 namekey, 其功能是修改命令 \myname 的内容

\setkeys

该命令用于设置 key 的值, 使用如下

latex
\setkeys{family}{code}
  • family 对应 \define@key 定义的 family
  • code 为具体的内容, 如
latex
\setkeys{test}{name = ZhangSan}

的作用是设置模块 test 中的 name 为 ZhangSan.

综合案例

latex
\documentclass{ctexart}

\usepackage{xcolor}
\usepackage{keyval}

\makeatletter
\def\foo@color{cyan}
\def\foo@style{\Large\bfseries}

\define@key{foo}{color}{\def\foo@color{#1}}
\define@key{foo}{style}{\def\foo@style{#1}}
\newcommand\foo[2][]{%
    \begingroup
    \setkeys{foo}{#1}%
    \color{\foo@color}\foo@style #2
    \endgroup
}
\makeatother

\begin{document}
\foo{Hello Test}, \foo[color = red, style = \small\itshape]{Hello Test}
\end{document}