我正在尝试定义一个灵活的“分隔符样式”命令。我在一个包中尝试了它,并\str_case:nnF
返回了Undefined Control Sequence
,而使用则\str_case:nnn
进一步导致了另一个问题,这似乎与命令本身有关。所以我将它移到文档中,得到了以下代码:
\documentclass[a4paper]{report}
\usepackage{amsthm,xparse}
\ExplSyntaxOn
\newcommand{\delim}[3][lr]{
\str_case:nnF { #1 }
{
{ b }{\def\lsize{\big}\def\rsize{\big}}
{ B }{\def\lsize{\Big}\def\rsize{\Big}}
{ x }{\def\lsize{\bigg}\def\rsize{\bigg}}
{ X }{\def\lsize{\Bigg}\def\rsize{\Bigg}}
{ lr }{\def\lsize{\left}\def\rsize{\right}}
{ bB }{\def\lsize{\big}\def\rsize{\Big}}
{ Bb }{\def\lsize{\Big}\def\rsize{\big}}
{ xb }{\def\lsize{\bigg}\def\rsize{\big}}
{ xB }{\def\lsize{\bigg}\def\rsize{\Big}}
{ bx }{\def\lsize{\big}\def\rsize{\bigg}}
{ Bx }{\def\lsize{\Big}\def\rsize{\bigg}}
{ bX }{\def\lsize{\big}\def\rsize{\Bigg}}
{ BX }{\def\lsize{\Big}\def\rsize{\Bigg}}
{ xX }{\def\lsize{\bigg}\def\rsize{\Bigg}}
{ Xb }{\def\lsize{\Bigg}\def\rsize{\big}}
{ XB }{\def\lsize{\Bigg}\def\rsize{\Big}}
{ Xx }{\def\lsize{\Bigg}\def\rsize{\bigg}}
}
\str_case:nnF { #2 }
{
{ s }{\def\ldel{[}\def\rdel{]}}
{ r }{\def\ldel{(}\def\rdel{)}}
{ b }{\def\ldel{\lbrace}\def\rdel{\rbrace}}
{ v }{\def\ldel{|}\def\rdel{|}}
{ a }{\def\ldel{\langle}\def\rdel{\rangle}}
{ dv }{\def\ldel{\|}\def\rdel{\|}}
{ rs }{\def\ldel{(}\def\rdel{]}}
{ sr }{\def\ldel{[}\def\rdel{)}}
{ rb }{\def\ldel{(}\def\rdel{\rbrace}}
{ sb }{\def\ldel{[}\def\rdel{\rbrace}}
{ br }{\def\ldel{\lbrace}\def\rdel{)}}
{ bs }{\def\ldel{\lbrace}\def\rdel{]}}
{ ra }{\def\ldel{(}\def\rdel{\rangle}}
{ sa }{\def\ldel{[}\def\rdel{\rangle}}
{ ba }{\def\ldel{\lbrace}\def\rdel{\rangle}}
{ ar }{\def\ldel{\langle}\def\rdel{)}}
{ as }{\def\ldel{\langle}\def\rdel{]}}
{ ab }{\def\ldel{\langle}\def\rdel{\rbrace}}
{ rv }{\def\ldel{(}\def\rdel{|}}
{ sv }{\def\ldel{[}\def\rdel{|}}
{ bv }{\def\ldel{\lbrace}\def\rdel{|}}
{ av }{\def\ldel{\langle}\def\rdel{|}}
{ vr }{\def\ldel{|}\def\rdel{)}}
{ vs }{\def\ldel{|}\def\rdel{]}}
{ vb }{\def\ldel{|}\def\rdel{\rbrace}}
{ va }{\def\ldel{|}\def\rdel{\rangle}}
{ rdv }{\def\ldel{(}\def\rdel{\|}}
{ sdv }{\def\ldel{[}\def\rdel{\|}}
{ bdv }{\def\ldel{\lbrace}\def\rdel{\|}}
{ adv }{\def\ldel{\langle}\def\rdel{\|}}
{ vdv }{\def\ldel{|}\def\rdel{\|}}
{ dvr }{\def\ldel{\|}\def\rdel{)}}
{ dvs }{\def\ldel{\|}\def\rdel{]}}
{ dvb }{\def\ldel{\|}\def\rdel{\rbrace}}
{ dva }{\def\ldel{\|}\def\rdel{\rangle}}
{ dvv }{\def\ldel{\|}\def\rdel{|}}
{ lr }{\def\ldel{(}\def\rdel{\@empty}}
{ rr }{\def\ldel{)}\def\rdel{\@empty}}
{ ls }{\def\ldel{[}\def\rdel{\@empty}}
{ rs }{\def\ldel{]}\def\rdel{\@empty}}
{ lb }{\def\ldel{\lbrace}\def\rdel{\@empty}}
{ rb }{\def\ldel{\rbrace}\def\rdel{\@empty}}
{ la }{\def\ldel{\langle}\def\rdel{\@empty}}
{ ra }{\def\ldel{\rangle}\def\rdel{\@empty}}
{ ov }{\def\ldel{|}\def\rdel{\@empty}}
{ odv }{\def\ldel{\|}\def\rdel{\@empy}}
{ ssi }{\def\ldel{[}\def\rdel{\mathclose{[}}}
{ sis }{\def\ldel{\mathopen{]}}\def\rdel{]}}
{ sisi }{\def\ldel{\mathopen{]}}\def\rdel{\mathclose{[}}}
}
\ifx\rdel\@empty
\lsize\ldel
\else
\lsize\ldel #3 \rsize\rdel
\fi
}
\ExplSyntaxOff
%\ignopt{greek}
\begin{document}
$$\delim[lr]{r}{\fr{a}{b}}$$
\end{document}
然后最奇怪的事情发生了:
./delim_attempt.tex:3: Undefined control sequence.
<recently read> \ExplSyntaxOn
l.3 \ExplSyntaxOn
我当时就想:“什么???”这怎么可能?
更新:
考虑到下面的评论,我将其更正为[r]
、{r}
已加载xparse
和已更新Expl
,这意味着\str_case:nnF
现在可以正常工作。因此代码已相应更改。顺便说一句,我怀疑空格可能会带来麻烦,我尝试删除它们(例如{ lr }
-> {lr}
),但上述代码的错误排版仍然存在。也就是说,代码给出:
./delim_attempt.tex:87: Undefined control sequence.
\\delim ...\@empty\lsize \ldel \else \lsize \ldel
#3\rsize \rdel \fi
l.87 $$\delim[lr]{r}{\frac{a}{b}}
$$
\lsize\ldel #3 \rsize\rdel
并通过在分支中注释\else
,我可以排版:
rsrbvadvrssrrbsbbrbsrasabaarasabrvsvbvavvrvsvbvardvsdvbdvadvvdvdvrdvsdvbdvadvvlrrrlsrslbrblaraovod
这当然很简单不是我想要的是。
答案1
您误用了expl3
;这是一个符合要求的版本:
\documentclass[a4paper]{report}
\usepackage{amsthm,xparse}
\ExplSyntaxOn
\NewDocumentCommand{\delim}{ O{lr} m m }
{
\mickg_delim:nnn { #1 } { #2 } { #3 }
}
\tl_new:N \l_mickg_lsize_tl
\tl_new:N \l_mickg_rsize_tl
\tl_new:N \l_mickg_ldel_tl
\tl_new:N \l_mickg_rdel_tl
\cs_new_protected:Npn \mickg_delim:nnn #1 #2 #3
{
\str_case:nnF { #1 }
{
{ b }{\tl_set:Nn \l_mickg_lsize_tl {\big} \tl_set:Nn \l_mickg_rsize_tl {\big}}
{ B }{\tl_set:Nn \l_mickg_lsize_tl {\Big} \tl_set:Nn \l_mickg_rsize_tl {\Big}}
{ x }{\tl_set:Nn \l_mickg_lsize_tl {\bigg} \tl_set:Nn \l_mickg_rsize_tl {\bigg}}
{ X }{\tl_set:Nn \l_mickg_lsize_tl {\Bigg} \tl_set:Nn \l_mickg_rsize_tl {\Bigg}}
{ lr }{\tl_set:Nn \l_mickg_lsize_tl {\left} \tl_set:Nn \l_mickg_rsize_tl {\right}}
{ bB }{\tl_set:Nn \l_mickg_lsize_tl {\big} \tl_set:Nn \l_mickg_rsize_tl {\Big}}
{ Bb }{\tl_set:Nn \l_mickg_lsize_tl {\Big} \tl_set:Nn \l_mickg_rsize_tl {\big}}
{ xb }{\tl_set:Nn \l_mickg_lsize_tl {\bigg} \tl_set:Nn \l_mickg_rsize_tl {\big}}
{ xB }{\tl_set:Nn \l_mickg_lsize_tl {\bigg} \tl_set:Nn \l_mickg_rsize_tl {\Big}}
{ bx }{\tl_set:Nn \l_mickg_lsize_tl {\big} \tl_set:Nn \l_mickg_rsize_tl {\bigg}}
{ Bx }{\tl_set:Nn \l_mickg_lsize_tl {\Big} \tl_set:Nn \l_mickg_rsize_tl {\bigg}}
{ bX }{\tl_set:Nn \l_mickg_lsize_tl {\big} \tl_set:Nn \l_mickg_rsize_tl {\Bigg}}
{ BX }{\tl_set:Nn \l_mickg_lsize_tl {\Big} \tl_set:Nn \l_mickg_rsize_tl {\Bigg}}
{ xX }{\tl_set:Nn \l_mickg_lsize_tl {\bigg} \tl_set:Nn \l_mickg_rsize_tl {\Bigg}}
{ Xb }{\tl_set:Nn \l_mickg_lsize_tl {\Bigg} \tl_set:Nn \l_mickg_rsize_tl {\big}}
{ XB }{\tl_set:Nn \l_mickg_lsize_tl {\Bigg} \tl_set:Nn \l_mickg_rsize_tl {\Big}}
{ Xx }{\tl_set:Nn \l_mickg_lsize_tl {\Bigg} \tl_set:Nn \l_mickg_rsize_tl {\bigg}}
}
{ \tl_clear:N \l_mickg_lsize_tl \tl_clear:N \l_mickg_rsize_tl }
\str_case:nnF { #2 }
{
{ s }{\tl_set:Nn \l_mickg_ldel_tl {[} \tl_set:Nn \l_mickg_rdel_tl {]}}
{ r }{\tl_set:Nn \l_mickg_ldel_tl {(} \tl_set:Nn \l_mickg_rdel_tl {)}}
{ b }{\tl_set:Nn \l_mickg_ldel_tl {\lbrace} \tl_set:Nn \l_mickg_rdel_tl {\rbrace}}
{ v }{\tl_set:Nn \l_mickg_ldel_tl {|} \tl_set:Nn \l_mickg_rdel_tl {|}}
{ a }{\tl_set:Nn \l_mickg_ldel_tl {\langle} \tl_set:Nn \l_mickg_rdel_tl {\rangle}}
{ dv }{\tl_set:Nn \l_mickg_ldel_tl {\|} \tl_set:Nn \l_mickg_rdel_tl {\|}}
{ rs }{\tl_set:Nn \l_mickg_ldel_tl {(} \tl_set:Nn \l_mickg_rdel_tl {]}}
{ sr }{\tl_set:Nn \l_mickg_ldel_tl {[} \tl_set:Nn \l_mickg_rdel_tl {)}}
{ rb }{\tl_set:Nn \l_mickg_ldel_tl {(} \tl_set:Nn \l_mickg_rdel_tl {\rbrace}}
{ sb }{\tl_set:Nn \l_mickg_ldel_tl {[} \tl_set:Nn \l_mickg_rdel_tl {\rbrace}}
{ br }{\tl_set:Nn \l_mickg_ldel_tl {\lbrace} \tl_set:Nn \l_mickg_rdel_tl {)}}
{ bs }{\tl_set:Nn \l_mickg_ldel_tl {\lbrace} \tl_set:Nn \l_mickg_rdel_tl {]}}
{ ra }{\tl_set:Nn \l_mickg_ldel_tl {(} \tl_set:Nn \l_mickg_rdel_tl {\rangle}}
{ sa }{\tl_set:Nn \l_mickg_ldel_tl {[} \tl_set:Nn \l_mickg_rdel_tl {\rangle}}
{ ba }{\tl_set:Nn \l_mickg_ldel_tl {\lbrace} \tl_set:Nn \l_mickg_rdel_tl {\rangle}}
{ ar }{\tl_set:Nn \l_mickg_ldel_tl {\langle} \tl_set:Nn \l_mickg_rdel_tl {)}}
{ as }{\tl_set:Nn \l_mickg_ldel_tl {\langle} \tl_set:Nn \l_mickg_rdel_tl {]}}
{ ab }{\tl_set:Nn \l_mickg_ldel_tl {\langle} \tl_set:Nn \l_mickg_rdel_tl {\rbrace}}
{ rv }{\tl_set:Nn \l_mickg_ldel_tl {(} \tl_set:Nn \l_mickg_rdel_tl {|}}
{ sv }{\tl_set:Nn \l_mickg_ldel_tl {[} \tl_set:Nn \l_mickg_rdel_tl {|}}
{ bv }{\tl_set:Nn \l_mickg_ldel_tl {\lbrace} \tl_set:Nn \l_mickg_rdel_tl {|}}
{ av }{\tl_set:Nn \l_mickg_ldel_tl {\langle} \tl_set:Nn \l_mickg_rdel_tl {|}}
{ vr }{\tl_set:Nn \l_mickg_ldel_tl {|} \tl_set:Nn \l_mickg_rdel_tl {)}}
{ vs }{\tl_set:Nn \l_mickg_ldel_tl {|} \tl_set:Nn \l_mickg_rdel_tl {]}}
{ vb }{\tl_set:Nn \l_mickg_ldel_tl {|} \tl_set:Nn \l_mickg_rdel_tl {\rbrace}}
{ va }{\tl_set:Nn \l_mickg_ldel_tl {|} \tl_set:Nn \l_mickg_rdel_tl {\rangle}}
{ rdv }{\tl_set:Nn \l_mickg_ldel_tl {(} \tl_set:Nn \l_mickg_rdel_tl {\|}}
{ sdv }{\tl_set:Nn \l_mickg_ldel_tl {[} \tl_set:Nn \l_mickg_rdel_tl {\|}}
{ bdv }{\tl_set:Nn \l_mickg_ldel_tl {\lbrace} \tl_set:Nn \l_mickg_rdel_tl {\|}}
{ adv }{\tl_set:Nn \l_mickg_ldel_tl {\langle} \tl_set:Nn \l_mickg_rdel_tl {\|}}
{ vdv }{\tl_set:Nn \l_mickg_ldel_tl {|} \tl_set:Nn \l_mickg_rdel_tl {\|}}
{ dvr }{\tl_set:Nn \l_mickg_ldel_tl {\|} \tl_set:Nn \l_mickg_rdel_tl {)}}
{ dvs }{\tl_set:Nn \l_mickg_ldel_tl {\|} \tl_set:Nn \l_mickg_rdel_tl {]}}
{ dvb }{\tl_set:Nn \l_mickg_ldel_tl {\|} \tl_set:Nn \l_mickg_rdel_tl {\rbrace}}
{ dva }{\tl_set:Nn \l_mickg_ldel_tl {\|} \tl_set:Nn \l_mickg_rdel_tl {\rangle}}
{ dvv }{\tl_set:Nn \l_mickg_ldel_tl {\|} \tl_set:Nn \l_mickg_rdel_tl {|}}
{ lr }{\tl_set:Nn \l_mickg_ldel_tl {(} \tl_clear:N \l_mickg_rdel_tl}
{ rr }{\tl_set:Nn \l_mickg_ldel_tl {)} \tl_clear:N \l_mickg_rdel_tl}
{ ls }{\tl_set:Nn \l_mickg_ldel_tl {[} \tl_clear:N \l_mickg_rdel_tl}
{ rs }{\tl_set:Nn \l_mickg_ldel_tl {]} \tl_clear:N \l_mickg_rdel_tl}
{ lb }{\tl_set:Nn \l_mickg_ldel_tl {\lbrace} \tl_clear:N \l_mickg_rdel_tl}
{ rb }{\tl_set:Nn \l_mickg_ldel_tl {\rbrace} \tl_clear:N \l_mickg_rdel_tl}
{ la }{\tl_set:Nn \l_mickg_ldel_tl {\langle} \tl_clear:N \l_mickg_rdel_tl}
{ ra }{\tl_set:Nn \l_mickg_ldel_tl {\rangle} \tl_clear:N \l_mickg_rdel_tl}
{ ov }{\tl_set:Nn \l_mickg_ldel_tl {|} \tl_clear:N \l_mickg_rdel_tl}
{ odv }{\tl_set:Nn \l_mickg_ldel_tl {\|} \tl_clear:N \l_mickg_rdel_tl}
{ ssi }{\tl_set:Nn \l_mickg_ldel_tl {[} \tl_set:Nn \l_mickg_rdel_tl {\mathclose{[}}}
{ sis }{\tl_set:Nn \l_mickg_ldel_tl {\mathopen{]}} \tl_set:Nn \l_mickg_rdel_tl {]}}
{ sisi }{\tl_set:Nn \l_mickg_ldel_tl {\mathopen{]}} \tl_set:Nn \l_mickg_rdel_tl {\mathclose{[}}}
}
{ \tl_set:Nn \l_mickg_ldel_tl {(} \tl_set:Nn \l_mickg_rdel_tl {)} } % some default
\tl_if_empty:NTF \l_mickg_rdel_tl
{
\l_mickg_lsize_tl \l_mickg_ldel_tl #3
}
{
\l_mickg_lsize_tl \l_mickg_ldel_tl #3 \l_mickg_rsize_tl \l_mickg_rdel_tl
}
}
\ExplSyntaxOff
\begin{document}
\[
\delim[lr]{r}{\frac{a}{b}}
\]
\end{document}
检查texdoc interface3
更多信息。该\str_case:nnF
函数需要三个参数:第一个是需要检查的字符串,第二个是一组{<string>}{<code>}
用于决定要做什么的对;最后一个参数是在“以上都不是”的情况下要执行的代码。
请不要$$
在 LaTeX 中使用。这是错误的。
答案2
这是 egreg 答案的替代方案,其主要目的是稍微整理一下您提出的语法并添加一些警告和错误消息。
还要注意,egreg 的回答中仍然存在问题,类似\delim{ssi}{\frac{a}{b}}
这样的情况从您的代码延续到他的代码(和\mathopen
是\mathclose
罪魁祸首)。
在此版本中,大小和分隔符选项均需要两个字母。如果只给出一个字母,则该字母将用于两个分隔符(唯一的例外是大小的“l”和“r”,其中任何一个都会给出一个\left
and\right
配对)。
对于分隔符类型,小写字母表示标准方向,大写字母表示反向方向(例如,“rr”表示“(”和“)”,而“RR”表示“)”和“(”)。例外是“v”和“V”,它们分别表示单杠和双杠。当给出“-”时,相应的分隔符将被省略。
两个规范参数都是可选的,分别默认为“lr”和“rr”。
\documentclass[a4paper]{report}
\usepackage{xparse,pgffor}
\ExplSyntaxOn
\tl_new:N \l_mickg_left_delim_size_tl
\tl_new:N \l_mickg_right_delim_size_tl
\tl_new:N \l_mickg_left_delim_tl
\tl_new:N \l_mickg_right_delim_tl
\msg_new:nnnn { MickG } { Left ~ delimiter ~ size }
{ Incorrectly ~ specified ~ left ~ delimiter ~ size. } {}
\msg_new:nnnn { MickG } { Right ~ delimiter ~ size }
{ Incorrectly ~ specified ~ right ~ delimiter ~ size. } {}
\msg_new:nnnn { MickG } { Delimiter ~ size }
{ Incorrect ~ delimiter ~ size ~ specification. } {}
\msg_new:nnnn { MickG } { Left ~ delimiter }
{ Incorrectly ~ specified ~ left ~ delimiter. } {}
\msg_new:nnnn { MickG } { Right ~ delimiter }
{ Incorrectly ~ specified ~ right ~ delimiter. } {}
\msg_new:nnnn { MickG } { Delimiters }
{ Incorrect ~ delimiter ~ specification. } {}
\cs_new_protected:Npn \mickg_delims_size_set:n #1
{
% Test if one or two letters provided.
\int_case:nnF { \tl_count:n {#1} }
{
{ \c_two } { \tl_set:Nn \l_tmpa_tl {#1} } % If two, use both.
{ \c_one } { \tl_set:Nn \l_tmpa_tl {#1#1} } % If one, use it twice.
}
% If not one or two letters, set to 'lr' and issue error.
{
\tl_set:Nn \l_tmpa_tl { lr }
\msg_error:nn { MickG } { Delimiter ~ size }
}
% Ensure \left is always paired with \right
\str_case_x:nnTF { \l_tmpa_tl }
{
{ lr } { \prg_do_nothing: }
{ ll } { \msg_warning:nn { MickG } { Delimiter ~ size } } % Warn if 'l' was copied.
{ rr } { \msg_warning:nn { MickG } { Delimiter ~ size } } % Warn if 'r' was copied.
}
{
\tl_set_eq:NN \l_mickg_left_delim_size_tl \left
\tl_set_eq:NN \l_mickg_right_delim_size_tl \right
}
% If not using \left and \rigth, set sizes independently.
{
\str_case_x:nnF { \tl_head:N \l_tmpa_tl }
{
{ b } { \tl_set_eq:NN \l_mickg_left_delim_size_tl \bigl }
{ B } { \tl_set_eq:NN \l_mickg_left_delim_size_tl \Bigl }
{ x } { \tl_set_eq:NN \l_mickg_left_delim_size_tl \biggl }
{ X } { \tl_set_eq:NN \l_mickg_left_delim_size_tl \Biggl }
}
% Error if no match; default to empty token list.
{
\tl_clear:N \l_mickg_left_delim_size_tl
\msg_error:nn { MickG } { Left ~ delimiter ~ size }
}
\str_case_x:nnF { \tl_tail:N \l_tmpa_tl }
{
{ b } { \tl_set_eq:NN \l_mickg_right_delim_size_tl \bigr }
{ B } { \tl_set_eq:NN \l_mickg_right_delim_size_tl \Bigr }
{ x } { \tl_set_eq:NN \l_mickg_right_delim_size_tl \biggr }
{ X } { \tl_set_eq:NN \l_mickg_right_delim_size_tl \Biggr }
}
% Error if no match; default to empty token list.
{
\tl_clear:N \l_mickg_right_delim_size_tl
\msg_error:nn { MickG } { Right ~ delimiter ~ size }
}
}
}
\cs_new_protected:Npn \mickg_delims_type_set:n #1
{
% Test if one or two letters provided.
\int_case:nnF { \tl_count:n {#1} }
{
{ \c_two } { \tl_set:Nn \l_tmpa_tl {#1} } % If two, use both.
{ \c_one } { \tl_set:Nn \l_tmpa_tl {#1#1} } % If one, use it twice.
}
% If not one or two letters, set to 'rr' and issue error.
{
\tl_set:Nn \l_tmpa_tl { rr }
\msg_error:nn { MickG } { Delimiters }
}
% Test first letter.
\str_case_x:nnF { \tl_head:N \l_tmpa_tl }
{
{ r } { \tl_set_eq:NN \l_mickg_left_delim_tl ( }
{ R } { \tl_set_eq:NN \l_mickg_left_delim_tl ) }
{ s } { \tl_set_eq:NN \l_mickg_left_delim_tl [ }
{ S } { \tl_set_eq:NN \l_mickg_left_delim_tl ] }
{ b } { \tl_set_eq:NN \l_mickg_left_delim_tl \lbrace }
{ B } { \tl_set_eq:NN \l_mickg_left_delim_tl \rbrace }
{ a } { \tl_set_eq:NN \l_mickg_left_delim_tl \langle }
{ A } { \tl_set_eq:NN \l_mickg_left_delim_tl \rangle }
{ v } { \tl_set_eq:NN \l_mickg_left_delim_tl | }
{ V } { \tl_set_eq:NN \l_mickg_left_delim_tl \| }
{ - } { \tl_set_eq:NN \l_mickg_left_delim_tl . }
}
% Error if no match; default to "("
{
\tl_set_eq:NN \l_mickg_left_delim_tl (
\msg_error:nn { MickG } { Left ~ delimiter }
}
% Test second letter.
\str_case_x:nnF { \tl_tail:N \l_tmpa_tl }
{
{ r } { \tl_set_eq:NN \l_mickg_right_delim_tl ) }
{ R } { \tl_set_eq:NN \l_mickg_right_delim_tl ( }
{ s } { \tl_set_eq:NN \l_mickg_right_delim_tl ] }
{ S } { \tl_set_eq:NN \l_mickg_right_delim_tl [ }
{ b } { \tl_set_eq:NN \l_mickg_right_delim_tl \rbrace }
{ B } { \tl_set_eq:NN \l_mickg_right_delim_tl \lbrace }
{ a } { \tl_set_eq:NN \l_mickg_right_delim_tl \rangle }
{ A } { \tl_set_eq:NN \l_mickg_right_delim_tl \langle }
{ v } { \tl_set_eq:NN \l_mickg_right_delim_tl | }
{ V } { \tl_set_eq:NN \l_mickg_right_delim_tl \| }
{ - } { \tl_set_eq:NN \l_mickg_right_delim_tl . }
}
% Error if no match; default to ")"
{
\tl_set_eq:NN \l_mickg_right_delim_tl )
\msg_error:nn { MickG } { Right ~ delimiter }
}
}
\cs_new_protected:Npn \mickg_delims_print:nnn #1 #2 #3
{
\mickg_delims_size_set:n {#1}
\mickg_delims_type_set:n {#2}
\l_mickg_left_delim_size_tl \l_mickg_left_delim_tl
#3
\l_mickg_right_delim_size_tl \l_mickg_right_delim_tl
}
\NewDocumentCommand \delim { O{ lr } O{ r } m }
{
\mickg_delims_print:nnn {#1} {#2} {#3}
}
\ExplSyntaxOff
\begin{document}
% Test by iterating through the combinations.
\foreach \x in {b,B,x,X} {
\foreach \y in {b,B,x,X} {
\foreach \z in {r,R,s,S,b,B,a,A,v,V,-} {
\foreach \w in {r,R,s,S,b,B,a,A,v,V,-} {
% \delim does not expand the optional arguments but this could
% easily be changed; I expand them here with an \edef
\edef\foo{\noexpand\delim[\x\y][\z\w]}
$\displaystyle\foo{\frac{a}{b}}$\quad
}
}
}
}
\end{document}
答案3
1)xparse
或者需要类似的包Expl
。
2) 第二个参数是必需的,所以\delim[lr]{r}{\fr{a}{b}}
是正确的。顺便说一下,\fr
= \displaystyle\frac
。
3)您需要一个“非上述情况”的代码,否则会产生奇怪的错误\str_case:nnF
;或者,您可以使用\str_case:nn
。
4) 顺便说一句,如果不更新的话,Expl
我不知道这两个函数是否都可用。有一件事是肯定的:\str_case:nnF
被称为\str_case:nnn
,或者这样的名称由类似的函数承担。
现在我仅测试该命令的其余可能性。