TableForm
with TableHeadings
option is a quick and easy way to display good-looking classical table in Mathematica FrontEnd. The only problem is that it is common to display such a table with headings aligned to the left but the content of the table aligned to the right. Is it possible to force TableForm
to behave in this way? Or if not, what is the best way to make an analog of TableForm
that behaves in this way?
可以将文章内容翻译成中文,广告屏蔽插件可能会导致该功能失效(如失效,请关闭广告屏蔽插件后再试):
问题:
回答1:
You can use Grid
and Alignment
. Here is one way:
a = Map[Mod[RandomInteger[2*^9], 10^#] &, RandomInteger[{1, 6}, {4, 7}], {2}];
b = Item[#, Alignment -> Left] & /@
{"One", "Two", "Three", "Four", "Five", "Six", "Seven"};
Grid[a~Prepend~b, Alignment -> Right]
Here is another:
headings = {"One", "Two", "Three", "Four", "Five", "Six", "Seven"};
Grid[a ~Prepend~ headings,
Dividers -> {None, {2 -> True}},
Alignment -> {Right, Automatic, {{1, 1}, {1, -1}} -> Left}
]
回答2:
It appears that one way to do this is:
RawBoxes[ToBoxes[
TableForm[RandomReal[{-10, 10}, {3, 3}],
TableHeadings -> {{"First left header", "Second left header",
"Trird left header"}, {"First top header", "Second top header",
"Third top header"}}]] /. (ColumnAlignments -> _) ->
ColumnAlignments -> {Left, Right}]
One can make such behavior permanent using Villegas-Gayley trick:
Unprotect[TableForm];
TableForm[args___] /; ! TrueQ@$inTableForm :=
Block[{$inTableForm = True},
RawBoxes[ToBoxes[TableForm[args]] /. (ColumnAlignments -> _) ->
ColumnAlignments -> {Left, Right}]]
Protect[TableForm];
Now
TableForm[RandomReal[{-10, 10}, {3, 3}],
TableHeadings -> {{"First left header", "Second left header",
"Third left header"}, {"First top header", "Second top header",
"Third top header"}}]
gives:
Another way is to define alternative function myTableForm
:
myTableForm[args___] :=
RawBoxes[ToBoxes[TableForm[args]] /. (ColumnAlignments -> _) ->
ColumnAlignments -> {Left, {Right}}]
回答3:
You can get far more control using Grid or GridBox if TableForm doesn't do what you like.