紧接着\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 的,以传递以解析颜色规范。