我需要这些宏方面的帮助。我想要实现的是循环遍历自定义环境标题中的所有字母。然后给该标题的前三个字母分别涂上不同的颜色。使用的颜色应存储在列表中。
因此,对于每次调用环境,我都会增加一个计数器来计算环境的数量,然后我调用一个函数来获取(或者应该获取)正确的颜色。
该函数现在应该遍历颜色列表并返回与环境具有相同键的颜色:对于第一个环境,应该使用第一个颜色,对于第二个环境,应该使用第二个颜色,依此类推......
我的(无法正常工作的)代码中尚未实现的一个功能是,如果环境数量多于颜色数量,则使用列表中的第一个颜色重新启动。
这其中也存在一些 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 时,这不是必需的。