尽管我经常阅读 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
:
为了识别b
和s
“标志”,我不得不使用一些LaTeX3欺骗。可能有更有效的方法来做到这一点,但有一个额外的复杂性,那就是蒂克兹不太适合LaTeX3。s
和b
标志可出现在任何位置,只要在阴影框中以粗体显示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}}
即居中的微小数字: