我想创建一个表,其中列中的项目按字母顺序排列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
并删除所有expandafter
s 可以解决这个问题。
\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}