使用 def 设置 keyval 默认值时出错

使用 def 设置 keyval 默认值时出错

首先,抱歉,我的英语水平不佳。

我正在尝试通过 keyval 包执行带有键值参数的个性化命令。这是我的第一次尝试,可能可以有更好的形式来实现它。

我通过输入命令将一个文件包含在主文件中。在该文件的第一部分,如果有必要,我想对我个人的命令和配置进行一些描述。

我创建了一个新命令(\imagen)来包含图片,我的目的是让它像这样工作:

\imagen[key-value options]{file name}{caption}

我想要使​​用的键是:

  • carpeta=我保存图像的文件夹
  • ancho = 宽度
  • escala=规模
  • aqui --> bolean 强制位置为 H。正常是 htb
  • etiqueta = 参考标签。默认模式下为文件名

该命令的定义是:

% INCLUIR IMAGENES
%%%%%%%%%%%%%% Creación de las claves
\makeatletter
\define@key{Imagen}{carpeta}{\def\Imagen@carpeta{#1}}
\define@key{Imagen}{ancho}{\def\Imagen@ancho{#1}}
\define@key{Imagen}{escala}{\def\Imagen@escala{#1}}
\define@key{Imagen}{aqui}[true]{\def\Imagen@aqui{#1}}
\define@key{Imagen}{etiqueta}{\def\Imagen@etiqueta{#1}}
%%%%%%%%%%%%%% Valores por defecto
\setkeys{Imagen}{\ImagenDefecto}
%%%%%%%%%%%%%% Definición de la Macro
\newcommand{\imagen}[3][]{
 %se empieza un grupo para que no guarde
 \begingroup
  \setkeys{Imagen}{#1}
  \ifdef\Imagen@carpeta%
    {\def\Imagen@fichero{{\Imagen@carpeta#2}}}%
    {\def\Imagen@fichero{#2}}
  \ifdef\Imagen@aqui%
    {\begin{figure}[H]}%
    {\begin{figure}[htb]}
      \begin{center}
        \ifdef\Imagen@anchura%
          {\includegraphics[width=\Imagen@ancho]{\Imagen@fichero}}%
          {\ifdef\Imagen@escala%
            {\includegraphics[scale=\Imagen@escala]{\Imagen@fichero}}
            {\includegraphics{\Imagen@fichero}}
          }
        \captionof{figure}{#3}
        \ifdef\Imagen@etiqueta%
          {\label{\Imagen@etiqueta}}%
          {\label{#2}}
      \end{center}
    \end{figure}
 \endgroup
}
\makeatother

正如您所看到的,我放置了 \setkeys{Imagen}{\ImagenDefecto},其中 \ImagenDefecto 是来自该文件第一部分的定义,在该部分中我对该命令的工作原理做了一些描述并尝试对其进行配置。

为进行我使用的配置:

\def\ImagenDefecto{aqui, carpeta=img}

如果我在定义中使用 = 符号,它不起作用,但如果我将相同的文本直接放在键值命令 \setkeys{Imagen}{aqui, carpeta=img} 中,它就可以完美运行。

错误是:

! Package keyval Error: aqui, escala=img undefined.

我试图停用一些我认为可能有问题的数据包,比如 Babel(全部是西班牙语),但我不知道可能是什么问题。

如果你喜欢,我这样做是为了有一个模板,并将所有的代码放入 github:https://github.com/pepramon/plantilla-latex

谢谢大家。

答案1

\ImagenDefecto需要扩展才能显示键值语法的语法字符逗号和等号。它可以以多种方式扩展。例如,有很多\expandafter

\expandafter\setkeys\expandafter{\expandafter I\expandafter m ...\expandafter}\expandafter{\ImagenDefecto}

由于\expandafter只能跳过一个 token,所以键值列表之前的部分可以放在宏中。这样,就可以免费定义一个设置命令:

\newcommand*{\ImagenSetup}{%
  \setkeys{Imagen}%
}
\expandafter\ImagenSetup\expandafter{\ImagenDefecto}

另外,定义 之后\ImagenSetup,可以通过以下方式进行配置

\ImagenSetup{aqui, carpeta=img}

通过包进行选项声明kvoptions

选项声明可以通过包来简化kvoptions

\usepackage{kvoptions}

\SetupKeyvalOptions{
  family=Imagen,
  prefix=Imagen@,
}
\DeclareStringOption{carpeta}
\DeclareStringOption{ancho}
\DeclareStringOption{escala}
\DeclareBoolOption{aqui}
\DeclareStringOption{etiqueta}
\newcommand*{\ImagenSetup}{\setkeys{Imagen}}

然后可以按照如下方式使用这些选项:

\makeatletter

% String options are initialized to the empty string by default.
\ifx\Imagen@carpeta\@empty
  % empty string
\else
  % non-empty
\fi

% Boolean options are initialized to false by default.
\ifImagen@aqui
  % "aqui" or "aqui=true"
\else
  % default or "aqui=false"
\fi
\makeatother

相关内容