条件命令(取决于参数)

条件命令(取决于参数)

我有以下命令:

\def\tabfive{%
    \renewcommand{\arraystretch}{1.1}
    \begin{tabular}{p{0.18\linewidth}p{0.18\linewidth}p{0.18\linewidth}p{0.18\linewidth}p{0.18\linewidth}}
    \fiveoptions
    }
\def\tabfour{%
    \renewcommand{\arraystretch}{1.1}
    \begin{tabular}{p{0.23\linewidth}p{0.23\linewidth}p{0.23\linewidth}p{0.23\linewidth}}
    \fouroptions
    }
\def\tabend{\end{tabular}}

\def\fouroptions #1&#2&#3&#4\\ { a) #1&b) #2&c) #3&d) #4~}
\def\fiveoptions #1&#2&#3&#4&#5\\ { a) #1&b) #2&c) #3&d) #4&e) #5~}

用法是:

\tabfour
    10 &
    12 &
    15 &
    20\\
\tabend


\tabfive
    10 &
    12 &
    15 &
    18 &
    20\\
\tabend

有没有办法将这两个命令合并到名为的命令中\mytab,然后 LaTeX 根据备选方案的数量选择正确的命令?

答案1

如果你想保持你的语法,那么就像

\newcounter{answers}
\renewcommand\theanswers{\alph{answers}}
\def\tabendi{\tabend}
\def\tabgen#1\\ \tabend{\setcounter{answers}{0}\noindent\tabgeni#1& & \tabend& }
\def\tabgeni#1& {%
  \def\tempa{#1}%
  \ifx\tempa\tabendi
    \tabend
  \else
    \if\relax\detokenize{#1}\relax
    \else
      \makebox[.18\linewidth][l]{\stepcounter{answers}\theanswers)~#1}\hfill
    \fi
  \expandafter\tabgeni
  \fi
}
\def\tabend{\par}
\let\tabfour\tabgen
\let\tabfive\tabgen

\tabgen
    10 &
    12 &
    15 &
    20\\
\tabend

\tabgen
    10 &
    12 &
    15 &
    18 &
    20\\
\tabend

由于有 to 语句,旧语法仍可继续起作用\let

然而,不同的方法可能更方便,输入也更自由:

\usepackage{xparse}

\newcounter{answers}
\renewcommand\theanswers{\alph{answers}}
\ExplSyntaxOn
\NewDocumentCommand{\results}{m}
 {
  \seq_set_split:Nnn \l_results_a_seq {,}{#1}
  \par\nobreak\noindent\setcounter{answers}{0}
  \seq_map_inline:Nn \l_results_a_seq
   {
    \makebox[.18\linewidth][l]{\stepcounter{answers}\theanswers)~##1}\hfill
   }
   \par
 }
\seq_new:N \l_results_a_seq
\ExplSyntaxOff

然后你可以输入你的结果

\results{  
  10,  
  12,
  15,
  20
}

\results{
  10,
  12,
  15,
  18,
  20
}

这将产生

在此处输入图片描述

答案2

通过重新考虑使用方式tabular并使用内联列表,您可以拥有可变数量的项目。

\documentclass{article}
\makeatletter
\newcounter{inline}
\def\inlinelist#1{%
 \setcounter{inline}{0}%
 \@for\next:=#1\do{%
   \stepcounter{inline}%
   \alph{inline})\thinspace\next\space}
}
\makeatother
\begin{document}
\inlinelist{one,two,three,four,five, six}

\inlinelist{one,two,three}
\end{document}

在此处输入图片描述

这是一个更短的解决方案,更灵活并且更少输入。

答案3

您可以定义带星号和不带星号的宏,以便\mytabs使用\tabfour\mytabs*使用\tabfive。一个很好的参考是定义带星号的命令版本(* 宏)

不过,我建议您使用enumitem包中的内联列表功能:

在此处输入图片描述

\documentclass{article}
\usepackage[inline]{enumitem}
\begin{document}
\begin{enumerate*}[label=\alph*), itemjoin={\hspace*{5.0ex}}]
  \item 10
  \item 12
  \item 15
\end{enumerate*}

\begin{enumerate*}[label=\alph*), itemjoin={\hspace*{5.0ex}}]
  \item 10
  \item 12
  \item 15
  \item 18
  \item 20
\end{enumerate*}
\end{document}

相关内容