例如,我想创建一个宏来绘制单元格中有字母的表格。首先,我创建一个宏来接收一个表格式数据参数,称为\tableau
,在其中我创建了一个\halign
环境来解析数据并将其变成一个单元格矩阵,在每个单元格中,我使用一个\tableaucell
宏来绘制单元格。我注意到默认情况下在单元格之间创建一些空间,包括垂直和水平空间。我设法通过将\halign
设置为来消除垂直空间,但无法找到消除水平空间的方法。这里有一个简单的代码来演示我的想法。\lineskip
0pt
\documentclass{article}
\usepackage{tikz}
\newcommand\tableau[1]{
\let\\=\cr
\lineskip=0pt
\halign{&\tableaucell{##}\cr#1\cr}
}
\newcommand\tableaucell[1]{
\begin{tikzpicture}
\node at (.5,.5) {\smash{$#1$}};
\draw (0,0)--(0,1)--(1,1)--(1,0)--(0,0);
\end{tikzpicture}
}
\begin{document}
\tableau{a & b \\ c & d & g}
\end{document}
结果如下:
可以看到单元格之间有水平间距,垂直间距也没有真正消除。有没有更好的解决方案?最重要的是宏必须能够以表格形式的数据作为参数。
答案1
定义中的虚假空格和tikz:双线发生移动,后者在您的原始代码中使用overlay
-use as bounding box
组合解决,而在我的提议中使用负行和列分隔符解决。
代码
\documentclass{article}
\usepackage{tikz}
\usetikzlibrary{matrix}
\newcommand\tableau[1]{%
\let\\=\cr
\lineskip=0pt
\halign{&\tableaucell{##}\cr#1\cr}}
\newcommand\tableaucell[1]{%
\begin{tikzpicture}
\node[font=\mathstrut, minimum size=+1cm, minimum height=+1cm,
draw, overlay] at (.5,.5) {$#1$};
\path[use as bounding box] (0,0) rectangle (1,1);
\end{tikzpicture}}
\newcommand\tableauTikz{%
\tikz\matrix[
matrix of math nodes,
inner sep=+0pt,
nodes={draw,minimum size=+1cm, minimum height=+1cm, font=\mathstrut},
row sep=+-1\pgflinewidth,
column sep=+-1\pgflinewidth]}
\begin{document}
\tableau{a & b \\ c & d & g}
\bigskip
\noindent
\tableauTikz{a & b \\ c & d & g \\};
% otherwise catcode problems (see ampersand replacement option)
\end{document}
答案2
需要选择精确的值,但快速尝试删除水平空格的方法如下:
\documentclass{article}
\usepackage{tikz}
\tabskip-7pt % this line added
\newcommand\tableau[1]{
\let\\=\cr
\lineskip=0pt
\halign{&\tableaucell{##}\cr#1\cr}
}
\newcommand\tableaucell[1]{
\begin{tikzpicture}
\node at (.5,.5) {\smash{$#1$}};
\draw (0,0)--(0,1)--(1,1)--(1,0)--(0,0);
\end{tikzpicture}
}
\begin{document}
\tableau{a & b \\ c & d & g}
\end{document}
答案3
tikzpicture
水平空格来自定义中环境前后的空格\tableaucell
。垂直空格可以用 消除\offinterlineskip
。粗线(两条线相交的地方)可以用行间负数\tabskip
和 负数消除:\vskip
\documentclass{article}
\usepackage{tikz}
\newcommand\tableau[1]{%
{\tabskip-.4pt % skip back over rule to the left
\let\\=\cr
\everycr{\noalign{\vskip-.4pt}}% skip up over rule above
\offinterlineskip
\halign{&\tableaucell{##}\cr#1\crcr}%
}%
}
\newcommand\tableaucell[1]{%<-added to eliminate space
\begin{tikzpicture}
\node at (.5,.5) {\smash{$#1$}};
\draw (0,0)--(0,1)--(1,1)--(1,0)--(0,0);
\end{tikzpicture}%<- eliminate space
}
\begin{document}
\tableau{a & b \\ c & d & g}
\end{document}