我正在 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:nn
。e
代表expanded
,这意味着它将首先扩张被比较的字符串,然后对它们进行比较。
关于你的编码风格的一些挑剔之处:
确实如此
\str_const:Nn \l_greyColorHue_str {greyHue}
,但名称\l_greyColorHue_str
表示的是l
局部变量。常量应该命名为\c_...
。更一般地,中的变量
expl3
应该命名为\<scope>_<module>_<name>_<type>
,其中:<scope>
是l
ocal、g
lobal 或c
onstant;<module>
就像一个名称空间(例如你的包的名称);<name>
描述变量。_
为清晰起见,此部分可能包含一个或多个;<type>
是变量的类型,例如tl
或str
或int
...
所以你的变量名会更好,
\c_impish_grey_color_hue_str
等等。