下面的代码可以完美运行:
\documentclass[12pt]{article}
\usepackage{tikz}
\usepackage{collcell}
%The min, mid and max values
\newcommand*{\MinNumber}{0.0}%
\newcommand*{\MidNumber}{0.5} %
\newcommand*{\MaxNumber}{1.0}%
%Apply the gradient macro
\newcommand{\ApplyGradient}[1]{%
\ifdim #1 pt > \MidNumber pt
\pgfmathsetmacro{\PercentColor}{max(min(100.0*(#1 - \MidNumber)/(\MaxNumber-\MidNumber),100.0),0.00)} %
\hspace{-0.33em}\colorbox{green!\PercentColor!yellow}{#1}
\else
\pgfmathsetmacro{\PercentColor}{max(min(100.0*(\MidNumber - #1)/(\MidNumber-\MinNumber),100.0),0.00)} %
\hspace{-0.33em}\colorbox{red!\PercentColor!yellow}{#1}
\fi
}
\newcolumntype{R}{>{\collectcell\ApplyGradient}c<{\endcollectcell}}
\renewcommand{\arraystretch}{0}
\setlength{\fboxsep}{3mm} % box size
\setlength{\tabcolsep}{0pt}
\begin{document}
\begin{table}[ht]
\begin{center}
\begin{tabular}{*{10}{R}}
0.03 & 0.34 & 0.41 & 0.25 & 0.89 & 0.49 & 0.79 & 0.83 & 0.82 & 0.94 \\
\end{tabular}
\end{center}
\end{table}
\end{document}
当我编辑上面的代码以从文件而不是直接在代码中提取数据时,却不行!
. . .
\begin{table}[ht]
\begin{center}
\begin{tabular}{*{10}{R}}
\input{"data.tex"}
\end{tabular}
\end{center}
\end{table}
. . .
如果我将列类型从 R 更改为 c,它会编译而不会出现错误,但当数据位于单独的文件中时,宏中的某些内容不起作用。 data.tex 文件的内容如下:
0.03 & 0.34 & 0.41 & 0.25 & 0.89 & 0.49 & 0.79 & 0.83 & 0.82 & 0.94 \\
我怎样才能找到解决这个问题的方法?
答案1
问题是不可\input
扩展,这会阻止在collcell
,因此输入文件中的所有内容基本上都会出现在第一列中,这当然是行不通的。参见为什么 \input 不可扩展?了解更多信息。
使用 的可扩展版本\input
,即 LaTeX 在 中保存的原语\@@input
。
\begin{filecontents*}{\jobname.dat}
0.03 & 0.34 & 0.41 & 0.25 & 0.89 & 0.49 & 0.79 & 0.83 & 0.82 & 0.94 \\
\end{filecontents*}
\documentclass[12pt]{article}
\usepackage{tikz}
\usepackage{collcell}
%The min, mid and max values
\newcommand*{\MinNumber}{0.0}%
\newcommand*{\MidNumber}{0.5} %
\newcommand*{\MaxNumber}{1.0}%
%Apply the gradient macro
\newcommand{\ApplyGradient}[1]{%
\ifdim #1 pt > \MidNumber pt
\pgfmathsetmacro{\PercentColor}{%
max(min(100.0*(#1 - \MidNumber)/(\MaxNumber-\MidNumber),100.0),0.00)
}%<---- fixed
\hspace{-0.33em}\colorbox{green!\PercentColor!yellow}{#1}%<---- fixed
\else
\pgfmathsetmacro{\PercentColor}{
max(min(100.0*(\MidNumber - #1)/(\MidNumber-\MinNumber),100.0),0.00)
}%<---- fixed
\hspace{-0.33em}\colorbox{red!\PercentColor!yellow}{#1}%<---- fixed
\fi
}
\newcolumntype{R}{>{\collectcell\ApplyGradient}c<{\endcollectcell}}
\renewcommand{\arraystretch}{0}
\setlength{\fboxsep}{3mm} % box size
\setlength{\tabcolsep}{0pt}
\makeatletter
\newcommand{\xinput}[1]{\@@input #1 }
\makeatother
\begin{document}
\begin{table}[ht]
\begin{center}
\begin{tabular}{*{10}{R}}
0.03 & 0.34 & 0.41 & 0.25 & 0.89 & 0.49 & 0.79 & 0.83 & 0.82 & 0.94 \\
\xinput{\jobname.dat}
\end{tabular}
\end{center}
\end{table}
\end{document}
我使用filecontents
只是\jobname.dat
为了不破坏我的文件,你可以传递你想要的任何文件名。
我还修复了代码中的一些虚假空格。