是否允许在 xkeyval 包中使用包括 \par 在内的参数(即键值中的值)?

是否允许在 xkeyval 包中使用包括 \par 在内的参数(即键值中的值)?

我希望使用该xkeyval包来覆盖 9 个参数的限制并阐明不同的参数(强制或可选)。在我的参数/参数中,我有完整的段落,可能包括\par\\\\。我知道有些宏接受\par,有​​些则不接受,以避免隐藏的问题嵌套,我理解。似乎前缀\long允许\par在参数内有。在文档的实现部分,我看到了很多这样的\long宏。

这是否保证我可以\par在包中使用参数/值xkeyval

答案1

\newline\\空行之后无论如何都会出错,但除此之外是可以的(如果真的有必要 ;-))。\par或空行在键中也可以。

只是不能将命令定义\foocmd\newcommand*{}而是\newcommand

如果要安全起见,请使用包\NewDocumentCommand{\foocmd}{+o+m}{...}中的字符xparse,然后在参数中+明确允许等等。\par


一些背景知识

TeX 的\def命令不允许使用 parbreak 等参数,除非\def在使用前加上\long(参见下面的示例)。

LaTeX\newcommand基本上是 的包装器\long\def...,因此它允许\par、空行和\newline\\,而是它的 \newcommand*'un ​​' 版本,不允许这些功能。\long


\documentclass{article}

\usepackage{xkeyval}

\makeatletter

\define@key{foofamily}{foo}{%
  \def\KVfookey{#1}%
}




\def\foodef[#1]#2{%
\setkeys{foofamily}{#1}%

\ifdefined\KVfookey
  The key had the value \KVfookey
\fi

Mandatory argument was #2
}

\long\def\foodeflong[#1]#2{%
\setkeys{foofamily}{#1}%

\ifdefined\KVfookey
  The key had the value \KVfookey
\fi

Mandatory argument was #2
}


\makeatother


\newcommand*{\fooother}[2][foo={A long

key
}]{%
\setkeys{foofamily}{#1}%
Arg was #2%
}

\newcommand{\foocmd}[2][foo={A long

Arg 

}]{%
\setkeys{foofamily}{#1}%
The key was \KVfookey

And this is the 2nd argument: #2%
}

\begin{document}

% Won't work, since arg isn't long
%\foodef[foo={Some 

%key}]{Hello World again}

% Won't work, since defined with `\newcommand*` .. i.e not \long\def...
%\fooother{Hello World}

\begin{itemize}
\item Using a \verb+\long\def+ command -- works
\foodeflong[foo={Some 

key}]{Hello World again}

\item Using a \verb+\newcommand+ command -- works

\foocmd{Hello World}

\foocmd[foo={A very long command  \newline\newline


\par
\parskip=5cm

key}]{... which is absolutely useless}

\end{itemize}

\end{document}

在此处输入图片描述

相关内容