选择键和异常处理

选择键和异常处理

最近,我将自己编写的“捆绑包”从使用 切换xkeyvalkeyreader。除了向后兼容之外,这样做的原因之一是在 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}
  ;
}

相关内容