我希望使用该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}