我有一张表,其中我必须对表中的每个条目执行相同的命令。例如:
\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
字符Mark
)Luke
。
代码:
\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
删除标题,使其不像表格条目那样格式化。