多列和 xintfor

多列和 xintfor

尽管我经常阅读 Stack Exchange,但这是我第一次在 Stack Exchange 上提问。

我尝试构建一个表格来生成一种数组,并在上方显示索引。这是代码:

$A = $
\raisebox{10pt}{
  \setcounter{N}{5}
  \begin{tabular}{|*{5}{c|}}
     \xintFor* #1 in {\xintSeq{1}{\value{N}}}\do{\xintifForFirst{\tiny #1}{& \mc{\tiny #1}}}\\
    \hline
     $1$ & $3$ & $5$ & $7$ & $8$\\
    \hline
  \end{tabular}
}

在哪里\newcommand\mc[1]{\multicolumn{1}{l}{#1}}

在此处输入图片描述

我希望它和现在一模一样,但是索引行中没有前两条垂直线。如果我\mc在第一个块中使用\xintifForFirst(就像我在第二个块中成功使用的那样),它不会编译,我不明白为什么。我得到的错误是! Misplaced \omit. \multispan ->\omit \@multispan

提前致谢 :-)

编辑:正如安德鲁所建议的,我正在写一个我得到的错误的例子:

\documentclass{article}
\usepackage{tabularx}
\usepackage{xinttools}

\newcounter{N}
\newcommand\mc[1]{\multicolumn{1}{l}{#1}}

\newcommand{\myarray}[2]{
    \raisebox{8pt}{
        \begin{tabular}{|*{#1}{c|}}
            \setcounter{N}{#1}
            \xintFor* ##1 in {\xintSeq{1}{\value{N}}}\do{\xintifForFirst{\mc{    \tiny ##1}}{& \mc{\tiny ##1}}}\\
            \hline
            #2\\
            \hline
        \end{tabular}
    }
}

\begin{document}
    $B = $\myarray{11}{$0$ & $0$ & $1$ & $0$ & $1$ & $0$ & $0$ & $1$ & $0$ & $1$ & $0$}
\end{document}

答案1

我不知道您需要加载哪些包才能编译您的代码xint- 我试过\usepackage{xint}但这还不够。

你会考虑蒂克兹产生的解决方案

在此处输入图片描述

使用代码

\documentclass{article}
\usepackage{tikz}
\tikzset{array/.style={rectangle, draw, minimum width=5mm}}
\newcommand\Array[1]{%
  \tikz[baseline]{\foreach \x [count=\c] in {#1} {
      \node[array, label=above:{\tiny \c}]at (\c/2,0){$\x$};
    }
  }
}

\begin{document}

$A = \Array{1,3,5,7,8}$

\end{document}

編輯- 添加颜色

添加颜色相当简单。如果你想让每个单元格有不同的颜色,那么你可以制作:

在此处输入图片描述

使用代码:

\documentclass{article}
\usepackage{xcolor}
\usepackage{tikz}
\tikzset{array/.style={rectangle, draw, minimum width=5mm}}
\newcommand\Array[1]{%
  \tikz[baseline=(current bounding box.south)]{
    \foreach \x/\col [count=\c] in {#1} {
      \node[array, fill=\col!20, label=above:{\tiny \c}]at (\c/2,0){$\x$};
    }
  }
}

\begin{document}

$A = \Array{1/red,3/blue,5/white,7/green,8/white}$

\end{document}

如果你希望每个单元格的颜色相同,那么假设单元格条目始终是积极的您可以使用更简单的输入语法,通过使用负数来产生颜色

在此处输入图片描述

使用稍微复杂一点的代码:

\documentclass{article}
\usepackage{xcolor}
\usepackage{tikz}
\tikzset{array/.style={rectangle, draw, minimum width=5mm}}
\newcommand\Array[1]{%
  \tikz[baseline=(current bounding box.south)]{
    \foreach \x [count=\c] in {#1} {
      \ifnum\x<0\relax
        \node[array, fill=blue!20, label=above:{\tiny \c}]at (\c/2,0){$\the\numexpr-\x\relax$};
      \else
        \node[array, label=above:{\tiny \c}]at (\c/2,0){$\x$};
      \fi
    }
  }
}

\begin{document}

$A = \Array{1,-3,5,-7,8}$

\end{document}

编辑二

根据评论,原作者希望既允许阴影化,又能够以粗体排版条目。此外,0是有效条目,因此与编辑 I 不同,仅检查条目的符号不足以确定是否可阴影化或粗体化。

下面的新宏接受逗号分隔的列表,其中的条目是(假定为)数字,这些数字可选地用b, 修饰以表示粗体,用s, 修饰以表示阴影。因此,例如,代码

$A=\Array{s0, s0, sb1, s0, sb1, s0, 0, 1, 0, 1, 0}$

将产生

在此处输入图片描述

默认情况下,方块很5mm宽,但可以使用可选参数进行更改,以便

$A = \Array[8]{1,sb30,0b,s5,b7,8}$

产生较宽的“正方形” 8mm

在此处输入图片描述

为了识别bs“标志”,我不得不使用一些LaTeX3欺骗。可能有更有效的方法来做到这一点,但有一个额外的复杂性,那就是蒂克兹不太适合LaTeX3sb标志可出现在任何位置,只要在阴影框中以粗体显示s1b2即可。12

以下是更新后的代码:

\documentclass{article}
\usepackage{xcolor}
\usepackage{tikz}
\usepackage{xparse}
\tikzset{array/.style={rectangle, draw}}

\NewDocumentCommand\nodetext{}{}
\ExplSyntaxOn
\tl_new:N \g_text_tl
\cs_generate_variant:Nn \regex_replace_all:nnN {noN}
\cs_generate_variant:Nn \str_if_in:nnTF {onTF}
\NewDocumentCommand\SetUpNode{m}{
  \tl_gset:No \g_text_tl {#1}
  \regex_replace_all:noN {[bs]*} {} \g_text_tl
  \str_if_in:onTF {#1} {b}
    {\RenewDocumentCommand\nodetext{}{$\mathbf{\tl_use:N \g_text_tl}$} }
    {\RenewDocumentCommand\nodetext{}{$\tl_use:N \g_text_tl$} }
  \str_if_in:onTF {#1} {s} { \tikzset{array/.append~style={fill=blue!20}} }{}
}
\ExplSyntaxOff
\newcommand\Array[2][5]{%
  \begin{tikzpicture}[baseline=(current bounding box.south)]
    \tikzset{array/.append style={minimum width=#1mm}}
    \foreach \x [count=\c] in {#2} {
      \SetUpNode{\x}
      \node[array, label=above:{\tiny\c}]at(#1*\c/10,0){\nodetext};
    }
  \end{tikzpicture}
}

\begin{document}

  $A=\Array{s0, s0, sb1, s0, sb1, s0, 0, 1, 0, 1, 0}$

  \bigskip

  $A = \Array[8]{1,sb30,0b,s5,b7,8}$

\end{document}

该代码目前仅支持一种颜色的阴影,但这很容易通过添加额外的字母然后添加额外的行来改变:

\str_if_in:onTF {#1} {s} 
  { \tikzset{array/.append~style={fill=blue!20}} }{}

[请注意,我可以\str_if_in:onT在这里使用,但我不想生成另一个变体......]

答案2

我看到@Andrew 提供了更多可能性的答案,但仅仅回答了原始问题:

\xintFor不可扩张的收益在执行开始时。因此不可能使用它来插入\multicolumn,但它可以与一起使用&\multicolumn

因此,为了修复 OP,我们只需要直接处理第一个多列,然后对于后续的多列我们可以使用循环\xintFor

附注:\xintFor收益可扩展在其末端,它允许使用它插入 a\\然后在 xintFor 循环之后执行 a \hline。另一方面,此功能有一些限制,这些限制在手册中进行了注释。这些限制与此处的问题没有直接关系,这与开始 的循環。

以下是对 OP 进行最低限度的修改以使其正常工作:

\documentclass{article}
\usepackage{tabularx}
\usepackage{xinttools}

% \newcounter{N} % not needed
\newcommand\mc[1]{\multicolumn{1}{l}{#1}}

\newcommand{\myarray}[2]{
    \raisebox{8pt}{
        \begin{tabular}{|*{#1}{c|}}
            \mc{\tiny 1}%
            \xintFor* ##1 in {\xintSeq{2}{#1}}% we assume always #1 > 1
            \do {&\mc{\tiny ##1}}\\
            \hline
            #2\\
            \hline
        \end{tabular}
    }
}

\begin{document}
    $B = $\myarray{11}{$0$ & $0$ & $1$ & $0$ & $1$ & $0$ & $0$ & $1$ & $0$ & $1$ & $0$}
\end{document}

在此处输入图片描述

看起来更好

\newcommand\mc[1]{\multicolumn{1}{c}{#1}}

即居中的微小数字:

在此处输入图片描述

相关内容