我需要一个默认为斜体的引号环境,但我尝试定义一个新的环境时出现错误

我需要一个默认为斜体的引号环境,但我尝试定义一个新的环境时出现错误

这不能编译,但我不明白为什么:

\newenvironment{italicquote}{%
  \begin{quotation}\textit{%
}{%
  }\end{quotation}
}

答案1

您遇到的问题是您的括号不正确匹配。如果我们重新排列内容以显示括号的位置,您将得到以下结果:

\newenvironment{italicquote}
{%
  \begin{quotation}\textit{%
                          }
  {%
  }
  \end{quotation}
}

哎呀,只给出了两个参数,\newenvironment而不是三个。这就是它无法编译的原因。

那么我们该如何解决这个问题呢?有两个选择:

一是可以使用\bgroup和,\egroup这为我们提供了一种将不匹配的括号放入定义中的机制。这使得您的环境定义变成:

\newenvironment{italicquote}{%
  \begin{quotation}\textit\bgroup
}{%
  \egroup\end{quotation}
}

另一个选择是使用\NewDocumentEnvironment¹ 而不是\newenvironment to define the environment. With this, we can use the+b argument specifier to pass the entirety of theitalicquote environment as an argument. The+ indicates that we should allow it to have paragraphs in it. When we use+b we usually leave the definition of the\end` 命令空,因为一切都可以在开始时完成:

\NewDocumentEnvironment{italicquote}{ +b }{%
  \begin{quotation}
    \textit{#1}
  \end{quotation}
}{}

这确实有一个限制,因为我们将环境的内容作为参数,我们不能拥有,例如,\verb在环境内部,虽然我们也不能用我们的第一个版本来做到这一点,因为\verb会被传递给参数\textit

那么,如果我们想让环境能够包含\verb其中²,该怎么办呢?然后我们可以使用\itshape³来选择斜体形状。由于环境是成组的,因此\itshape环境结束时会自行消失。这给了我们一个清晰的定义:

\NewDocumentEnvironment{italicquote}{}{%
  \begin{quotation}\itshape
}{%
  \end{quotation}%
}

不过我对此还是不太满意。毕竟,这italicquote实际上不是一个语义标记概念,我可能更愿意将所有quotation环境都用斜体表示。

我们可以重新定义quotation(如果你看过我的其他回答,你会看到一些关于如何做到这一点的检查),但更好的方法是使用 LaTeX 的钩子机制。我们可以使用钩子env/quotation/begin添加\itshape命令来格式化环境主体。这看起来像:

\AddToHook{env/quotation/begin}{\itshape}

我们将所有quotation环境都排版成斜体。


  1. 一般而言,我们应该更喜欢\NewDocumentEnvironmentover \newenvironmentand \NewDocumentCommandover \newcommand

  2. 或者其他一些改变 catcode 的命令。我不确定这个+b东西是否会坏掉,例如\url。我想我可以试试,但已经很晚了,我真的应该睡觉而不是写这个。

  3. \textit{…本质上与…}相同,在字体更改的末尾添加斜体更正。除了语义不同之外,输出是相同的。{\itshape\/}\/

相关内容