![\whileboolexpr 命令在表中生成一个额外的行](https://linux22.com/image/386132/%5Cwhileboolexpr%20%E5%91%BD%E4%BB%A4%E5%9C%A8%E8%A1%A8%E4%B8%AD%E7%94%9F%E6%88%90%E4%B8%80%E4%B8%AA%E9%A2%9D%E5%A4%96%E7%9A%84%E8%A1%8C.png)
我使用包\whileboolexpr
中的命令etoolbox
生成了一个表。但是有一个多余的不需要的行。以下代码有什么问题?
\documentclass[12pt]{article}
\usepackage{etoolbox}
\begin{document}
\newcounter{row}
\newcounter{rowcount}
\newcommand{\myand}{&}
\newcommand{\mylines}{%
\setcounter{rowcount}{0}%
\whileboolexpr{
test{\ifnumless{\value{rowcount}}{\value{row}}}
}{%
\stepcounter{rowcount}%
Number \myand 1 \myand 2 \myand 3 \\ \hline
}%
}
\newcommand{\mytable}[1]{
\setcounter{row}{#1}%
\begin{tabular}{|c|*{3}{c|}}
\hline
\mylines
\end{tabular}%
}
\mytable{4}
\end{document}
答案1
正如 egreg 所说,LaTeX 在意识到表格已完成之前就开始了下一个单元格。我意识到你的实际应用程序更复杂,但实现 MWE 的一个真正有效的方法是\prg_replicate:nn
使用LaTeX3生产:
代码如下:
\documentclass{article}
\usepackage{expl3}
\ExplSyntaxOn
\newcommand\mytable[1]{%
\begin{tabular}{|c|*{3}{c|}}\hline
\prg_replicate:nn {#1} {Number &1&2&3\\\hline}
\end{tabular}%
}
\ExplSyntaxOff
\begin{document}
\mytable{4}
\end{document}
编辑
鉴于以下评论,这里有一个更通用的方法,可能更接近所需的方法。它产生
从输入
\mytable{
{\one &1&2&3},
{\two &4&6},
{\three&1},
{\four &1&2&2}
}
其中\one
,,\two
...是一些随机宏。
该\mytable
宏接受以逗号分隔的表格行列表。默认情况下,表格有四列,但可以使用可选参数进行更改,例如,\mytable[6]{...}
给出一个有六列的表格。这里有一个明显的问题,即“悬空” \hlines
。这很容易修复,但由于 OP 没有详细说明实际需要什么,因此如果没有更多信息,就很难做到这一点。出于在书签手动我会删除垂直规则并使用\toprule
和\bottomrule
作为顶部和底部规则,这将解决这个问题并产生:
代码如下:
\documentclass{article}
\usepackage{expl3}
\usepackage{booktabs}
\ExplSyntaxOn
\clist_new:N \l_table_clist
\newcommand\mytable[2][4]{
\clist_set:Nn \l_table_clist {#2}
\begin{tabular}{*{#1}{c}}\toprule
\clist_use:Nn \l_table_clist {\\\hline}
\\\bottomrule
\end{tabular}%
}
\ExplSyntaxOff
\begin{document}
\newcommand\one{One}
\newcommand\two{Two}
\newcommand\three{Three}
\newcommand\four{Four}
\mytable{
{\one&1&2&3},
{\two& 4&6},
{\three& 1},
{\four&1&2&2}
}
\end{document}
答案2
答案3
您可以生成行代码外部的tabular
:
\documentclass{article}
\usepackage{etoolbox}
\begin{document}
\newcounter{row}
\newcommand{\myand}{&}
\makeatletter
\newcommand{\mylines}[1]{%
\setcounter{row}{#1}%
\def\@mylines{}%
\whileboolexpr{%
test{\ifnumless{0}{\value{row}}}%
}{%
\addtocounter{row}{-1}%
\xdef\@mylines{\@mylines \hline
Number \myand 1 \myand 2 \myand 3 \\
}%
}%
}
\newcommand{\mytable}[1]{%
{\let\hline\relax % Avoid expansion of \hline in \xdef
\let\\\relax % Avoid expansion of \\ in \xdef
\mylines{#1}}% This generates \@mylines
\begin{tabular}{ | c | *{3}{c|} }
\@mylines \hline % Print \@mylines
\end{tabular}%
}
\makeatother
\mytable{4}
\end{document}