我想将一个宏应用于某一列的所有单元格,并将单元格内容作为宏的输入。这可能吗?
例如,如果单元格内容包含单词 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
。