创建条件样式主题

创建条件样式主题

另一位 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无效。

相关内容