创建一个在每次调用时循环显示不同颜色的命令

创建一个在每次调用时循环显示不同颜色的命令

我正在尝试标记段落中的句子,以便每个句子按顺序获得不同的颜色。我不想手动指定颜色,而是想简单地注释单个句子,然后让 Latex 负责分配颜色。

以下是 MWE:

\documentclass[12pt]{article}

\usepackage{xcolor}  

\colorlet{colorA}{red}
\colorlet{colorB}{blue}

\newcommand{\altcolorA}[1]{{\renewcommand{\altcolor}[1]{\altColorB{#1}}}\color{colorA}#1}
\newcommand{\altcolorB}[1]{{\renewcommand{\altcolor}[1]{\altColorA{#1}}}\color{colorB}#1}
\newcommand{\altcolor}[1]{\altcolorA{#1}}

\begin{document}

I want:
{\color{red}one} {\color{blue}two}
{\color{red} three}

But I get:
\altcolor{one}
\altcolor{two}
\altcolor{three}

\end{document}

结果:

在此处输入图片描述

答案1

按顺序存储颜色并使用模块化算法:每次使用\altcolor计数器时都会进行步进。

该列表遵循标准作用域规则。\altcolor*提供了一种将计数器重置为零的变体。

\documentclass{article}
\usepackage{xcolor}

\ExplSyntaxOn

\NewDocumentCommand{\makecolorlist}{m}
 {% #1 = color list
  \seq_set_split:Nnn \l_myron_colorlist_seq { , } { #1 }
 }
\NewDocumentCommand{\altcolor}{sm}
 {% #1 = optional * for resetting, #2 = text to be colored
  \IfBooleanT { #1 } { \int_zero:N \l_myron_colorlist_int }
  \textcolor
   {% choose the color
    \seq_item:Nn \l_myron_colorlist_seq
     {
      \int_mod:nn { \l_myron_colorlist_int } { \seq_count:N \l_myron_colorlist_seq } + 1
     }
   }
   {
    #2
   }
  \int_incr:N \l_myron_colorlist_int
 }

\int_new:N \l_myron_colorlist_int
\seq_new:N \l_myron_colorlist_seq

\ExplSyntaxOff

\colorlet{colorA}{red}
\colorlet{colorB}{blue}

\makecolorlist{colorA,colorB}

\begin{document}

I want:
{\color{red}one} {\color{blue}two}
{\color{red} three}

And I get:
\altcolor{one}
\altcolor{two}
\altcolor{three}

Again:
\altcolor*{one}
\altcolor{two}
\altcolor{three}

\makecolorlist{colorA,colorB,green!70!red}

\altcolor*{Test} \altcolor{with} \altcolor{three} \altcolor{colors}

\end{document}

在此处输入图片描述

答案2

由于您只在两种颜色之间切换,因此可以使用条件\if...

在此处输入图片描述

\documentclass{article}

\usepackage{xcolor}  

\colorlet{colorA}{red}
\colorlet{colorB}{blue}

\newif\ifcolorA
\colorAtrue% Start with colorA
\newcommand{\altcolor}[1]{%
  \ifcolorA
    \textcolor{colorA}{#1}%
    \colorAfalse
  \else
    \textcolor{colorB}{#1}%
    \colorAtrue
  \fi
}

\begin{document}

I want:
{\color{red}one} {\color{blue}two}
{\color{red} three}

And I get:
\altcolor{one}
\altcolor{two}
\altcolor{three}

\end{document}

相关内容