![latex 中的数据数组(或如何有效地使用数据来驱动布局)](https://linux22.com/image/252472/latex%20%E4%B8%AD%E7%9A%84%E6%95%B0%E6%8D%AE%E6%95%B0%E7%BB%84%EF%BC%88%E6%88%96%E5%A6%82%E4%BD%95%E6%9C%89%E6%95%88%E5%9C%B0%E4%BD%BF%E7%94%A8%E6%95%B0%E6%8D%AE%E6%9D%A5%E9%A9%B1%E5%8A%A8%E5%B8%83%E5%B1%80%EF%BC%89.png)
在我的书中,我需要为某些章节使用特定的颜色。理解这一点的一种方法是如何有效地为拇指索引着色。我想轻松地在数据数组(而不是乳胶印刷数组)中设置颜色,并轻松地从数组中访问值。
在普通编程语言中,你可以这样做
var ThumbColors = {Red, Blue, Green, ...}
....
SetThumbColor(ThumbColors[k]) (where k maybe the current chapter or whatever)
这样的代码可以将代码与数据分开,因此可以非常轻松地更改颜色,而无需找到 SetThumbColor 的每个实例。例如,这样做非常糟糕
SetThumbColor("red")
因为它需要改变每个实例,谁知道在哪里,来改变颜色。
所以,我需要某种方法来实现第一种情况。
\NewCommand{\ThumbColors}{{red, green, blue, ...}}
\SetThumbColor{...}
或者,甚至更好,以简单的方式使用字典(键值对):
\NewCommand{\ThumbColors}{{chapter1 = red, chapter2 = green, chapter3 = blue, ...}}
\SetThumbColor{\GetThumbColors{chapter1}}
最重要的是它应该可以快速输入。用编程语言来做这件事非常容易,我不想为了做类似 1 或 2 行的事情而写 15 行代码(否则为什么不一开始就硬编码呢?)
答案1
下面以“经典方式”实现“颜色数组”。但它还支持更深层次的数组。
\documentclass{article}
\usepackage{color}
\usepackage{kvsetkeys}
\usepackage{ltxcmds}
\makeatletter
\newcounter{thbcol@A}
\newcounter{thbcol@B}[thbcol@A]
\newcommand*{\theThumbColor}{%
thbcol@\number\value{thbcol@A}.\number\value{thbcol@B}%
}
\newcommand*{\DeclareThumbColors}[1]{%
\setcounter{thbcol@A}{0}%
\comma@parse{#1}{%
\stepcounter{thbcol@A}%
\expandafter\comma@parse\expandafter{\comma@entry}{%
\stepcounter{thbcol@B}%
\expandafter\let\csname\theThumbColor\endcsname\comma@entry
\@gobble
}%
\@gobble
}%
}
\newcommand*{\UseThumbColor}[2]{%
\ltx@ifundefined{thbcol@\number#1.\number#2}{%
\ltx@ifundefined{thbcol@\number#1.1}{%
black%
}{%
\csname thbcol@\number#1.1\endcsname
}%
}{%
\csname thbcol@\number#1.\number#2\endcsname
}%
}
\DeclareThumbColors{
red,
green,
{cyan, magenta, yellow},
blue,
}
\pagestyle{empty}
\begin{document}
\newcommand*{\Test}{%
Color:
\textcolor{%
\UseThumbColor{\value{section}}{\value{subsection}}%
}{%
\UseThumbColor{\value{section}}{\value{subsection}}%
}%
}
\section{Red}
\Test
\subsection{Red}
\Test
\subsection{Red}
\Test
\section{Green}
\Test
\section{Cyan}
\Test
\subsection{Cyan}
\Test
\subsection{Magenta}
\Test
\subsection{Yellow}
\Test
\subsection{Cyan (first section color)}
\Test
\section{Blue}
\Test
\section{Black (default)}
\Test
\end{document}
结果:
颜色规范存储在二维数组中。索引基于 1(如节和章节编号)。因此,声明的颜色存储在以下宏中:
- 红色的:
\[email protected]
- 绿色的:
\[email protected]
- 青色: 洋红色: 黄色:
\[email protected]
\[email protected]
\[email protected]
- 蓝色的:
\[email protected]
颜色由第一个和第二个数字来寻址。如果未找到颜色,则1
尝试第二个数字,请参阅无子节的部分(第二个数字为零)或第 3.4 节,其中未声明颜色。否则black
用作默认值(请参阅第 5 节)。
答案2
我已将数据存储在 lua 表中,并创建 TeX 宏来访问数据
假设你的数据存储在 lua 数据表中,如下所示
mycolortable = {chapter1color = "red", ...}
并且你想使用这些值来设置一些颜色
\def\setchcolor#1{
\textcolor{\directlua{mycolortable["#1"]}}
}
然后可以像
\setchcolor{chapter1color}
使用这些“辅助”宏,只需要更改 lua 数据表即可更改颜色,而无需处理 TeX。