最近,我将自己编写的“捆绑包”从使用 切换xkeyval
到keyreader
。除了向后兼容之外,这样做的原因之一是在 keyreader 中定义键更方便,尤其是对于 choicekeys。缺少的一个问题是变体\define@choicekey+
,其中错误的用户输入可以通过自定义宏来捕获。
我的第一个问题(也是相当明显的)是 中是否有解决方案keyreader
。
然而,我越想这个问题,就越希望 LaTeX 中有一个异常机制。据我所知(当然不是那么多),在pgfkeys
(也许ltxkeys
?)中,当你在/错误/树。
那么,除了强行插入代码以适应范式之外pgfkeys
,是否存在解决 LaTeX 中异常的方法?
答案1
选择键的加号形式具有以下语法
\define@choicekey+[<pref>]{<fam>}{<key>}[<bin>]{<nominations>}[<default>]{<f1>}{<f2>}
当在 中找到用户输入时<nominations>
,<f1>
将被执行,否则<f2>
将被调用。\krddefinekeys
命令键盘阅读器<f2>
因为\krd@keyvalerr
在大多数情况下,用户通常会在包中输入错误消息<f2>
。鍵盤在这种情况下将调用/errors/unknown choice value={<key>}{<value>}
,这相当于\krd@keyvalerr
。
<f1>
在<f2>
键值包中的“回调”键盘阅读器包裹。
当您指定键类型时choice
,该命令\krddefinekeys
会自动且始终在内部使用星号 ( *
) 和加号 ( +
) 变体\define@choicekey
。因此,选择align
键
\krddefinekeys*[KV]{ebox}[mp@]{%
choice/align/center/
center.do=\let\mp@alignright\hfil\let\mp@alignleft\hfil,
right.do=\let\mp@alignright\hfill\let\mp@alignleft\relax,
left.do=\let\mp@alignright\relax\let\mp@alignleft\hfill,
justified.do=\let\mp@alignright\relax\let\mp@alignleft\relax
}
相当于以下代码。这是在定义 key 时内部执行的操作align
。
\define@choicekey*+[KV]{ebox}[mp@]{align}[\krduserinput\krdorder]{%
center,right,left,justified
}[{center}]{%
\krd@executealt{#1}{<f1>}%
}{%
\krd@keyvalerr
}
宏\krd@keyvalerr
定义为
\protected\def\krd@keyvalerr{%
\krd@getinnoval
\@latex@error{Erroneous value '\krd@ival' \MessageBreak for key or
option '\XKV@tkey'}{Invalid value for key '\XKV@tkey'.}%
}
其中\krd@ival
是密钥的“无害值”。它由 计算得出\krd@getinnoval
,通常长度最多为 20 个“无害”字符。\krd@keyvalerr
可能是您所指的“异常处理程序”。如果您愿意,可以重新定义它,但要小心。
示例文件键盘阅读器包裹:
\documentclass{standalone}
\usepackage{keyreader}
\usepackage{xcolor}
\makeatletter
\newdimen\shadowsize
\krddefinekeys*[KV]{ebox}[mp@]{%
bool/frame/true;
bool/shadow/true;
cmd/framecolor/black;
cmd/shadecolor/white;
cmd/shadowcolor/gray;
cmd/framesize/.4pt;
cmd/boxsize/.1\columnwidth;
cmd/shadowsize/1pt;
choice/align/center/
center.do=\let\mp@alignright\hfil\let\mp@alignleft\hfil,
right.do=\let\mp@alignright\hfill\let\mp@alignleft\relax,
left.do=\let\mp@alignright\relax\let\mp@alignleft\hfill,
justified.do=\let\mp@alignright\relax\let\mp@alignleft\relax
;
}
\savevaluekeys[KV]{ebox}{frame,framecolor,framesize}
\krdpresetkeys[KV]{ebox}{%
frame,framecolor=black,shadecolor=white,framesize=0.5pt,boxsize,align
}
\krdpostsetkeys[KV]{ebox}{%
shadow=\usevalue{frame},shadowcolor=\usevalue{framecolor}!40,
shadowsize=\usevalue{framesize}*4
}
\newcommand*\ebox[2][]{%
\krdsetkeys[KV]{ebox}{#1}%
\begingroup
\ifmp@frame
\fboxrule=\dimexpr\mp@framesize\relax
\else
\fboxrule=0pt
\fi
\ifmp@shadow
\shadowsize=\dimexpr\mp@shadowsize\relax
\else
\shadowsize=0pt
\fi
\setbox0=\hbox{%
\fcolorbox{\mp@framecolor}{\mp@shadecolor}{%
\hbox to\mp@boxsize{%
\mp@alignright #2\mp@alignleft
}%
}%
}%
\hskip\shadowsize
\color{\mp@shadowcolor}%
\rule[-\dp0]{\wd0}{\the\dimexpr\ht0+\dp0\relax}%
\llap{\raisebox{\shadowsize}{\box0\hskip\shadowsize}}%
\endgroup
}
\makeatother
\begin{document}
\ebox[shadecolor=brown]{ebox1}
\ebox[framecolor=magenta,boxsize=2cm,align=right]{ebox2}
\ebox[shadow=false,framesize=1pt,framecolor=red,boxsize=1.5cm,align=left]{ebox3}
\ebox[framesize=1pt,framecolor=green,shadowcolor=blue]{ebox4}
\ebox[frame=false,shadow,shadowcolor=yellow,framesize=.5pt]{ebox5}
\end{document}
我正在提交 0.5 版键盘阅读器到 CTAN。语法\krddefinekeys
已扩展以满足您的需要:
\krddefinekeys[<pref>]{<fam>}[<mp>]{
ord/<key>/<dft>/<f1>;
cmd/<key>/<dft>/<f1>;
bool/<key>/<dft>/<f1>;
bool+/<key>/<dft>/<f1>/<f2>;
choice/<key>/<dft>/<nominations>/<f1>;
choice+/<key>/<dft>/<nominations>/<f1>/<f2>;
}
希望这<f2>
就是您想要的“处理程序”。它现在在包中,但您还无法在文档中找到它。
例子:
\krddefinekeys*[KV]{fam}[mp@]{%
ord/keya/default-a/\def\x##1{#1*##1};
bool/keyb/true/;
bool+/keyc/true/\def\valueaccepted{#1}/\@latexerr{Invalid value '#1' for keyc}\@ehd;
cmd/keyd/black;
choice/keye/blue/green,blue,red,cyan/\def\emptycallback{};
choice+/keyf/center/
center.do=\let\mp@alignright\hfil\let\mp@alignleft\hfil,
right.do=\let\mp@alignright\hfill\let\mp@alignleft\relax,
left.do=\let\mp@alignright\relax\let\mp@alignleft\hfill,
justified.do=\let\mp@alignright\relax\let\mp@alignleft\relax
//
\let\mp@alignright\hfil\let\mp@alignleft\hfil
\@@warning{Invalid value for keyf; 'center' assumed}
;
}