全局变量数组

全局变量数组

我有control_array.tex和 10 templateA.tex、、templateB.tex... 个 TeX 文件。在control_array.tex

  • 数组名称 = [名称1,名称2,...名称10]
  • 数组颜色 = [颜色 1,颜色 2,...颜色 10]

使用数组,control_array.tex我可以在所有模板中仅更改一次所有变量:templateA.tex,,templateB.tex...

这是我的 MWE:

\documentclass[a4paper,twoside,12pt]{article}
\usepackage{xcolor}
\begin{document}
%Call Name1, Nam10...Color 1, Color2...Color10
\begin{enumerate}
\item \textcolor{color1}{Name1}
\item \textcolor{color2}{Name2}
\item \textcolor{color3}{Name3}
\end{enumerate}
\textcolor{color4}{Name9} \\
\textcolor{color5}{Name8}
\end{document}

我该如何使用 LaTeX 来实现?欢迎提出任何想法。

答案1

您可以用pgffor它来做这件事。

\documentclass[a4paper,twoside,12pt]{article}
\usepackage{pgffor}
\usepackage{xcolor}
\begin{document}
\def\ArrayNames{{"koala","duck","marmot","penguin","bear"}}
\def\ArrayColors{{"gray","yellow","blue","red","brown"}}
\begin{enumerate}
\foreach \X in {0,...,4}
{\pgfmathsetmacro{\myname}{\ArrayNames[\X]}
\pgfmathsetmacro{\mycolor}{\ArrayColors[\X]}
\item \textcolor{\mycolor}{\myname}}
\end{enumerate}
\end{document}

在此处输入图片描述

或者使用外部文件(我在这里创建它是为了方便 MWE 中的其他人,但只要您有数据文件,您就可以删除文件内容)。

\documentclass[a4paper,twoside,12pt]{article}
\usepackage{filecontents}
\begin{filecontents*}{myarrays.tex}
\def\ArrayNames{{"koala","duck","marmot","penguin","bear"}}
\def\ArrayColors{{"gray","yellow","blue","red","brown"}}
\end{filecontents*}
\usepackage{pgffor}
\usepackage{xcolor}
\begin{document}
\input{myarrays.tex}
\begin{enumerate}
\foreach \X in \ArrayNames
{\foreach \Y [count=\Z starting from 0]in \X 
{\pgfmathsetmacro{\mycolor}{\ArrayColors[\Z]}
\pgfmathsetmacro{\myname}{\ArrayNames[\Z]}
\item \textcolor{\mycolor}{\myname}}}
\end{enumerate}
\end{document}

当然,您可以安装任何映射。下面是一个例子(我假设您已经创建了myarrays.tex,如果没有,请取消注释相应的行)。

\documentclass[a4paper,twoside,12pt]{article}
% \usepackage{filecontents}
% \begin{filecontents*}{myarrays.tex}
% \def\ArrayNames{{"koala","duck","marmot","penguin","bear"}}
% \def\ArrayColors{{"gray","yellow","blue","red","brown"}}
% \end{filecontents*}
\usepackage{pgffor}
\usepackage{xcolor}
\begin{document}
\input{myarrays.tex}
\pgfkeys{/pgf/declare function={mymap(\x)=int(mod(1+\x*\x,4));}}
\begin{enumerate}
\foreach \X in \ArrayNames
{\foreach \Y [count=\Z starting from 0]in \X 
{\pgfmathsetmacro{\mycolor}{\ArrayColors[mymap(\Z)]}
\pgfmathsetmacro{\myname}{\ArrayNames[\Z]}
\item \textcolor{\mycolor}{\myname}}}
\end{enumerate}
\end{document}

在此处输入图片描述

如您所见,选择此函数是为了区分鸟类和哺乳动物和生物。

答案2

与 无关listofitems

\documentclass{article}
\usepackage{listofitems,xcolor}
\newcommand\ArrayNames{Name1,Name2,N3,N4,N5,N6,N7,N8,N9,Name10}
\newcommand\ArrayColors{red,blue,cyan,cyan!50!red,red!50,
  purple,green,yellow,blue!50,magenta}
