循环遍历字母,并对前 3 个字母应用颜色

循环遍历字母,并对前 3 个字母应用颜色

我需要这些宏方面的帮助。我想要实现的是循环遍历自定义环境标题中的所有字母。然后给该标题的前三个字母分别涂上不同的颜色。使用的颜色应存储在列表中。

因此,对于每次调用环境,我都会增加一个计数器来计算环境的数量,然后我调用一个函数来获取(或者应该获取)正确的颜色。

该函数现在应该遍历颜色列表并返回与环境具有相同键的颜色:对于第一个环境,应该使用第一个颜色,对于第二个环境,应该使用第二个颜色,依此类推......

我的(无法正常工作的)代码中尚未实现的一个功能是,如果环境数量多于颜色数量,则使用列表中的第一个颜色重新启动。

这其中也存在一些 bug:

  • 仅返回第一个环境的颜色
  • 字母循环删除我的空格

如果您知道如何解决这些问题,我将非常高兴收到您的回复。如果您认为应该以其他方式处理此问题,这也适用。

麦当劳

\documentclass{article}
\usepackage[utf8]{inputenc}
\usepackage{etoolbox, xcolor, environ, parskip}

% Title Color List
\listadd{\titleColors}{red}
\listadd{\titleColors}{green}
\listadd{\titleColors}{blue}
\listadd{\titleColors}{yellow}



