使用 \loop 创建表格行内容的问题

使用 \loop 创建表格行内容的问题

我想创建一个表,其中列中的项目按字母顺序排列A,B,C,......,M,并且我想用循环插入它们,下面是一个例子

\documentclass{article}

\newcounter{countA}

\def\myline{}
\loop\ifnum\thecountA<12
  \stepcounter{countA}
  \expandafter\def\expandafter\myline\expandafter{%
    \myline
    \Alph{countA} &  
  }%
\repeat

\begin{document}

\centering 

\begin{tabular}{|*{13}{c|}}
\hline
A & B & C & D & E & F & G & H & I & G & K & L & M \\  
\hline
\end{tabular}

\bigskip

\begin{tabular}{|*{13}{c|}}
\hline
\myline M\\  
\hline
\end{tabular}

\end{document}

在此处输入图片描述

结果是表格中的所有单元格都包含相同的字母 L,我如何修复myline宏以获得与第一个表格相同的效果,或者是否有另一种方法可以在表格中创建这样的循环

答案1

问题是\myline没有展开。使用\edef代替\def并删除所有expandafters 可以解决这个问题。

\documentclass{article}

\newcounter{countA}

\def\myline{}
\loop\ifnum\thecountA<12
  \stepcounter{countA}
  \edef\myline{%
    \myline
    \Alph{countA} &  
  }%
\repeat

\begin{document}

\centering 

\begin{tabular}{|*{13}{c|}}
\hline
A & B & C & D & E & F & G & H & I & G & K & L & M \\  
\hline
\end{tabular}

\bigskip

\begin{tabular}{|*{13}{c|}}
\hline
\myline M\\  
\hline
\end{tabular}

\end{document}

答案2

\loop...\repeat这是一个不使用(递归)的示例:

\documentclass{article}

\newcounter{countA}
\def\myline{%
    \stepcounter{countA}\Alph{countA}&%
    \ifnum\thecountA<12%
    \myline
    \fi
}

\begin{document}
\centering 

\begin{tabular}{|*{13}{c|}}
\hline
A & B & C & D & E & F & G & H & I & G & K & L & M \\  
\hline
\end{tabular}

\bigskip

\begin{tabular}{|*{13}{c|}}
\hline
\myline M\\  
\hline
\end{tabular}

\end{document}

编辑:每次调用宏时都需要将计数器countA设置为0,因为每次调用时都会执行循环,\myline而不是将循环结果保存到中\myline。可以通过插入来解决这个问题\else\setcounter{countA}{0},但每次仍会执行循环。

EDIT2:允许类似于egreg的“更通用的方法”的东西,但使其更加通用:

\documentclass{article}

\newcounter{countA}
\newcommand{\myline}[2][0]{%
    \ifnum#1>0\setcounter{countA}{#1}\fi%
    \stepcounter{countA}\Alph{countA}&%
    \ifnum\numexpr#2-1>\value{countA}%
    \myline{#2}%
    \else%
    \stepcounter{countA}\Alph{countA}%
    \setcounter{countA}{0}%
    \fi%
}

\begin{document}
\centering 

\begin{tabular}{|*{13}{c|}}
\hline
A & B & C & D & E & F & G & H & I & G & K & L & M \\  
\hline
\end{tabular}

\bigskip

\begin{tabular}{|*{13}{c|}}
\hline
\myline{13}\\
\hline
\myline[13]{26}\\
\hline
\end{tabular}

\end{document}

结果

答案3

更通用的方法:

\documentclass{article}
\usepackage{etoolbox}

\newcounter{countA}
\newcommand{\alphline}[1]{%
  % I want #1 letters
  \setcounter{countA}{1}%
  \def\finalline{A}%
  \loop\ifnum#1>\value{countA}%
    \stepcounter{countA}%
    \xappto\finalline{& \Alph{countA}}%
  \repeat
  \finalline
}

\begin{document}

\begin{tabular}{|*{13}{c|}}
\hline
\alphline{13} \\
% for comparison
A & B & C & D & E & F & G & H & I & G & K & L & M \\
\hline
\end{tabular}

\end{document}

在此处输入图片描述

相同想法expl3(无需反驳)

\documentclass{article}
\usepackage{xparse}

\ExplSyntaxOn
\NewDocumentCommand{\alphline}{m}
 {
  \tl_set:Nn \l_tmpa_tl { A }
  \int_step_inline:nnnn { 2 } { 1 } { #1 }
   {
    \tl_put_right:Nn \l_tmpa_tl { & \int_to_Alph:n { ##1 } }
   }
  \tl_use:N \l_tmpa_tl
 }
\ExplSyntaxOff

\begin{document}

\begin{tabular}{|*{13}{c|}}
\hline
\alphline{13} \\
% for comparison
A & B & C & D & E & F & G & H & I & G & K & L & M \\
\hline
\end{tabular}

\end{document}

相关内容