为什么我必须在表格中重新定义“&”符号?

为什么我必须在表格中重新定义“&”符号?

我想在表格环境中打印数字 0、1、...、n-1。我的第一次尝试导致错误Incomplete \iffalse; all text was ignored after line 19.。通过&在构造中“隐藏”(&符号)解决了这个问题。但这看起来很丑陋。有没有一种很好的方法可以\whiledo{}{}在表格中使用编程?

这是我的代码:

\documentclass{article}
\usepackage{ifthen,calc}
\newcounter{x}
\newcommand{\ampersand}{\ifthenelse{0<1}{&}{}}
\newcommand{\numbers}[1]{\begin{tabular}{|c@{x=}|*{#1}{r|}}
\hline\setcounter{x}{0}
%
% my first attempt produces error:
%
\whiledo{\thex<#1}{&\thex\stepcounter{x}}\\
%
% no error if above line is replaced with:
%
% \whiledo{\thex<#1}{\ampersand\thex\stepcounter{x}}\\
%
\hline\end{tabular}}
\begin{document}\numbers{10}\end{document}

答案1

当 TeX 看到 时&,它会结束当前对齐单元;但您不能\whiledo在一个单元中启动进程并在另一个单元中结束它。\def\ampersand{&}您将解释延迟到宏扩展发生时;但实际上您很幸运。

我不会使用\whiledo;现在有更强大的工具。

\documentclass{article}

\ExplSyntaxOn

\NewDocumentCommand{\numbers}{O{0}m}
 {
  \ensuremath
   {
    \begin{array}
     {
      |c|
      *{ \int_eval:n { #2 + 1 - #1 } }{r|}
     }
    \hline
    x=
    \int_step_function:nnN { #1 } { #2 } \battha_print_number:n \\
    \hline
    \end{array}
   }
 }

\cs_new:Nn \battha_print_number:n { & #1 }

\ExplSyntaxOff

\begin{document}

\numbers{9}

\medskip

\numbers[1]{9}

\medskip

\numbers[2]{10}

\end{document}

在此处输入图片描述

TeX 将负责算术运算,因此您只需指定终点和(可选)起点(默认为 0)。

一个可能的改进是,如果结束数字是两位数,则使单元格具有相同的宽度。

\documentclass{article}
\usepackage{array}

\ExplSyntaxOn

\NewDocumentCommand{\numbers}{O{0}m}
 {
  \ensuremath
   {
    \int_compare:nTF { #2 > 9 }
     {
      \newcolumntype{B}{w{r}{1em}}
     }
     {
      \newcolumntype{B}{w{r}{0.5em}}
     }
    \begin{array}
     {
      |c|
      *{ \int_eval:n { #2 + 1 - #1 } }{B|}
     }
    \hline
    x=
    \int_step_function:nnN { #1 } { #2 } \battha_print_number:n \\
    \hline
    \end{array}
   }
 }

\cs_new:Nn \battha_print_number:n { & #1 }

\ExplSyntaxOff

\begin{document}

\numbers{9}

\medskip

\numbers[1]{9}

\medskip

\numbers[2]{10}

\end{document}

在此处输入图片描述

如果最终数字是一位数,则列类型B在本地定义为;否则。w{r}{0.5em}1em

相关内容