我正在尝试复制 DND 4e 风格的生物统计块。计划是先让一些东西运行起来,然后将其压缩成一个包,然后编写一个小的 web 脚本来生成统计块的 latex。
我一直在尝试使用固定宽度的表格单元格根据页面的线宽进行对齐,但是当添加单元格颜色时,这似乎给了我一些有趣的输出。
我需要修复两个问题。第一个是每个单元格之间的间距(水平和垂直),第二个是某些线条的短线宽度。
用于生成 stat 块的完整代码是这里:
这里特别奇怪的是,0.9*linewidth 的单个单元格的长度与 (0.6 + 0.3)*linewidth 对的长度相差甚远。如果存在任何差异,人们会认为它与制表符间距的顺序一致,但事实并非如此。
理想情况下,设计一个专门处理这个问题的包会很好(这是否适合使用禁忌?),但我对任何可行的解决方案或建议都感到高兴。无论如何,计划是隐藏命令定义中的大部分混乱部分。
答案1
我设法以一种相当古怪的方式做到这一点,即将表格的各个部分浸入颜色框中(消除了背景线)。
此外,全宽多列实例需要增加长度,大概是为了弥补某种单元格填充。
我给出的解决方案其实很糟糕,大约 50 行定义勉强(一般情况下)可用,而且仍然需要手动调整一些数字。如果有人能给出更好的结果,我会将你标记为答案。
完整代码
\documentclass{article}
\usepackage[utf8]{inputenc}
\usepackage{array}
\usepackage{hanging}
\usepackage{xcolor,colortbl}
\newcolumntype{L}[1]{>{\raggedright\let\newline\\\arraybackslash\hspace{0pt}}m{#1}}
\newcolumntype{R}[1]{>{\raggedleft\let\newline\\\arraybackslash\hspace{0pt}}m{#1}}
%%Define colors. Precise color does not matter,
\definecolor{mgreen}{rgb}{0.08,0.35,0.12}
\definecolor{dtangreen}{rgb}{0.80, 0.85, 0.65}
\definecolor{tangreen}{rgb}{0.92, 0.95, 0.8}
%%commands for setting the colors of cells and text
\newcommand{\green}{\cellcolor{mgreen}}
\newcommand{\whiteText}{\color{white}}
\newcommand{\tHead}{\green \whiteText}
\newcommand{\lCell}{\cellcolor{tangreen}}
\newcommand{\dCell}{\cellcolor{dtangreen}}
%%left aligned wide cell
\newcommand{\lwcell}[1]{\multicolumn{3}{L{0.935\linewidth}}{#1}}
%%left aligned and right wide cell
\newcommand{\lrcell}[2]{\multicolumn{2}{L{0.60\linewidth}}{#1} & \multicolumn{1}{R{0.30\linewidth}}{#2}}
%%left aligned and left wide cell
\newcommand{\llwcell}[2]{\multicolumn{1}{L{0.30\linewidth}}{#1} & \multicolumn{2}{L{0.60\linewidth}}{#2}}
%%3x left aligned cells
\newcommand{\lllcell}[3]{\multicolumn{1}{L{0.30\linewidth}}{#1} & \multicolumn{1}{L{0.30\linewidth}}{#2} & #3}
%%creature stat rows:
\newcommand{\statrowA}[3]{\lllcell{\textbf{Str} #1}{\textbf{Dex} #2}{\textbf{Wis} #3}}
\newcommand{\statrowB}[3]{\lllcell{\textbf{Con} #1}{\textbf{Int} #2}{\textbf{Cha} #3}}
%%function for putting tables in colored boxes (hacky). Needs a reverse indent set.
\newcommand{\boxtablen}{-0.7mm}
\newcommand{\boxtab}[2]{\vspace{\boxtablen} \noindent \colorbox{#1}{\begin{tabular}{lll} #2 \end{tabular}}}
%%creature equipment block:
\newcommand{\equipblock}[1]{\boxtab{tangreen}{\lwcell{\lCell \textbf{Equipment} #1}}}
%Single attack for a creature. Use: (attack name/type) (attack properties)
\newcommand{\creatureattackblock}[2]{\boxtab{dtangreen}{\lwcell{\dCell #1}} \par \boxtab{tangreen}{\lwcell{\lCell \hangpara{0.30cm}{0}#2}}}
\begin{document}
Another approach: Try to put everything inside of boxes!
\boxtab{mgreen}{
\lrcell{\tHead \textbf{Angel of Valor Cohort}}{\tHead \textbf{Level 8 Soldier}}\\
\lrcell{\tHead \small Medium immortal humanoid (angel)}{\tHead \textbf{XP 350}}\\
}
\boxtab{tangreen}{
\llwcell{\lCell \textbf{Initiative} +9}{\lCell \textbf{Senses} Perception +7}\\
\lwcell{\lCell \textbf{HP} 1; a missed attack never damages a minion.}\\
\lwcell{\lCell \textbf{Immune} fear; \textbf{Resist} 10 fire, 10 radiant}\\
\lwcell{\lCell \textbf{Speed} 6, fly 9 (hover)}\\
}
%TODO: rip those icons from the DND books, or find replacement ones!
\creatureattackblock{\textbf{$\bullet$ Slam} (standard; at-will)}{+13 vs. AC; 1d8 + 6 damage}
\boxtab{dtangreen} {
\llwcell{\dCell \textbf{Alignment} Any}{\dCell \textbf{Languages} Common, Goblin}\\
\statrowA{18 (+7)}{18 (+7)}{14 (+5)}\\
\statrowB{16 (+6)}{10 (+3)}{10 (+3)}\\
}
\equipblock{leather armor, morningstar, rope garrote}
\end{document}
可能需要做的另一件事是删除段落间距,即{ \parskip 0pt (content) }