我是 stackexchange 的新手,对 TeX 也还很陌生。
我曾尝试搜索类似的问题,但一无所获。
我正在处理一个文档,需要从 csv 文件中生成一个表格。数据不应按原样填充,而应填充与表格中每个单元格对应的值的数量(如下所述)。我附上了一张显示我想要的最终结果的图片和一个显示表格的 MWE(我不知道如何给单元格着色,并在不混淆单元格格式的情况下将标签“Konsekvens”和“Sannolikhet”放在正确的位置)以及一些应导致图片中表格的示例数据。
例如,对于数据集中的每个 4,4,右上角的单元格应该增加,从而导致该单元格中的值为 7,因为共有 7 个 4,4。
数据仅为示例数据,因此表格可能与图像略有不同。
一个小问题是我无法像图m{2cm}
中这样工作p{2cm}
这里。
我尝试过 datatool,但我唯一的想法是使用变量,但使用 16 个变量感觉是一个复杂的解决方案,我希望它可以以更好的方式完成,这就是我在这里寻求帮助的原因。
\documentclass{article}
\usepackage{filecontents}
\usepackage{multirow}
\usepackage{graphicx}
\begin{filecontents*}{mycsvdata.csv}
Sannolikhet,Konsekvens
4,4
4,4
4,4
4,4
4,4
4,4
4,4
4,3
4,2
4,2
2,4
2,4
2,4
2,4
2,2
1,4
1,4
1,4
1,4
1,4
1,3
1,3
1,2
1,1
\end{filecontents*}
\begin{document}
\begin{tabular}{c|p{2cm}|p{2cm}|p{2cm}|p{2cm}|p{2cm}|}
\cline{2-6}
\multirow{5}{*}{\rotatebox{90}{Konsekvens}}
& Mycket allvarlig&~&~&~&~ \\[0.5cm]\cline{2-6}
& Allvarlig&~&~&~&~ \\[0.5cm]\cline{2-6}
& Måttlig&~&~&~&~ \\[0.5cm]\cline{2-6}
& Försumbar&~&~&~&~ \\[0.5cm]\cline{2-6}
\multicolumn{1}{l}{}&~&Osannolik&Möjlig&Sannolikt&Mycket sannolikt \\\cline{3-6}
\multicolumn{6}{r}{Sannolikhet}
\end{tabular}
\end{document}
答案1
如果你不介意异国情调Lua 编程...
\documentclass{article}
\usepackage[T1]{fontenc}
\usepackage{colortbl}
\usepackage{multirow}
\usepackage{graphicx}
\usepackage{array}
\usepackage{luacode}
\usepackage{hhline}
\usepackage{xcolor}
\begin{document}
\newcolumntype{M}[1]{>{\centering\arraybackslash}m{#1}}
\begin{luacode*}
local table_str = [[
\begin{tabular}{c|M{2cm}|M{2cm}|M{2cm}|M{2cm}|M{2cm}|}
\hhline{~|*{5}-}
\multirow{5}{*}{\rotatebox{90}{Konsekvens}}
& Mycket allvarlig&@&@&@&@ \\[0.5cm]\hhline{~|*{5}-}
& Allvarlig&@&@&@&@ \\[0.5cm]\hhline{~|*{5}-}
& Måttlig&@&@&@&@ \\[0.5cm]\hhline{~|*{5}-}
& Försumbar&@&@&@&@ \\[0.5cm]\hhline{~|*{5}-}
\multicolumn{1}{l}{}&~&Osannolik&Möjlig&Sannolikt&Mycket sannolikt \\\hhline{~|~|*{4}-}
\multicolumn{6}{r}{Sannolikhet}
\end{tabular}
]]
local result_table = {}
for i=1,4 do
result_table[i] = {}
for j=1,4 do
result_table[i][j] = 0
end
end
local line_num = 0
for line in io.lines('mycsvdata.csv') do
if line_num ~= 0 then
local stripped_line = string.gsub(line, '%s', '')
local comma_pos = string.find(line, ',')
if comma_pos ~= nil then
local left = tonumber(stripped_line:sub(1, comma_pos - 1))
local right = tonumber(stripped_line:sub(comma_pos + 1))
result_table[left][right] = result_table[left][right] + 1
end
end
line_num = line_num + 1
end
for i=0,15 do
local y = 4 - math.floor(i / 4)
local x = i % 4 + 1
local cell_num = result_table[x][y]
local cell_str = tostring(cell_num)
if cell_num == 0 then
cell_str = ''
end
if y+x <= 4 then
cell_str = [[{\cellcolor{green!50}}]] .. cell_str
elseif x+y <= 5 then
cell_str = [[\cellcolor{yellow!50}]] .. cell_str
elseif x+y <= 6 then
cell_str = [[\cellcolor{orange!50}]] .. cell_str
else
cell_str = [[\cellcolor{red!50}]] .. cell_str
end
local new_str, sub_count = string.gsub(table_str, '@', cell_str, 1)
table_str = new_str
end
local out_str, _ = string.gsub(table_str, '\n', '')
tex.print(out_str)
\end{luacode*}
\end{document}
答案2
我对这个解决方案并不完全满意,但我现在有了一个可以运行的代码。我想我也可以分享它,这样其他人就可以使用它。
我仍然希望“Sannolikhet”在最后四列中居中,但当我这样做时,我得到了不应该出现的垂直线。我还希望“Konsekvens”在顶部四行中垂直居中。
代码:
\documentclass{article}
\usepackage{filecontents}
\usepackage{multirow}
\usepackage{graphicx}
\usepackage[table]{xcolor}
\usepackage{hhline}
\usepackage{datatool}
\usepackage{array}
\begin{filecontents*}{mycsvdata.csv}
Sannolikhet;Konsekvens
4;4
4;4
4;4
4;4
4;4
4;4
4;4
4;3
4;2
4;2
2;4
2;4
2;4
2;4
2;2
1;4
1;4
1;4
1;4
1;4
1;3
1;3
1;2
1;1
\end{filecontents*}
\newcolumntype{M}[1]{>{\centering\arraybackslash}m{#1}}
\definecolor{orangex}{RGB}{255,205,55}
\definecolor{greenx}{RGB}{146,208,80}
\newcounter{AA}
\newcounter{AB}
\newcounter{AC}
\newcounter{AD}
\newcounter{BA}
\newcounter{BB}
\newcounter{BC}
\newcounter{BD}
\newcounter{CA}
\newcounter{CB}
\newcounter{CC}
\newcounter{CD}
\newcounter{DA}
\newcounter{DB}
\newcounter{DC}
\newcounter{DD}
\DTLsetseparator{;}
\begin{document}
\DTLloaddb{riskvarde}{mycsvdata.csv}
\DTLforeach*{riskvarde}{\Sannolikhet=Sannolikhet,\Konsekvens=Konsekvens}{
\ifthenelse{\DTLiseq{\Sannolikhet \Konsekvens}{11}}{\stepcounter{AA}}{}
\ifthenelse{\DTLiseq{\Sannolikhet \Konsekvens}{12}}{\stepcounter{AB}}{}
\ifthenelse{\DTLiseq{\Sannolikhet \Konsekvens}{13}}{\stepcounter{AC}}{}
\ifthenelse{\DTLiseq{\Sannolikhet \Konsekvens}{14}}{\stepcounter{AD}}{}
\ifthenelse{\DTLiseq{\Sannolikhet \Konsekvens}{21}}{\stepcounter{BA}}{}
\ifthenelse{\DTLiseq{\Sannolikhet \Konsekvens}{22}}{\stepcounter{BB}}{}
\ifthenelse{\DTLiseq{\Sannolikhet \Konsekvens}{23}}{\stepcounter{BC}}{}
\ifthenelse{\DTLiseq{\Sannolikhet \Konsekvens}{24}}{\stepcounter{BD}}{}
\ifthenelse{\DTLiseq{\Sannolikhet \Konsekvens}{31}}{\stepcounter{CA}}{}
\ifthenelse{\DTLiseq{\Sannolikhet \Konsekvens}{32}}{\stepcounter{CB}}{}
\ifthenelse{\DTLiseq{\Sannolikhet \Konsekvens}{33}}{\stepcounter{CC}}{}
\ifthenelse{\DTLiseq{\Sannolikhet \Konsekvens}{34}}{\stepcounter{CD}}{}
\ifthenelse{\DTLiseq{\Sannolikhet \Konsekvens}{41}}{\stepcounter{DA}}{}
\ifthenelse{\DTLiseq{\Sannolikhet \Konsekvens}{42}}{\stepcounter{DB}}{}
\ifthenelse{\DTLiseq{\Sannolikhet \Konsekvens}{43}}{\stepcounter{DC}}{}
\ifthenelse{\DTLiseq{\Sannolikhet \Konsekvens}{44}}{\stepcounter{DD}}{}
}
\begin{tabular}{c|M{2cm}|M{2cm}|M{2cm}|M{2cm}|M{2cm}|}
\hhline{~|*{5}-}
\multirow{5}{*}{\rotatebox{90}{Konsekvens}}
& Mycket allvarlig&\cellcolor{yellow!75}\ifthenelse{\theAD>0}{\theAD}{}&\cellcolor{orangex}\ifthenelse{\theBD>0}{\theBD}{}&\cellcolor{red!50}\ifthenelse{\theCD>0}{\theCD}{}&\cellcolor{red!50}\ifthenelse{\theDD>0}{\theDD}{} \\\hhline{~|*{5}-}
& Allvarlig\newline&\cellcolor{greenx}\ifthenelse{\theAC>0}{\theAC}{}&\cellcolor{yellow!75}\ifthenelse{\theBC>0}{\theBC}{}&\cellcolor{orangex}\ifthenelse{\theCC>0}{\theCC}{}&\cellcolor{red!50}\ifthenelse{\theDC>0}{\theDC}{} \\\hhline{~|*{5}-}
& Måttlig\newline&\cellcolor{greenx}\ifthenelse{\theAB>0}{\theAB}{}&\cellcolor{greenx}\ifthenelse{\theBB>0}{\theBB}{}&\cellcolor{yellow!75}\ifthenelse{\theCB>0}{\theCB}{}&\cellcolor{orangex}\ifthenelse{\theDB>0}{\theDB}{} \\\hhline{~|*{5}-}
& Försumbar\newline&\cellcolor{greenx}\ifthenelse{\theAA>0}{\theAA}{}&\cellcolor{greenx}\ifthenelse{\theBA>0}{\theBA}{}&\cellcolor{greenx}\ifthenelse{\theCA>0}{\theCA}{}&\cellcolor{yellow!75}\ifthenelse{\theDA>0}{\theDA}{} \\\hhline{~|*{5}-}
\multicolumn{1}{l}{}&~&Osannolik&Möjlig&Sannolikt&Mycket sannolikt \\ \hhline{~|~|*{4}-}
\multicolumn{6}{r}{Sannolikhet}
\end{tabular}
\end{document}