我正在尝试为数学模式和具有预定义对齐方式的固定宽度段落列定义常见的列类型。
代码如下:
\documentclass{article}
\usepackage{array}
\newcolumntype{C}[1]{>{\centering\arraybackslash}p{#1}}
\newcolumntype{L}[1]{>{\raggedright\arraybackslash}p{#1}}
\newcolumntype{R}[1]{>{\raggedleft\arraybackslash}p{#1}}
%
\newcolumntype{m}[1]{>{$}#1<{$}}
\newcolumntype{M}[2]{>{$}#1{#2}<{$}}
\begin{document}
\begin{tabular}{| mc | MC{3em} |}
x^2 & x^2
\end{tabular}
\end{document}
最后两种列类型出现了问题,它们应该允许我在任何其他默认列类型上切换数学模式。因此mc
将其c
作为参数,并使用>{$}
和将其切换到数学模式<{$}
。
mc
这对于(尝试删除第二列)很有效,但对于 则无效MC
。机制应该相同,但现在我接受两个参数,第二个参数是段落宽度,然后将其传递给C
或L
(顺便说一下,R
或原始的)。p
但是,上面的代码给出了我无法理解的错误消息。如果我用括号括起来C
,L
或者R
用括号括起来,它就会正常工作,就像这样M{C}{3em}
。这让我很惊讶,因为我以为规则就像 TeX 宏的参数一样,IE由于C
是单个标记,因此应将其作为第一个参数抓取。mc
事实证明,这对 有效,因此惊喜更大。
编辑:它也适用于p
列,IE将其写Mp{3em}
为列说明符可以按预期工作,因此问题与两个自定义列说明符的嵌套有关。
那么为什么它不能像我预期的那样工作呢?它能通过某种方式修复吗?除了使用括号的解决方法之外。
PS我知道很多软件包都提供了类似的功能(例如 mdwtab
),但我尝试自己让它发挥作用。
答案1
覆盖可能不是一个好主意,m
但这不是错误的原因。array
包列类型“手动”扩展为底层数组包列,扩展顺序与 TeX 宏扩展的顺序不完全相同。您的序言实际上扩展为
| >{$}c<{$} | >{$}>{\centering \arraybackslash }<{$}p{3em} |
您可以看到<{$}
插入得太早,导致了给出的错误。
如果您以不同的顺序声明列:
\newcolumntype{M}[2]{>{$}#1{#2}<{$}}
\newcolumntype{C}[1]{>{\centering\arraybackslash}p{#1}}
\newcolumntype{L}[1]{>{\raggedright\arraybackslash}p{#1}}
\newcolumntype{R}[1]{>{\raggedleft\arraybackslash}p{#1}}
%
\newcolumntype{m}[1]{>{$}#1<{$}}
然后序言扩展为
| >{$}c<{$} | >{$}>{\centering \arraybackslash }p{3em}<{$} |
如预期。