我想创建一个包含一些元组(sectionname、property)的列表,以便我可以自动将它们添加到表中。
假设我有:
\magictablecommand
\section{Test}
\property{Blup}
\section{Plop}
\property{Slup}
然后 magictablecommand 应该扩展为:
\begin{table}...
\begin{tabular}...
Test & Blup \\
Plop & Slup \\
我需要一些命令,这些命令在第一次传递时收集部分、属性对。在第二次传递时扩展 magictablecommand(在第一次传递时它不会扩展,只要它不发出错误,我真的不在乎。)。
我遇到的最大麻烦是确定如何收集部分、属性对。其余的我大概可以弄清楚。
如果有某种指针我会很高兴的。
答案1
解决方案
这是一个提供您想要的功能的解决方案。只需稍加调整,您就可以根据自己的最终需求进行微调。
\documentclass{article}
\def\magictablecommandopen{%
% Keep the new sections locals and redefine section
\begingroup\let\actualsection\section
\renewcommand{\section}[1]{\actualsection{##1}\def\sectionname{##1}}
% Create output table
\newwrite\tupletable
\immediate\openout\tupletable=\jobname.tpl
\immediate\write\tupletable{\unexpanded{\begin{tabular}{cc}}}
}
\def\magictablecommandclose{%
% Simply close the table, output stream and group
\immediate\write\tupletable{\unexpanded{\end{tabular}}}
\immediate\closeout\tupletable
\endgroup}
\def\property#1{\immediate\write\tupletable{\sectionname\unexpanded{\\}}}
\begin{document}
\section{This Section Will not be in Table}
% We start table creation here
\magictablecommandopen
\section{Test}
\property{Blup}
\section{Plop}
\property{Slup}
\magictablecommandclose
% These sections will not be included in the table
\section{Not in Table}
Use your table.
\IfFileExists{\jobname.tpl}{
\begin{table}[!tbp]
\centering
\input \jobname.tpl
\caption{My Tuples.}
\label{tab:tpl}
\end{table}}
\end{document}
怎么运行的?
- 实际上,我们在这里定义了两个神奇的命令。一个
\magictablecommandopen
启动你的表格。 一个\magictablecommandclose
完成你的表格。因此,出现在表格之前\magictablecommandopen
或之后的 文本或部分\magictablecommandclose
将不会被考虑在元组表格中。(再做一些工作,我们甚至可以考虑多次打开和关闭表格收集环境。) \magictablecommandopen
首先重新定义\section
命令,以便部分名称可以保存在某处(\sectionname
)。这在组内完成,以保持更改本地化。然后它打开输出流并写入表格启动命令。\magictablecommandclose
写入表格关闭命令,关闭输出流和组。\property
相当简单。它只是在表中写入一行。这里的技巧是使用部分开始时先前保存的部分名称。- 最终,您将获得一个
\jobname.tpl
可以在任何地方使用的文件。
答案2
接受的答案非常好,但由于这涉及到部分,因此也可以使用埃托克。这当然有点特殊,但如果有一个优点的话,那就是不需要创建包含标记部分的组,也不需要额外的辅助文件。
另一种方法是埃托克会以在标准目录中不可见但在命令中可见的方式将属性信息添加到节名称中。但在这里,我们定义了一个新的虚拟节,名为,property
并使用包提供的工具对其进行了操作。不过,有一些微妙之处,代码注释中对此进行了解释。
\documentclass{article}
\usepackage{etoc}
\etocsetlevel{property}{6}
\newcommand\property [1]{\etoctoccontentsline{property}{#1}}
\begin{document}\thispagestyle{empty}
\tableofcontents
\etocdepthtag.toc {notintable}
\section{This Section will not be in Magic Table}
first section
\etocdepthtag.toc {magictable}
\section{Test}
\property{Blup}
second section
\section{Plop}
\property{Slup}
third section
% These sections will not be included in the table
\etocdepthtag.toc {notintable}
\section{Not in Magic Table}
fourth section
Use your table.
\begingroup % this group is only if one needs a standard TOC after the magic
% table
\etocsettocstyle{\begin{table}[!tbp]
\centering
% we can not start the tabular here, else
% some macros defined later by etoc will
% get lost at the end
% of the first cell, which closes a group
}
{\caption{Magic Table of my Tuples.}
\label{tab:tpl}
\end{table}}
\etocsetstyle{section}{\begin{tabular}{cc}}{\etocname}{&}{\end{tabular}}
\etocsetlevel{property}{2}% must use numeric level here and we can not set it at
% the same level 1 as section, else \etocsetstyle
% below would also modify the style for sections
% we can not do something like &\etocname, because the & closes a group
% and \etocname then loses its meaning; this is why the & is in the section
% style.
\etocsetstyle{property}{}{\etocname}{}{\\}
% in case there are other sectioning levels we don't want to see them in this
% special TOC
\etocsetlevel{subsection}{6}
\etocsetlevel{subsubsection}{6}
% Material not tagged with magictable has no place here
\etocsettagdepth {notintable}{none}
\etocsettagdepth {magictable}{property} % (or the numeric level 2)
\tableofcontents
\endgroup
\end{document}