\readlist*\arrayname{\ArrayNames}
\readlist*\arraycolor{\ArrayColors}
\begin{document}
\begin{enumerate}
\foreachitem\x\in\arrayname{\item \textcolor{\arraycolor[\xcnt]}{\x}}
\end{enumerate}

\textcolor{\arraycolor[4]}{\arrayname[9]}

\textcolor{\arraycolor[5]}{\arrayname[8]}
\end{document}

在此处输入图片描述

答案3

您可以拥有以下结构的文件

\colorlist{
  {red}
  {green}
  {blue}
  {green!40!yellow}
  {-green!40!yellow}
  {rgb:-green!40!yellow,3;green!40!yellow,2;red,1}
  {red>wheel,12}
}

也可以采用更简单的结构

red
green
blue
green!40!yellow

- 绿色!40!黄色 rgb:-绿色!40!黄色,3;绿色!40!黄色,2;红色,1 红色>轮子,12

如果需要的话。然后在文档中调用

\assigncolors{<filename>}{<list of names for the colors>}

这是用于使示例自包含的代码filecontents;颜色列表文件的名称可以是任何您喜欢的名称。

\begin{filecontents}{\jobname.colors}
\colorlist{
  {red}
  {green}
  {blue}
  {green!40!yellow}
  {-green!40!yellow}
  {rgb:-green!40!yellow,3;green!40!yellow,2;red,1}
  {red>wheel,12}
}
\end{filecontents}

\documentclass{article}
\usepackage{xcolor}
\usepackage{xparse}

\ExplSyntaxOn
\NewDocumentCommand{\assigncolors}{mm}
 {% #1 = file name, #2 = list of names
  \clist_set:Nn \l__tisaigon_colornames_clist { #2 }
  \file_input:n { #1 }
 }
\NewDocumentCommand{\colorlist}{m}
 {
  \int_zero:N \l__tisaigon_colornames_int
  \tl_map_inline:nn { #1 }
   {
    \int_incr:N \l__tisaigon_colornames_int
    \colorlet
     {
      \clist_item:Nn \l__tisaigon_colornames_clist { \l__tisaigon_colornames_int }
     }
     {
      ##1
     }
   }
 }
\clist_new:N \l__tisaigon_colornames_clist
\int_new:N \l__tisaigon_colornames_int
\ExplSyntaxOff

\assigncolors{\jobname.colors}{
  color1,
  color2,
  color3,
  header,
  body,
  footer,
  fancy,
}

\begin{document}

\textcolor{color1}{Abc}

\textcolor{color2}{Abc}

\textcolor{color3}{Abc}

\textcolor{header}{Abc}

\textcolor{body}{Abc}

\textcolor{footer}{Abc}

\textcolor{fancy}{Abc}

\end{document}

在此处输入图片描述

答案4

\colorlet{colorX}{<colour>}以一种非常简单的方式,您可以使用(比如说)在里面放置一些颜色定义color_array.tex,然后将它们加载到文档前言中:

在此处输入图片描述

\documentclass{article}

% Just for this example, create control_array.tex that contains all the colour definitions
\usepackage{filecontents}
\begin{filecontents*}{control_array.tex}
\usepackage{xcolor}
\colorlet{color1}{blue}
\colorlet{color2}{green}
\colorlet{color3}{red!30!yellow}
\colorlet{color4}{rgb:black,1;red,2;orange,3}
\colorlet{color5}{black!50}
\end{filecontents*}

\input{control_array}% Input colour definitions

\begin{document}

\begin{enumerate}
  \item \textcolor{color1}{Name1}
  \item \textcolor{color2}{Name2}
  \item \textcolor{color3}{Name3}
\end{enumerate}

\textcolor{color4}{Name9}

\textcolor{color5}{Name8}

\end{document}

注意,\input{color_array}在序言中调用了,因为color_array.tex包含对加载的调用xcolor只能在序言中调用。

相关内容