在文档开始前选择不同的颜色色调

在文档开始前选择不同的颜色色调

我正在 Latex 下创建一份 CV(基于 altacv 模板,但它并不那么重要),并且在我的 .tex 文档的序言中,我试图找到一种解决方案,以便能够快速测试颜色色调的配置。

自从我发现了LaTeX3的界面和它的函数后,我就尝试用该\str_case:nn函数实现一种switch case。

但是我没有得到想要的结果,并且在编译后,使用了类中的默认颜色,而不是我希望从 .tex 文档中的配置中获得的新颜色。

我担心这是因为我试图在序言中使用它而没有真正“调用它”,而不是在我的之后\begin{document},对吗?但我真的不知道如何实现这样的调用。

这是我的代码。如您所见,我创建了一些变量,以便测试在编译过程中是否真正考虑了某个案例。此外,我不确定用于灰色色调选择的命令是否正确。我正在使用 xcolor 包。

% Available options
    \str_const:Nn \l_greyColorHue_str {greyHue}
    \str_const:Nn \l_blueColorHue_str {blueHue}
    
    % To modify to choose the switch-case option
    \str_set_eq:NN \l_colorHueSelection_str \l_greyColorHue_str
    
    % String to verify if the switch case worked
    \str_new:N \l_effectiveColorHue_str
    
    %% Color fields definition
    \str_case:nn {\l_colorHueSelection_str}
    {
        {\l_greyColorHue_str} {
            \colorlet{name}{\color[Gray]{15}} % Used for : \name
            \colorlet{tagline}{\color[Gray]{13}} % Used for : \tagline
            \colorlet{heading}{\color[Gray]{13}} % Used for : \cvsection
            \colorlet{headingrule}{\color[Gray]{15}} % Used for : \rule
            \colorlet{subheading}{\color[Gray]{13}} % Used for : \cvsubsection, \cvsubsubsection
            \colorlet{accent}{\color[Gray]{10}} % Used for : \cvref(#1), \cvskill(#1), \skillfive, \cvachievment(#1), \cvevent(#1), \quote, \printinfo(#1)
            \colorlet{emphasis}{\color[Gray]{9}} % Used for : \cvref(#1), \cvskill(#1) \cvachievment(#2), \cvevent(#1)
            \colorlet{body}{\color[Gray]{15}} % Used for : all text color
            
            \str_set_eq:NN \l_effectiveColorHue_str \l_greyColorHue_str
        }
    
        {\l_blueColorHue_str} {
            \colorlet{name}{black} % Used for : \name
            \colorlet{tagline}{RoyalBlue} % Used for : \tagline
            \colorlet{heading}{RoyalBlue} % Used for : \cvsection
            \colorlet{headingrule}{black} % Used for : \rule
            \colorlet{subheading}{Navy} % Used for : \cvsubsection, \cvsubsubsection
            \colorlet{accent}{MediumBlue} % Used for : \cvref(#2), \cvskill(#2), \skillfive, \cvachievment(#1), \cvevent(#2), \quote, \printinfo(#1)
            \colorlet{emphasis}{MidnightBlue} % Used for : \cvref(#1), \cvskill(#1) \cvachievment(#2), \cvevent(#1)
            \colorlet{body}{black} % Used for : all text color

            \str_set_eq:NN \l_effectiveColorHue_str \l_blueColorHue_str
        }
    }

然后,我开始我的文档并返回我的变量\l_effectiveColorHue_str以在生成的文档中查看其内容。

\begin{document}

[...]

\makecvheader

\ExplSyntaxOn
    Selected~coloration~: \\
    (~ \str_use:N \l_effectiveColorHue_str ~)
\ExplSyntaxOff

您是否有任何想法可以使这个工作或甚至使用“经典” Latex 代码的另一种解决方案,以便我可以轻松地在不同色调之间切换进行测试,而无需覆盖我的命令或注释/取消注释我的colorlet选择?

答案1

模块中的函数str总是以字符串作为参数,因此

\str_case:nn { \l_colorHueSelection_str }
  {
    { \l_greyColorHue_str } { ... }
    { \l_blueColorHue_str } { ... }
  }

比较字符串 \ l _ c o l o r H u e S e l e c t i o n _ s t r(24 个字符)和\ l _ g r e y C o l o r H u e _ s t r(19 个字符),而不是内容变量和的。字符串显然不同,但它们的内容可能相同,而这正是您想要比较的str\l_colorHueSelection_str\l_greyColorHue_str

要比较内容,可以使用\str_case_e:nne代表expanded,这意味着它将首先扩张被比较的字符串,然后对它们进行比较。


关于你的编码风格的一些挑剔之处:

  • 确实如此\str_const:Nn \l_greyColorHue_str {greyHue},但名称\l_greyColorHue_str表示的是l局部变量。常量应该命名为\c_...

  • 更一般地,中的变量expl3应该命名为\<scope>_<module>_<name>_<type>,其中:

    • <scope>local、global 或constant;
    • <module>就像一个名称空间(例如你的包的名称);
    • <name>描述变量。_为清晰起见,此部分可能包含一个或多个;
    • <type>是变量的类型,例如tlstrint...

    所以你的变量名会更好,\c_impish_grey_color_hue_str等等。

相关内容