我有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
只能在序言中调用。