我有一张表,其条目是一个或多个数字的列表。现在,我需要将表中的所有数字增加 1。例如,我有一张表:
\documentclass{article}
\begin{document}
\begin{table}
\begin{tabular}{|l|l|l|}
\hline
1, 2, 4 & 2, 3, 4 & 5, 0, 1 \\ \hline
1, 2 & 3 & 2, 5, 7 \\ \hline
\end{tabular}
\end{table}
\end{document}
我希望第一行第一列的条目为2, 3, 5
,... 等等。我该怎么做?
更新
非常感谢@egreg以获得此快速解决方案。我只需要知道一件事:我怎样才能保持某些单元格原样。假设我的表格如下:
\documentclass{article}
\begin{document}
\begin{table}
\begin{tabular}{|l|l|l|}
\hline
1, 2, 4 & None & 5, 0, 1 \\ \hline
1, 2 & 3 & None \\ \hline
\end{tabular}
\end{table}
\end{document}
我可以保持None
完整吗?
答案1
就是这个!collcell
我们将单元格的内容传递给宏\increment
进行处理。
\documentclass{article}
\usepackage{xparse,collcell,booktabs}
\ExplSyntaxOn
\NewDocumentCommand{\increment}{m}
{
\pushpen_increment_cell:n { #1 }
}
\seq_new:N \l_pushpen_cell_seq
\seq_new:N \l_pushpen_cell_incr_seq
\cs_new_protected:Npn \pushpen_increment_cell:n #1
{
% split the cell contents into a sequence
\seq_set_split:Nnn \l_pushpen_cell_seq { , } { #1 }
% map the sequence into another incrementing each item
\seq_set_map:NNn \l_pushpen_cell_incr_seq \l_pushpen_cell_seq { \int_eval:n { ##1 + 1 } }
% produce the sequence, items are separated by “comma and space”
\seq_use:Nn \l_pushpen_cell_incr_seq { ,~ }
}
\ExplSyntaxOff
\newcommand{\None}{\multicolumn{1}{l}{None}}
\begin{document}
\begin{tabular}{ *{3}{>{\collectcell\increment}l<{\endcollectcell}} }
\toprule
1, 2, 4 & 2, 3, 4 & 5, 0, 1 \\
\midrule
1, 2 & 3 & 2, 5, 7 \\
\midrule
1, 2 & 3 & \None \\
\bottomrule
\end{tabular}
\end{document}
相同,但代码更加笨拙:
\documentclass{article}
\usepackage{etoolbox,collcell}
\newcounter{liststep}
\newrobustcmd\increment[1]{%
\setcounter{liststep}{0}%
\forcsvlist{\addone}{#1}%
}
\newcommand\addone[1]{%
\ifnum\value{liststep}>0 , \fi
\number\numexpr#1+1\relax
\stepcounter{liststep}%
}
\begin{document}
\begin{tabular}{| *{3}{>{\collectcell\increment}l<{\endcollectcell}|} }
\hline
1, 2, 4 & 2, 3, 4 & 5, 0, 1 \\ \hline
1, 2 & 3 & 2, 5, 7 \\ \hline
\end{tabular}
\end{document}