我可以部分重复使用表格或者在章节中构建它吗?

我可以部分重复使用表格或者在章节中构建它吗?

在我的论文中,我想在整章中建立一张表格。具体来说,我要展示不同数据集的统计数据,其中包括我自己创建的用于解决现有数据中问题的数据集。

理想情况下,我会编写一次表格+表格代码,然后在需要重复表格的任何地方引用该代码,仅显示或隐藏表格的不同部分。

所以我可能会写:

   \begin{table}
     \caption{Sample Table}
     \label{tab:sample-table}
     \begin{tabular}{lr}
       dataset & some numbers\\
       \hline
       A & 10\\
       B & 11\\
       C & 12\\
       \hline
       D & 48\\
       E & 144\\
     \end{tabular}
   \end{table}

然后在一个地方使用一些命令,例如:

   \inserttable[1-4]{tab:sample-table}

插入标题和行 AC,并在另一个位置写入:

   \inserttable{tab:sample-table}

以便插入整个表格。

是否有任何包或宏集可以执行此操作,或者我是否必须在每个想要引用它的地方重复该表?

我的表比这个要大得多,也复杂得多,我担心的是,如果我必须更新某些值,我可能会在一个地方更新它们,而如果我必须重复代码,我可能会忘记其他值。

答案1

以下是实现此目的的一种方法。首先定义整个表的条目:

\newcommand*{\MyTabularEntries}{%
   Row & dataset & some numbers \\,
   \unexpanded{\cmidrule(r){1-1}\cmidrule(lr){2-2}\cmidrule(l){3-3}},
   3 & A & 10 \\,
   4 & B & 11 \\,
   5 & C & 12 \\,
   \unexpanded{\cmidrule{1-3}},
   7 & D & 48 \\,
   8 & E & 144 \\,
}%

然后通过调用以下代码构建仅包含干燥行的表:

\InsertTable[<csv list of rows>]{<title>}{\MyTabularEntries}

在此处输入图片描述

笔记:

  • 我添加了行号,以便更容易看到此解决方案是否正常工作。标题和cmidrule已计数。
  • 我也使用了这个booktabs包,因为它可以生成更好的表格。

参考

代码:

\documentclass{article}
\usepackage{etoolbox}
\usepackage{booktabs}
\usepackage{xparse}
\usepackage{tikz}

\newcommand*{\MyTempTableTokens}{}%
\makeatletter
    \newtoks\@tabtoks
    %%% assignments to \@tabtoks must be global, because they are done in \foreach
    \newcommand\AddTableTokens[1]{\global\@tabtoks\expandafter{\the\@tabtoks#1}}
    \newcommand\eAddTableTokens[1]{%
      \protected@edef\MyTempTableTokens{#1}%
      \expandafter\AddTableTokens\expandafter{\MyTempTableTokens}%
    }
    %%% variable should always be operated on always locally or always globally
    \newcommand*\ResetTableTokens{\global\@tabtoks{}}
    \newcommand*\PrintTableTokens{\the\@tabtoks}

%% \processlist is based on a contribution by Hood Chatham
\newcount\tempcount
\newcommand*{\MacroToExecute}{}%
\def\processlist#1#2{\def\MacroToExecute{#1}\processlist@#2,\@nil}
\def\processlist@#1,{%
    \in@-{#1}%
    \ifin@
        \processrange#1\@nil
    \else
        \MacroToExecute{Row #1}{}%
    \fi
    \@ifnextchar\@nil{\@gobble}{\processlist@}%
}

\def\processrange#1-#2\@nil{%
    \tempcount=#1\relax
    \loop
        \MacroToExecute{Row \the\tempcount}{}%
        \advance\tempcount1\relax
    \unless\ifnum\tempcount>#2\repeat
}
\makeatother

\newcommand*{\MyTabularEntries}{%
       Row & dataset & some numbers \\,
       \unexpanded{\cmidrule(r){1-1}\cmidrule(lr){2-2}\cmidrule(l){3-3}},
       3 & A & 10 \\,
       4 & B & 11 \\,
       5 & C & 12 \\,
       \unexpanded{\cmidrule{1-3}},
       7 & D & 48 \\,
       8 & E & 144 \\,
}%

\newcounter{RowNumber}
\NewDocumentCommand{\InsertTable}{%
    O{1-10}% #1 = range of lines to print, defaults to all lines from 1-99
    m%           #2 = table title
    m%           #3 = list of entries (terminated by comma).
}{%
    \processlist{\csdef}{#1}%
    \ResetTableTokens%
    \setcounter{RowNumber}{0}%
    \foreach \Entry in #3 {%
        \stepcounter{RowNumber}%
        \ifcsdef{Row \arabic{RowNumber}}{%
            \eAddTableTokens{\Entry}%
        }{%
            %% This row number was not requested so skip it
        }%
    }%
    \begin{tabular}{lll}
        \toprule
        \multicolumn{3}{c}{#2} \\
        \PrintTableTokens
        \bottomrule
    \end{tabular}%
    %  Clear the desired rows list
    \processlist{\csundef}{#1}%
}

\begin{document}

    \InsertTable{All Rows}{\MyTabularEntries}%

    \par\medskip
    \InsertTable[1-5]{Rows 1-5}{\MyTabularEntries}%

    \par\medskip
    \InsertTable[1,2,4,6-10]{Rows 1,2,4,6-10}{\MyTabularEntries}%
\end{document}

答案2

这不是一个完整的答案,因为我认为 Peter Grill 的答案非常好。我只是在这里提供一个宏来处理单个行和范围的列表,以便与 Peter 的代码一起使用。

\newcount\tempcount
\def\processlist#1{\processlist@#1,\@nil}
\def\processlist@#1,{%
    \in@-{#1}%
    \ifin@
        \processrange#1\@nil
    \else
        \csgdef{Row #1}{}%
    \fi
    \@ifnextchar\@nil{\@gobble}{\processlist@}%
}

\def\processrange#1-#2\@nil{%
    \tempcount=#1\relax
    \loop
        \csgdef{Row \the\tempcount}{}%
        \advance\tempcount1\relax
    \unless\ifnum\tempcount>#2\repeat
}

相关内容