请考虑以下第 82 页的代码清单TikZ & PGF 3.0.1a 版手册:
\def\lecture#1#2#3#4#5#6{
\node [annotation, #3, scale=0.65, text width=4cm, inner sep=2mm] at (#4) {
Lecture #1: \textcolor{orange}{\textbf{#2}}
\list{--}{\topsep=2pt\itemsep=0pt\parsep=0pt
\parskip=0pt\labelwidth=8pt\leftmargin=8pt
\itemindent=0pt\labelsep=2pt}
#5
\endlist
};
}
该清单使用了一对命令:\list
和\endlist
。该\list
命令接受两个参数:{--}
和{\topset...=2pt}
。
该\list
命令未在 TikZ 手册的索引中列出,也没有在 Knuth 的索引中列出TeX 书或 Lamport 的乳胶。
此命令属于哪个系统/包?
它的语法是什么?
它的语义是什么?
答案1
上述代码对于初学者来说并不是特别有指导意义,应该附上说明性说明。
它利用了两个事实:
由于 的设置, 的主参数中的代码
\node
在 中执行,这形成了一个 (TeX) 组;\parbox
text width
这样的代码
\begin{env}...\end{env}
本质上等同于\begingroup <some bookkeeping> \env ... \endenv <some bookkeeping> \endgroup
在这种情况下,簿记是无关紧要的,因为整个施工都是在 提供的组中进行的\parbox
。
\list...\endlist
切勿在野外使用,因为不进行记账几乎肯定会产生不利影响。
从老师的角度来看,代码最好是
\newcommand{\lecture}[6]{%
\node [annotation, #3, scale=0.65, text width=4cm, inner sep=2mm] at (#4) {
Lecture #1: \textcolor{orange}{\textbf{#2}}
\begin{list}{--}{%
\setlength{\topsep}{2pt}%
\setlength{\itemsep}{0pt}%
\setlength{\parsep}{0pt}%
\setlength{\parskip}{0pt}%
\setlength{\labelwidth}{8pt}%
\setlength{\leftmargin}{8pt}%
\setlength{\itemindent}{0pt}%
\setlength{\labelsep}{2pt}%
}%
#5
\end{list}
};
}
诸如此类的优化需要经验,实际上收获并不大。
更好的是,可以这样做
\newenvironment{lecturelist}
{\begin{list}{--}{%
\setlength{\topsep}{2pt}%
\setlength{\itemsep}{0pt}%
\setlength{\parsep}{0pt}%
\setlength{\parskip}{0pt}%
\setlength{\labelwidth}{8pt}%
\setlength{\leftmargin}{8pt}%
\setlength{\itemindent}{0pt}%
\setlength{\labelsep}{2pt}%
}%
{\end{list}}
进而
\newcommand{\lecture}[6]{%
\node [annotation, #3, scale=0.65, text width=4cm, inner sep=2mm] at (#4) {
Lecture #1: \textcolor{orange}{\textbf{#2}}
\begin{lecturelist}
#5
\end{lecturelist}
};
}
在 的代码中,lecturelist
最好将\begin{list}
和\end{list}
分别改为\list
和:记账将由和\endlist
负责,因此无需在内部完成。如果未能正确关闭包,它还会提供更好的错误消息。\begin{lecturelist}
\end{lecturelist}
lecturelist