latex 中的数据数组(或如何有效地使用数据来驱动布局)

latex 中的数据数组(或如何有效地使用数据来驱动布局)

在我的书中,我需要为某些章节使用特定的颜色。理解这一点的一种方法是如何有效地为拇指索引着色。我想轻松地在数据数组(而不是乳胶印刷数组)中设​​置颜色,并轻松地从数组中访问值。

在普通编程语言中,你可以这样做

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(如节和章节编号)。因此,声明的颜色存储在以下宏中:

颜色由第一个和第二个数字来寻址。如果未找到颜色,则1尝试第二个数字,请参阅无子节的部分(第二个数字为零)或第 3.4 节,其中未声明颜色。否则black用作默认值(请参阅第 5 节)。

答案2

我已将数据存储在 lua 表中,并创建 TeX 宏来访问数据

假设你的数据存储在 lua 数据表中,如下所示

mycolortable = {chapter1color = "red", ...}

并且你想使用这些值来设置一些颜色

\def\setchcolor#1{
    \textcolor{\directlua{mycolortable["#1"]}}
}

然后可以像

\setchcolor{chapter1color}

使用这些“辅助”宏,只需要更改 lua 数据表即可更改颜色,而无需处理 TeX。

相关内容