宏中有超过 9 个参数,可换行

宏中有超过 9 个参数,可换行

我有一个过渡系统,其中过渡需要许多参数来描述它。它最终看起来像这样:

A \xlongrightarrow[a_1; b_1; c_1]{a_2; b_2; c_2} B

因此很自然地我有一个如下的宏:

\newcommand{\step}[8]{#1 \xlongrightarrow[#3; #4; #5]{#6; #7; #8} #2}

我可以像使用它一样\step{A}{B}{a_1}{b_1}{c_1}{a_2}{b_2}{c_2}

好处是,当渲染的输出太长时,我可以\\在宏的使用中挤进一个地方,这意味着 step{A}{\\B}{a_1}{b_1}{c_1}{a_2}{b_2}{c_2}我得到了我想要的扩展:

A \xlongrightarrow[a_1; b_1; c_1]{a_2; b_2; c_2} \\B

但是,现在我需要 10 个参数,我会执行以下操作:

\documentclass{article}

\usepackage{extarrows} % defines \xlongrightarrow

\newcommand{\step}[9]{
  \def\tempa{#1}%
  \def\tempb{#2}%
  \def\tempc{#3}%
  \def\tempd{#4}%
  \def\tempe{#5}%
  \def\tempf{#6}%
  \def\tempg{#7}%
  \def\temph{#8}%
  \def\tempi{#9}%
  \stepcont
}
\newcommand{\stepcont}[1]{\tempa \xlongrightarrow[\tempc; \tempd; \tempe; \tempf]{\tempg; \temph; \tempi; #1} \tempb}

\begin{document}

\[
  \step{A}{B}{a_1}{b_1}{c_1}{a_2}{b_2}{c_2}
\]

\end{document}

这真是太神奇了,但是现在我不能再\\在参数前面添加内容来强制换行。

所以最后我的问题是:有没有一种方法可以让我为宏提供超过 9 个参数,并且仍然允许在宏中换行?

答案1

我猜你需要一个检查请求项目数量的宏。这里默认值是 3,但它可以是任何正常请求的数量。

\documentclass{article}
\usepackage{xparse}
\usepackage{amsmath}

\ExplSyntaxOn
\NewDocumentCommand{\step}{O{3}mmmm}
 {
  #2 % source
  \mvp_step:nnn { #1 } { #4 } { #5 }
  #3 % target
 }

\seq_new:N \l__mvp_step_top_seq
\seq_new:N \l__mvp_step_bot_seq

\cs_new_protected:Nn \mvp_step:nnn
 {
  \seq_set_split:Nnn \l__mvp_step_top_seq { ; } { #2 }
  \seq_set_split:Nnn \l__mvp_step_bot_seq { ; } { #3 }
  \int_compare:nNnF { \seq_count:N \l__mvp_step_top_seq } = { #1 }
   {
    \msg_error:nnxxx { mvp } { step }
     { above }
     { \seq_count:N \l__mvp_step_top_seq }
     { #1 }
   }
  \int_compare:nNnF { \seq_count:N \l__mvp_step_bot_seq } = { #1 }
   {
    \msg_error:nnxxx { mvp } { step }
     { below }
     { \seq_count:N \l__mvp_step_bot_seq }
     { #1 }
   }
  \xrightarrow
   [\seq_use:Nn \l__mvp_step_bot_seq {;\,}]
   {\seq_use:Nn \l__mvp_step_top_seq {;\,}}
 }

\msg_new:nnnn { mvp } { step }
 {
  Bad ~ number ~ of ~ items
 }
 {
  You ~ have ~ #2 ~ items ~ #1 ~ the ~ arrow ~ instead ~ of ~ #3
 }
\ExplSyntaxOff

\begin{document}

$\step{A}{B}{a_1;b_1;c_1}{a_2;b_2;c_2}$

$\step[4]{A}{B}{a_1;b_1;c_1;d_1}{a_2;b_2;c_2;d_2}$

$\step[4]{A}{B}{a_1;b_1;c_1;d_1}{a_2;b_2;c_2}$ %%% error

\end{document}

这是控制台上的输出:

!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
!
! mvp error: "step"
! 
! Bad number of items
! 
! See the mvp documentation for further information.
! 
! For immediate help type H <return>.
!...............................................  

l.54 $\step[4]{A}{B}{a_1;b_1;c_1;d_1}{a_2;b_2;c_2}
                                                  $ %%% error
? h
|'''''''''''''''''''''''''''''''''''''''''''''''
| You have 3 items below the arrow instead of 4
|...............................................

enter image description here

相关内容