% Colorize the first three letters
% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\newcounter{letterCounter}%
\makeatletter
    \newcommand{\titleColorize}[2]{%
        \setcounter{letterCounter}{1}%
        \@tfor\next:=#1\do{%
            \ifnumcomp{\the\value{letterCounter}}{<}{4}%
            {\textcolor{#2}{\next}}%
            {\next}%
            \refstepcounter{letterCounter}%
        }%
    }%
\makeatother



% Get the corresponding color
% %%%%%%%%%%%%%%%%%%%%%%%%%%%
\newcounter{colourCounter}
\setcounter{colourCounter}{1}
\newcommand{\getTitleColor}[1]%
{%
    \renewcommand*{\do}[1]%
    {%
        \ifnumcomp{\thecolourCounter}{=}{#1}%
        {%
            ##1%
        }{}%
        \refstepcounter{colourCounter}%
    }%
    \dolistloop{\titleColors}%
}



% Define the environment
% %%%%%%%%%%%%%%%%%%%%%%
\newcounter{titleCounter}
\setcounter{titleCounter}{1}

\NewEnviron{entrylist}[1]{
    \vskip 1em
    {%
        \LARGE\bfseries\lowercase{%
            \titleColorize{#1}{red}
            \getTitleColor{\thetitleCounter} % Returns the correct color
            % \titleColorize{#1}{\getTitleColor{\thetitleCounter}}
        }%
    }\par
    \refstepcounter{titleCounter}
    \BODY
}



\begin{document}

    \begin{entrylist}{Test 1}
        Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua.
    \end{entrylist}

    \begin{entrylist}{Test 2}
        Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua.
    \end{entrylist}

    \begin{entrylist}{Test 3}
        Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua.
    \end{entrylist}

    \begin{entrylist}{Test 4}
        Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua.
    \end{entrylist}

    \begin{entrylist}{Test 5}
        Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua.
    \end{entrylist}

\end{document}

编辑

Werner和提供的答案egreg都具有完整的功能,但是由于该expl3“语言”的语法非常复杂,我更喜欢 Werners 的方法。

在我的项目中实现后者提供的代码之后,我意识到我的项目需要翻译。因此我导入了包translations并为文档中的所有字符串定义了翻译。对于我自定义entrylist环境的标题也是如此,它们是这个问题的主题。在用命令替换字符串后\GetTranslation{},我重新编译了文档并发现输出没有显示正确的结果,即使 LaTeX 没有抛出错误消息。由于这个问题显然是由代码引起的,循环遍历传递的字符串并为前三个项目设置颜色,我认为最好将其保留在同一个线程中,而不是打开一个新线程。如果有人知道是什么导致了错误输出以及如何修复它,请随时回答。最好这应该与提供的更易理解的代码一起工作Werner

以下是 LaTeX 的输出:Babel 开启ngerman\GetTranslation{interests}产生输出

特雷斯特恩格尔

如果选择english作为语言,它将变为

兴趣英语

因此显然\GetTranslation命令根本没有执行,因为terests可翻译字符串的键显然是这样的(除了前两个字母)。

由 Werner 创作的 MWE,添加了translations

\documentclass[ngerman]{article}



% %%%%%%%%%%%%%%%%
% Require Packages
% %%%%%%%%%%%%%%%%

\usepackage{%
    xcolor,%
    environ,%
    babel,%
    translations,%
}



% %%%%%%%%%%%%%%%
% Define Commands
% %%%%%%%%%%%%%%%

% Define the listcolor list
\newcounter{listcolor}
\makeatletter
    \newcommand{\addlistcolor}[1]{%
        \stepcounter{listcolor}%
        \@namedef{titlecolor@\thelistcolor}{#1}%
    }
\makeatother

% Choose the title color
\newcounter{titlecolor}
\newcommand{\colortitle}[3]{%
    \expandafter\textcolor\expandafter{\csname titlecolor@\thetitlecolor\endcsname}{#1#2#3}%
}



% %%%%%%%%%%%%%%%%%%%
% Define environments
% %%%%%%%%%%%%%%%%%%%

% Define the entrylist environment
\NewEnviron{entrylist}[1]{%
    \stepcounter{titlecolor}%
    \ifnum\value{titlecolor}>\value{listcolor}
        \setcounter{titlecolor}{1}%
    \fi
    \par\addvspace{1em}
    \begingroup
        \LARGE\bfseries\MakeLowercase{\expandafter\colortitle #1\relax}
        \par\nobreak
    \endgroup
    \BODY
}



% %%%%%%%%%%%%%%%%%
% Declare Variables
% %%%%%%%%%%%%%%%%%

% List colors
\addlistcolor{red}
\addlistcolor{green}
\addlistcolor{blue}
\addlistcolor{yellow}

% Translations
\DeclareTranslationFallback{test}{Test}
\DeclareTranslation{English}{test}{Test}
\DeclareTranslation{German}{test}{Test}



\begin{document}

\begin{entrylist}{\GetTranslation{} 1}
Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor 
invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua.
\end{entrylist}

\begin{entrylist}{\GetTranslation{test} 2}
Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor 
invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua.
\end{entrylist}

\begin{entrylist}{\GetTranslation{test} 3}
Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor 
invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua.
\end{entrylist}

\begin{entrylist}{\GetTranslation{test} 4}
Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor 
invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua.
\end{entrylist}

\begin{entrylist}{\GetTranslation{test} 5}
Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor 
invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua.
\end{entrylist}

\end{document}

答案1

根据您的喜好,您可以循环显示以下颜色entrylist

在此处输入图片描述

\documentclass{article}

\usepackage{xcolor,environ}

\newcounter{listcolor}
\makeatletter
\newcommand{\addlistcolor}[1]{%
  \stepcounter{listcolor}%
  \@namedef{titlecolor@\thelistcolor}{#1}%
}
\addlistcolor{red}
\addlistcolor{green}
\addlistcolor{blue}
\addlistcolor{yellow}

\newcounter{titlecolor}
\newcommand{\colortitle}[3]{%
  \expandafter\textcolor\expandafter{\csname titlecolor@\thetitlecolor\endcsname}{#1#2#3}%
}
\NewEnviron{entrylist}[1]{%
  \stepcounter{titlecolor}%
  \ifnum\value{titlecolor}>\value{listcolor}
    \setcounter{titlecolor}{1}%
  \fi
  \par\addvspace{1em}
  \begingroup
  \LARGE\bfseries\MakeLowercase{\expandafter\colortitle #1\relax}
  \par\nobreak
  \endgroup
  \BODY
}

\begin{document}

\begin{entrylist}{Test 1}
Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor 
invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua.
\end{entrylist}

\begin{entrylist}{Test 2}
Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor 
invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua.
\end{entrylist}

\begin{entrylist}{Test 3}
Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor 
invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua.
\end{entrylist}

\begin{entrylist}{Test 4}
Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor 
invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua.
\end{entrylist}

\begin{entrylist}{Test 5}
Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor 
invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua.
\end{entrylist}

\end{document}

...或者您可以循环使用每个标题的每个颜色:

在此处输入图片描述

\documentclass{article}

\usepackage{xcolor,environ}

\newcounter{listcolor}
\newcounter{curlistcolor}
\makeatletter
\newcommand{\addlistcolor}[1]{%
  \stepcounter{listcolor}%
  \@namedef{titlecolor@\thelistcolor}{#1}%
}
\makeatother
\addlistcolor{red}
\addlistcolor{green}
\addlistcolor{blue}
\addlistcolor{yellow}

\newcounter{titlecolor}
\newcommand{\colortitle}[3]{{%
  \edef\x{\noexpand\textcolor{\csname titlecolor@\thecurlistcolor\endcsname}}\x{#1}%
  \stepcounter{curlistcolor}%
  \ifnum\value{curlistcolor}>\value{listcolor}\relax
    \setcounter{curlistcolor}{1}%
  \fi
  \edef\x{\noexpand\textcolor{\csname titlecolor@\thecurlistcolor\endcsname}}\x{#2}%
  \stepcounter{curlistcolor}%
  \ifnum\value{curlistcolor}>\value{listcolor}\relax
    \setcounter{curlistcolor}{1}%
  \fi
  \edef\x{\noexpand\textcolor{\csname titlecolor@\thecurlistcolor\endcsname}}\x{#3}%
}}
\NewEnviron{entrylist}[1]{%
  \stepcounter{titlecolor}%
  \ifnum\value{titlecolor}>\value{listcolor}
    \setcounter{titlecolor}{1}%
  \fi
  \setcounter{curlistcolor}{\value{titlecolor}}%
  \par\addvspace{1em}
  \begingroup
  \LARGE\bfseries\lowercase{\colortitle #1\relax\relax\relax}%
  \par\endgroup\nobreak
  \BODY
}

\begin{document}

\begin{entrylist}{Test 1}
Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor 
invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua.
\end{entrylist}

\begin{entrylist}{Test 2}
Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor 
invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua.
\end{entrylist}

\begin{entrylist}{Test 3}
Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor 
invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua.
\end{entrylist}

\begin{entrylist}{Test 4}
Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor 
invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua.
\end{entrylist}

\begin{entrylist}{Test 5}
Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor 
invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua.
\end{entrylist}

\end{document}

答案2

实现如下expl3

\documentclass{article}
\usepackage[utf8]{inputenc}
\usepackage{xparse,xcolor}

\ExplSyntaxOn

% entry list
\NewDocumentEnvironment{entrylist}{m}
 {
  \par\addvspace{\topsep}
  \group_begin:
  \LARGE\bfseries\noindent
  \sam_entries_color_argument:n { #1 }
  \par\nobreak
  \group_end:
  \noindent\ignorespaces
 }
 {
  \par\addvspace{\topsep}
  % increment the counter
  \int_gincr:N \g_sam_entries_color_int
 }

\int_new:N \g_sam_entries_color_int
\tl_new:N \l__sam_entries_title_tl

\cs_new_protected:Nn \sam_entries_color_argument:n
 {
  % lowercase the argument
  \tl_set:Nf \l__sam_entries_title_tl { \tl_lower_case:n { #1 } }
  % replace spaces with a macro for counting right
  \tl_replace_all:Nnn \l__sam_entries_title_tl { ~ } { \c_space_tl }
  \textcolor
   {% pick the color from the sequence, dividing modulo the number of colors
    \seq_item:Nn \g_sam_entries_colors_seq
     {
      \int_mod:nn { \g_sam_entries_color_int } { \__sam_entries_colors: } + 1
     }
   }
   {% just the first three items are colored
    \tl_range:Vnn \l__sam_entries_title_tl { 1 } { 3 }
   }
   % the rest of the argument
   \tl_range:Vnn \l__sam_entries_title_tl { 4 } { \tl_count:V \l__sam_entries_title_tl }
 }
\cs_generate_variant:Nn \tl_range:nnn { V }

% color list
\NewDocumentCommand{\addtocolorlist}{m}
 {
  \clist_map_inline:nn { #1 } { \seq_gput_right:Nn \g_sam_entries_colors_seq { ##1 } }
 }
\seq_new:N \g_sam_entries_colors_seq
\cs_new:Nn \__sam_entries_colors:
 {
  \seq_count:N \g_sam_entries_colors_seq
 }

\ExplSyntaxOff

\addtocolorlist{red,green,blue}
\addtocolorlist{yellow}

\begin{document}

\begin{entrylist}{Test 1}
Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod 
tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua.
\end{entrylist}

\begin{entrylist}{Test 2}
Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod 
tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua.
\end{entrylist}

\begin{entrylist}{Test 3}
Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod 
tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua.
\end{entrylist}

\begin{entrylist}{T{é}st 4}
Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod 
tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua.
\end{entrylist}

\begin{entrylist}{Te}
Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod 
tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua.
\end{entrylist}

\begin{entrylist}{Te s}
Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod 
tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua.
\end{entrylist}

\end{document}

请注意,重音字符应该用括号括起来,因为在它们看来,pdflatex它们不是一个单独的标记。使用 XeLaTeX 或 LuaLatex 时,这不是必需的。

在此处输入图片描述

相关内容