另一位 tex 用户帮助我找到以下解决方案,以便在颜色样式之间切换:
\newcommand{\jackclass@definetheme}[2]{\@namedef{jack@theme@#1}{#2}}
\newcommand{\usetheme}[1]{\@nameuse{jack@theme@#1}}
\jackclass@definetheme{colour-theme-formal}{%
\definecolor{soft}{gray}{0.75}%
\definecolor{glow}{RGB}{001,176,236}%
\definecolor{canvas}{RGB}{200,100,100}%
\definecolor{prime}{RGB}{255,100,100}%
}
\jackclass@definetheme{colour-theme-vibrant}{%
\definecolor{soft}{gray}{0.75}%
\definecolor{glow}{RGB}{001,176,236}%
\definecolor{canvas}{RGB}{255,100,100}%
\definecolor{prime}{RGB}{255,100,100}%
}
现在,我可以在文档中使用\usetheme{colour-theme-vibrant}
或\usetheme{colour-theme-formal}
切换颜色主题。例如,一个页面可以采用蓝色主题,而另一个页面可以采用红色主题。
这对于颜色来说非常有用。
现在的问题是:我怎样才能实现相同的功能,但不仅仅是设置颜色?让我们说一下:
\newcommand{\jackclass@definestyle}[2]{\@namedef{#1}{#2}}
\newcommand{\usestyle}[1]{\@nameuse{jack@style@#1}}
\jackclass@definestyle{style-theme-formal}{
\newcommand{\highlight}[1]
{\setulcolor{red}\ul{#1}}
}
\jackclass@definestyle{style-theme-vibrant}{
\newcommand{\highlight}[1]
{\bfseries{\color{blue} #1}}
}
这样我就可以通过更改样式在下划线文本和粗体打印之间切换\usestyle{style-theme-vibrant}
。这可能是完全错误的做法(并且不起作用)。我正在尝试创建自己的简单类,允许交换颜色主题(作为第一部分)和交换样式(如最后一部分)。
如果我尝试上面的代码,我会得到Illegal parameter number in definition of \colour-theme-formal.
任何帮助或建议都将不胜感激。
答案1
首先,如果您想中途切换,您可能需要使用\renewcommand
而不是 ,\newcommand
以避免由于重新定义而导致的错误\highlight
。
其次,您收到的错误是由于嵌套参数的工作方式造成的。要修复它,请使用##1
:
\newcommand{\jackclass@definestyle}[2]{\@namedef{jack@style@#1}{#2}}
\newcommand{\usestyle}[1]{\@nameuse{jack@style@#1}}
\newcommand{\highlight}[1]% DEFAULT
{\setulcolor{red}\ul{#1}}
\jackclass@definestyle{style-theme-formal}{
\renewcommand{\highlight}[1]
{\setulcolor{red}\ul{##1}}
}
\jackclass@definestyle{style-theme-vibrant}{
\renewcommand{\highlight}[1]
{\bfseries{\color{blue} ##1}}
}
#1
不起作用的原因是,当您在另一个命令的定义中定义一个命令时,您需要消除所引用的参数的歧义,例如:
\newcommand{\outercmd}[1]{
\newcommand{\innercmd}[1]{
\textcolor{#1}{##1}
}
}
调用\outercmd{blue}
将定义\innercmd{arg}
重写为\textcolor{blue}{arg}
。位置参数前面添加的数目#
表示参数引用在嵌套定义堆栈中属于哪个参数列表。
在您的情况下,嵌套定义是间接的,因为您传递的第二个参数\jackclass@definestyle
是\namedef
伪装的命令定义。
jack@style@
最后,您忘记在调用中添加前缀\namedef
,\jackclass@definestyle
导致\nameuse
调用\usestyle
无效。