如何将宏应用于表格的每一列

如何将宏应用于表格的每一列

我想将一个宏应用于某一列的所有单元格,并将单元格内容作为宏的输入。这可能吗?

例如,如果单元格内容包含单词 TEST,则宏应该将 TEST 作为其参数。

答案1

它应该很简单:

\def\mymacro#1{\lowercase{#1}}
\halign{&\mymacro{#}\cr
HELLO&WORLD\cr
TEST&123\cr}
\bye

例如,对于 Yiannis 的注释,将宏仅应用于第一列,将前言 ( &\mymacro{#}\cr) 更改为\mymacro{#}&&#\hfil\cr。开头的 & 符号告诉 TeX 重复每一列的定义,而&&定义应重复以下列的定义。

当然,你不需要需要如果你不想的话,可以重复任何事情。

答案2

您可以使用相对较新的collcell包用于收集单元格内容并将其提供给您选择的宏。它使用该array包在每个单元格之前和之后放置代码。

\documentclass{article}
\usepackage{collcell}
\usepackage{array}% actually already loaded by `collcell`
\newcommand*{\mymacro}[1]{\fbox{#1}}% Do anything you like with `#1`
\newcolumntype{C}{>{\collectcell\mymacro}c<{\endcollectcell}}

\begin{document}

\begin{tabular}{CC}
  TestA  & A longer test cell \\
  \empty & The new version supports 'verb'! \\
\end{tabular}

\end{document}

请确保您使用的是包含大量改进的版本 2011/02/27(或更高版本)。

也可以按照以下方式进行操作,这种方式编译速度比 快,collcell但在每行的最后一个单元格中不起作用。它会读取内部使用的宏\ignorespaces和之间的所有内容\unskip。我从Ulrike Fischer 在 de.ctt 上不久以前。

\documentclass{article}
\usepackage{array}
\newcommand*{\mymacro}[1]{\fbox{#1}}

\def\simplecollect#1#2\ignorespaces#3\unskip{#1{#3}\unskip}
\newcolumntype{S}{>{\simplecollect\mymacro}c}

\begin{document}

\begin{tabular}{Sc}
  TestA  & Doesn't work in the last cell \\
  \empty & Sorry!  \\
\end{tabular}

\end{document}

答案3

您可以通过使用array包并定义一个来做到这一点\newcolumntype

例如,我们可以定义一个宏\test,它将一个参数作为其参数并将其大写。

\def\test#1 {\uppercase{#1}}

然后我们可以定义一个新的列类型为:

\newcolumntype{D}{>{\test}l<{.}}

我们的最小示例是:

\documentclass{article}
\usepackage{array}
\begin{document}
  \def\test#1 {\uppercase{#1}}
  \newcolumntype{D}{>{\test}l<{.}}
  \begin{tabular}{DD}
    test &test \\
    other &test \\
  \end{tabular}
\end{document}

请注意,这种方法涉及分隔宏,在这种情况下,表中单词后面的空格用于告诉命令它只能读取到那里,并且如果单词超过一个,则显然会失败,正如 Martin 指出的那样。可以使用其他类型的分隔符,例如 a.或 a !

答案4

也许类似于@Martin 的答案,您可以使用环境将单元格内容装箱lrbox,然后将装箱的内容提供给您的宏:

在此处输入图片描述

\documentclass{article}
\usepackage{array}% http://ctan.org/pkg/array
\begin{document}
\newsavebox{\mybox}
\begin{tabular}{c>{\begin{lrbox}{\mybox}}c<{\end{lrbox}\fbox{\usebox\mybox}}c}
  One & Two & Three \\ \hline
  1 & 2 & 3 \\
  4 & 5 & 6 \\
  7 & 8 & 9 \\ \hline
\end{tabular}
\end{document}

array包裹提供在特定列之前>{...}和之后插入内容的方法。在本例中,环境开始和结束,以及生成的宏应用程序,用于在装箱后排版单元格内容。<{...}lrbox

限制主要依赖于环境所能容纳的内容lrbox

相关内容