如何在每个表列上执行命令

如何在每个表列上执行命令

我有一张表,其中我必须对表中的每个条目执行相同的命令。例如:

\ibibleverse{Matthew}(1:1) & \ibibleverse{Mark}(1:1) & \ibibleverse{Luke}(1:1) \\
\ibibleverse{Matthew}(1:2) & \ibibleverse{Mark}(1:2) & \ibibleverse{Luke}(1:2) \\
\ibibleverse{Matthew}(1:3) & \ibibleverse{Mark}(1:3) & \ibibleverse{Luke}(1:3) \etc.

有没有办法可以让列中的每个条目自动执行命令\ibibleverse,以便我的表语法看起来像这样:

1:1 & 1:1 & 1:1 \\
1:2 & 1:2 & 1:2 \\
1:3 & 1:3 & 1:3 \

括号是\ibibleverse命令的一部分。完整命令如下所示\ibibleverse{Matthew}(1:1),并输出“Matthew 1:1”。

当然,表头不应该有命令\ibibleverse

这有意义吗? 不用手动重复\ibibleverse这么多次,有可能吗?

答案1

您可以使用包裹collcell收集每行的单元格并将适当的宏应用于列。下面我定义了W要应用\ibibleverse{Matthew}{#1}宏的列类型、K要应用的列类型\ibibleverse{Mark}{#1}以及E要应用的列类型\ibibleverse{Luke}{#1}(列名称基于 、 和 的最后一个Matthew字符MarkLuke

在此处输入图片描述

代码:

\documentclass{standalone}
\usepackage{collcell}

\newcommand{\ibibleverse}[2]{#1-#2}%

\newcommand{\Matthew}[1]{\ibibleverse{Matthew}{#1}}%
\newcommand{\Mark}[1]{\ibibleverse{Mark}{#1}}%
\newcommand{\Luke}[1]{\ibibleverse{Luke}{#1}}%

\newcommand{\MyCommand}[1]{\textcolor{red}{#1}}

\newcolumntype{W}{>{\collectcell\Matthew}{l}<{\endcollectcell}}
\newcolumntype{K}{>{\collectcell\Mark}{l}<{\endcollectcell}}
\newcolumntype{E}{>{\collectcell\Luke}{l}<{\endcollectcell}}

\begin{document}
\begin{tabular}{W  K  E}
1:1 & 1:1 & 1:1 \\
1:2 & 1:2 & 1:2 \\
1:3 & 1:3 & 1:3 \\
\end{tabular}
\end{document}

如果你想排除头部牵引,你可以使用来自表格标题行:如何忽略列类型?仅当您不在标题行中时才应用这些宏。

在此处输入图片描述

代码:

\documentclass{standalone}
\usepackage{collcell}
\usepackage{xcolor}%
\usepackage{etoolbox}

\newtoggle{inTableHeader}% Track if still in header of table
\toggletrue{inTableHeader}% Set initial value
\newcommand*{\StartTableHeader}{\global\toggletrue{inTableHeader}}%
\newcommand*{\EndTableHeader}{\global\togglefalse{inTableHeader}}%

% Redefine tabular to initialize \StartTableHeader at start and end
\let\OldTabular\tabular%
\let\OldEndTabular\endtabular%
\renewenvironment{tabular}{\StartTableHeader\OldTabular}{\OldEndTabular\StartTableHeader}%

\newcommand{\ibibleverse}[2]{#1-#2}%

\newcommand{\Matthew}[1]{\iftoggle{inTableHeader}{\textcolor{red}{#1}}{\ibibleverse{Matthew}{#1}}}%
\newcommand{\Mark}[1]{\iftoggle{inTableHeader}{\textcolor{blue}{#1}}{\ibibleverse{Mark}{#1}}}%
\newcommand{\Luke}[1]{\iftoggle{inTableHeader}{\textcolor{brown}{#1}}{\ibibleverse{Luke}{#1}}}%

\newcommand{\MyCommand}[1]{\textcolor{red}{#1}}

\newcolumntype{W}{>{\collectcell\Matthew}{c}<{\endcollectcell}}
\newcolumntype{K}{>{\collectcell\Mark}{c}<{\endcollectcell}}
\newcolumntype{E}{>{\collectcell\Luke}{c}<{\endcollectcell}}

\begin{document}
\begin{tabular}{W  K  E}
Mathew & Mark & Luke \EndTableHeader\\
1:1 & 1:1 & 1:1 \\
1:2 & 1:2 & 1:2 \\
1:3 & 1:3 & 1:3 \\
\end{tabular}
\end{document}

答案2

你也可以使用array

在此处输入图片描述

\documentclass{article}
\usepackage{array}
\newcommand{\ibibleverse}[1]{#1}
\newcolumntype{B}[1]{>{\ibibleverse{#1} (}c<{)}}

\begin{document}

\begin{table}
    \centering
        \begin{tabular}{B{Matthew}B{Mark}B{Luke}}
            1.1     &   1.1   &   1.1\\
            1.2     &   1.2   &   1.2\\
            1.3     &   1.3   &   1.3
        \end{tabular}
\end{table}
\end{document}

答案3

由于 的内容不需要格式化tabular,我只需将其装箱然后传递给\ibibleverse

在此处输入图片描述

\documentclass{article}
\usepackage{array}% http://ctan.org/pkg/array
\usepackage{booktabs}% http://ctan.org/pkg/booktabs

\def\ibibleverse#1(#2){#1\ #2}%

\newsavebox{\mybox}
\newcolumntype{V}[1]{>{\begin{lrbox}{\mybox}}l<{\end{lrbox}\ibibleverse{#1}(\usebox{\mybox})}}

\begin{document}
\begin{tabular}{V{Matthew} V{Mark} V{Luke}}
  \toprule
  \multicolumn{1}{c}{Matthew} & \multicolumn{1}{c}{Mark} & \multicolumn{1}{c}{Luke} \\
  \midrule
  1:1 & 1:1 & 1:1 \\
  1:2 & 1:2 & 1:2 \\
  1:3 & 1:3 & 1:3 \\
  \bottomrule
\end{tabular}
\end{document}

V{<book>}类型定义如下array's \newcolumntype,允许使用通用列类型,您可以在其中指定 Biblical <book>。此外,为了演示,booktabs提供规则。\multicolumn删除标题,使其不像表格条目那样格式化。

相关内容