我有一个一般性问题,到目前为止我还没能解决。这个问题是几天前我试图重新定义scrlayer-scrpage
包裹(对我来说这个问题仍然没有解决)。
但我想从总体上理解它。到目前为止,我已经阅读了很多(基本)文档(source2e、scrlayer-scrpage.dtx 等),但仍然无法弄清楚:
在某些命令/环境定义中,会出现名称开头没有反斜杠的“元素”。例如元素even
,left
以及来自 的命令foot
定义:\lefoot
scrlayer-scrpage
$ latexdef -p scrlayer-scrpage -f lefoot
\lefoot first defined in "scrlayer-scrpage.sty".
\lefoot:
macro:->\sls@renewelement {even}{left}{foot}
labelitem
或环境一般定义中的元素(花括号内,第一个单词) itemize
:
$ latexdef -f itemize
\itemize is defined by (La)TeX.
\itemize:
macro:->\ifnum \@itemdepth >\thr@@ \@toodeep \else \advance \@itemdepth \@ne
\edef \@itemitem {labelitem\romannumeral \the \@itemdepth }\expandafter \list
\csname \@itemitem \endcsname {\def \makelabel ##1{\hss \llap {##1}}}\fi
我怎样才能知道它们的含义/它们是如何定义的?到目前为止,我还没有真正的线索。
我知道答案可能非常简单,但现在我很茫然......
感谢所有回复!
答案1
inlabelitem
实际上\itemize
只是一串字符。从latex.ltx
你找到
\def\itemize{%
\ifnum \@itemdepth >\thr@@\@toodeep\else
\advance\@itemdepth\@ne
\edef\@itemitem{labelitem\romannumeral\the\@itemdepth}%
\expandafter
\list
\csname\@itemitem\endcsname
{\def\makelabel##1{\hss\llap{##1}}}%
\fi}
该行将\edef\@itemitem{labelitem\romannumeral\the\@itemdepth}
宏设置\@itemitem
为采用字符串的值labelitem
,后跟表示列表当前“深度”的小写罗马数字。因此,如果有一个嵌套列表,并且第二级是itemize
,则\@itemdepth
等于 2,在这种情况下,该行变为\edef\@itemitem{labelitemii}
。换句话说,宏\@itemitem
被定义为字符串labelitemii
。
现在,这本身并不是那么有用,但如果你扫描几行,你会发现它发出在我们的示例中\csname\@itemitem\endcsname
扩展为的问题\csname labelitemii\endcsname
,这相当于调用\labelitemii
(这是的目的\csname ... \endcsname
)。
这是一个如何构建的示例变量名在 TeX 中以编程方式(在许多其他编程语言中,类似的操作也许可以通过使用“数组”或“字典”来处理,而这些概念在 TeX 中是不存在的)。
功能\sls@renewelement{even}{left}{foot}
类似;基本上它使\lefoot{SOMETHING}
等于\sls@renewelement{even}{left}{foot}{SOMETHING}
,并且 的定义\sls@renewelement{A}{B}{C}{SOMETHING}
构建一个内部变量/宏,其名称包含字符串A
、B
和C
(更准确地说,在 的情况下,\lefoot
您获得一个名为 的宏\sls@ps@scrheadings@even@left@foot
)并将其设置为 等于SOMETHING
。