摘自 texmf-dist/tex/latex/xcolor/xcolor.sty

摘自 texmf-dist/tex/latex/xcolor/xcolor.sty

紧接着\NeedsTeXFormat{LaTeX2e} in v1.0i这个xcolor包,有很多有趣的类别代码。这些代码为什么在这里?它们起什么作用?

摘自 texmf-dist/tex/latex/xcolor/xcolor.sty

版本 2016,v.1.0i

\expandafter\edef\csname XC@catcodes\endcsname
 {\catcode33 \the\catcode33 % !
  \catcode34 \the\catcode34 % "
  \catcode39 \the\catcode39 % '
  \catcode42 \the\catcode42 % *
  \catcode44 \the\catcode44 % ,
  \catcode45 \the\catcode45 % -
  \catcode46 \the\catcode46 % .
  \catcode47 \the\catcode47 % /
  \catcode58 \the\catcode58 % :
  \catcode59 \the\catcode59 % ;
  \catcode60 \the\catcode60 % <
  \catcode61 \the\catcode61 % =
  \catcode62 \the\catcode62 % >
  \catcode63 \the\catcode63 % ?
  \catcode64 \the\catcode64 % @
  \catcode94 \the\catcode94 % ^
  \catcode96 \the\catcode96 % `
  \catcode`\noexpand\^^A\the\catcode`\^^A\relax}
\catcode64 11 %
\@makeother\! \@makeother\" \@makeother\' \@makeother\* \@makeother\,
\@makeother\- \@makeother\. \@makeother\/ \@makeother\: \@makeother\;
\@makeother\< \@makeother\= \@makeother\> \@makeother\? \@makeother\`
\catcode94 7 %
\catcode`\^^A=14 %
\edef\XC@@{\expandafter\noexpand\csname\string\XC@@\endcsname}

后来也

\begingroup
\catcode`\!=13 \catcode`\:=13 \catcode`\-=13 \catcode`\+=13
\catcode`\;=13 \catcode`\/=13 \catcode`\"=13 \catcode`\>=13
\gdef\XC@edef#1#2%
 {\begingroup
  \ifnum\catcode`\!=13 \edef!{\string!}\fi
  \ifnum\catcode`\:=13 \edef:{\string:}\fi
  \ifnum\catcode`\-=13 \edef-{\string-}\fi
  \ifnum\catcode`\+=13 \edef+{\string+}\fi
  \ifnum\catcode`\;=13 \edef;{\string;}\fi
  \ifnum\catcode`\"=13 \edef"{\string"}\fi
  \ifnum\catcode`\>=13 \edef>{\string>}\fi
  \edef#1{#2}\@onelevel@sanitize#1\aftergroupdef#1#1}
\gdef\XC@mdef#1#2%
 {\begingroup
  \ifnum\catcode`\/=13 \edef/{\string/}\fi
  \ifnum\catcode`\:=13 \edef:{\string:}\fi
  \edef#1{#2}\@onelevel@sanitize#1\aftergroupdef#1#1}
\endgroup

答案1

\XC@catcodes是一个数组,用于在宏执行时保存一些类别代码,以便能够恢复它们。

因此,在标准设置下,替换文本将以

\catcode33 12

!因为(ASCII 33)的标准类别代码是 12。但是,如果babel-french生效,我们会得到\catcode33 13

最后一行值得一提。doc用于打印dtx文件中包含的文档的包将^^A(ASCII 1) 变成注释字符,因此更复杂的

\catcode`\noexpand\^^A

\catcode 1 \the\catcode1被使用。然而,如果像前面的条目那样做会容易得多。

实际上,正如你所看到的,这个包更改类别代码以便在宏的替换文本中拥有具有所需类别的字符标记。

它有什么\XC@edef用?它是 的软件包版本\edef,但有一些变化。

还记得babel-french上面提到的吗?!颜色规范的语法中用到了。因此\color{red!50}必须独立于的类别代码工作!

这是通过\XC@edef对参数执行操作来解决的;宏打开一个组并重新定义活动的!以产生\string!因此,当\edef最终执行时,替换文本将包含!类别代码为 12 的,以传递以解析颜色规范。

相关内容