命令定义中不带反斜杠的“元素”的功能

命令定义中不带反斜杠的“元素”的功能

我有一个一般性问题,到目前为止我还没能解决。这个问题是几天前我试图重新定义scrlayer-scrpage包裹(对我来说这个问题仍然没有解决)。

但我想从总体上理解它。到目前为止,我已经阅读了很多(基本)文档(source2e、scrlayer-scrpage.dtx 等),但仍然无法弄清楚:

在某些命令/环境定义中,会出现名称开头没有反斜杠的“元素”。例如元素evenleft以及来自 的命令foot定义:\lefootscrlayer-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}构建一个内部变量/宏,其名称包含字符串ABC(更准确地说,在 的情况下,\lefoot您获得一个名为 的宏\sls@ps@scrheadings@even@left@foot)并将其设置为 等于SOMETHING

相关内容