我正在为一个文档编写一个类,该类将许多简单段落格式化为表格。我知道,所有表格都有固定的列数,但行数可变。我想要做的是编写一个宏,如果发出一次,则创建一个单行表,如果发出 n 次,则创建一个 n 行表。我对一个通用解决方案感兴趣,它允许在宏的第一个实例之前和最后一个(但不在中间)重复调用同一个宏之后插入任何代码。以下是我想要实现的输出的一个最小示例:
\documentclass[a4paper]{scrarticle}
\usepackage{tabularx}
\begin{document}
One row example:
\begin{tabular}{|c|c|}
\hline
Some & Text\\
\hline
\end{tabular}
Two row example:
\begin{tabular}{|c|c|}
\hline
Some & Text\\
\hline
Other & Line\\
\hline
\end{tabular}
\end{document}
我想要一个命令,让我只写表格行,其他的都会自动添加。因此,使用一个假设的命令,autotable
上面的示例将如下所示:
[...]
\begin{document}
One row example:
\autotable{Some}{Text}
Two row example:
\autotable{Some}{Text}
\autotable{Other}{Line}
\end{document}
简洁的答案解释为什么这是不可能的(如果是这样)也会很有帮助,因为如果需要,我可以使用 python/jinja 来实现类似的功能。并非完全不相关的问题:提前查看标记流?,宏:根据模式进行不同扩展?
编辑
这是从 David 接受的解决方案中获取的代码,并添加了以下内容,\hlines
因此创建的输出与初始最小示例的精确输出相匹配:
\documentclass[a4paper]{scrarticle}
\makeatletter
\def\autotable{\par\begin{tabular}{|c|c|}
\hline
\autotable@row}
\def\autotable@row#1#2{%
#1
\@ifnextchar\autotable\autotable@gobble{\\\hline\end{tabular}\par}}
\def\autotable@gobble#1{\\\hline\autotable@row}
\makeatother
\begin{document}
One row example:
\autotable{Some}{Text}
Two row example:
\autotable{Some}{Text}
\autotable{Other}{Line}
\end{document}
答案1
您可以使用\@ifnextchar
向前看,跳过行尾的空白
\documentclass[a4paper]{scrarticle}
\makeatletter
\def\autotable{\par\begin{tabular}{|c|c|}\autotable@row}
\def\autotable@row#1#2{%
#1%
\@ifnextchar\autotable\autotable@gobble{\end{tabular}\par}}
\def\autotable@gobble#1{\\\autotable@row}
\makeatother
\begin{document}
One row example:
\autotable{Some}{Text}
Two row example:
\autotable{Some}{Text}
\autotable{Other}{Line}
\end{document}