如何创建单元格之间没有空格的对齐环境?

如何创建单元格之间没有空格的对齐环境?

例如,我想创建一个宏来绘制单元格中有字母的表格。首先,我创建一个宏来接收一个表格式数据参数,称为\tableau,在其中我创建了一个\halign环境来解析数据并将其变成一个单元格矩阵,在每个单元格中,我使用一个\tableaucell宏来绘制单元格。我注意到默认情况下在单元格之间创建一些空间,包括垂直和水平空间。我设法通过将\halign设置为来消除垂直空间,但无法找到消除水平空间的方法。这里有一个简单的代码来演示我的想法。\lineskip0pt

\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}

相关内容