问题集模板 - 向我解释一下这个序言?

问题集模板 - 向我解释一下这个序言?

有人能给我解释一下下面的序言吗?这是我的助教为帮助我们排版作业而制作的问题集模板中复制粘贴的……我真的很想了解它是如何工作的。最让我困惑的是第 5-6 行;为什么需要定义一个新的 TeX 宏。在 LaTeX 文档中通常需要这样做吗?

\setlength{\parindent}{0pt}
\setlength{\parskip}{5pt plus 1pt} 
\pagestyle{empty}

\def\indented#1{\list{}{}\item[]}
\let\indented=\endlist

\newcounter{questionCounter}
\newcounter{partCounter}[questionCounter]
\newenvironment{question}[2][\arabic{questionCounter}]{%
  \setcounter{partCounter}{0}%
  \vspace{.25in} \hrule \vspace{0.5em}%
  \noindent{\bf #2}%
  \vspace{0.8em} \hrule \vspace{.10in}%
  \addtocounter{questionCounter}{1}%
}{}
\renewenvironment{part}[1][\alph{partCounter}]{%
  \addtocounter{partCounter}{1}%
  \vspace{.10in}%
  \begin{indented}%
    {\bf (#1)} %
}{\end{indented}}

答案1

@egreg 的回答提供了纠正代码的方法,并引入了一些改进。请将此答案视为对原始(错误)代码仍可编译的解释。TeX 遵循的事件顺序是

  1. \def\indented#1{\list{}{}\item[]}

    这定义了宏(不是环境)以接受一个参数。由于它在扩展中未使用,因此将被丢弃。例如,仅使用上面的代码(并删除第 6 行(在 [2] 中给出),在使用时\indented会发生吞噬。something\indented{something}

  2. \let\indented=\endlist

    \indented这将重写上面 [1] 中的定义,使得 [1] 变得毫无用处。

  3. \begin{indented} ... \end{indented}

    \indented由于此时宏不是未定义的(或已定义的)——无论其定义多么毫无意义,都会\begin{indented}被扩展为\indented,即\endlist,完成时没有问题。我很困惑为什么 TeX 在尝试扩展未定义的时不会产生错误。然而,这可能是将开始定义为结束(如 [2] 中所示)可能会解决环境不匹配的开始和结束的\endindented情况。\<myenv>\end<myenv><myenv>

  4. 最后,由于indented环境实际上从未被正式定义为任何东西,因此从可见输出的角度来看它并不意味着什么。

答案2

第 6 行应为

\let\endindented\endlist

这两行只是稍微更有效的说法

\newenvironment{indented}
  {\begin{list}{}{}\item[]}
  {\end{list}}

当你这样做时,\newenvironment{xyz}你实际上是在定义两个命令:\xyz和,当 LaTeX 找到和\endxyz时,它们(连同其他命令)会被执行。你的 TA 只是在炫耀。:)\begin{xyz}\end{xyz}

这很神秘,为什么的定义question没有说

\refstepcounter{questionCounter}

而不是\addtocounter{questionCounter}{1},从而抑制了说的可能性\label{a-question},以便稍后引用问题。这也是很神秘的,为什么不定义

\renewenvironment{part}[1][\alph{partCounter}]
  {\refstepcounter{partCounter}%
   \vspace{.10in}%
   \begin{list}{}{}\item[]\textbf{(#1)} }
  {\end{list}}

不需要辅助环境indented

重新定义\part似乎也不是一个好主意。

答案3

作为对 egreg 答案的补充:代码行

\newenvironment{indented}
  {\begin{list}{}{}\item[]}
  {\end{list}}

(经 egreg 修订)将indented环境定义为单项列表(并发出必要的\item命令)。这样,新环境的间距参数将符合和等列表的间距参数itemizeenumerate(LaTeX 标准类使用相同的技巧来定义quote环境。)

相关内容