我想在表格环境中打印数字 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