这不能编译,但我不明白为什么:
\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 the
italicquote 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
环境都排版成斜体。
一般而言,我们应该更喜欢
\NewDocumentEnvironment
over\newenvironment
and\NewDocumentCommand
over\newcommand
。或者其他一些改变 catcode 的命令。我不确定这个
+b
东西是否会坏掉,例如\url
。我想我可以试试,但已经很晚了,我真的应该睡觉而不是写这个。\textit{
…本质上与…}
相同,在字体更改的末尾添加斜体更正。除了语义不同之外,输出是相同的。{\itshape
\/}
\/