也有人问过类似的问题,但没有一个能回答我的具体问题。
我试图在报告中声明一个与该环境类似的新环境abstract
。我查看了代码report.cls
并找到了该环境的定义abstract
:
\if@titlepage
\newenvironment{abstract}{%
\titlepage
\null\vfil
\@beginparpenalty\@lowpenalty
\begin{center}%
\bfseries \abstractname
\@endparpenalty\@M
\end{center}}%
{\par\vfil\null\endtitlepage}
\else
\newenvironment{abstract}{%
\if@twocolumn
\section*{\abstractname}%
\else
\small
\begin{center}%
{\bfseries \abstractname\vspace{-.5em}\vspace{\z@}}%
\end{center}%
\quotation
\fi}
{\if@twocolumn\else\endquotation\fi}
\fi
test
在我的文档中,我以相同的方式声明了环境,并按照我将使用的方式使用它abstract
:
\documentclass[]{report}
\newcommand\testname{Test}
\newenvironment{test}{%
\small
\begin{center}%
{\bfseries \testname\vspace{-.5em}\vspace{\z@}}%
\end{center}%
\quotation}
{\endquotation}
\begin{document}
\begin{test}
Test
\end{test}
\end{document}
这会导致以下错误:
./test.tex:15: Undefined control sequence. [\begin{test}]
./test.tex:15: Missing number, treated as zero. [\begin{test}]
If you can't figure out why I needed to see a number,:15: Illegal unit of measure . [\begin{test}]
我知道问题出在这里,\z@
但我不明白为什么以及如何解决这个问题。
答案1
由于定义涉及@
字符(类别代码为12
),因此需要将其括在 之中\makeatletter
,在定义期间\makeatother
将其类别代码更改为,定义结束后再改回 :11
12
\documentclass[]{report}
\newcommand\testname{Test}
\makeatletter
\newenvironment{test}{%
\small
\begin{center}%
{\bfseries \testname\vspace{-.5em}\vspace{\z@}}%
\end{center}%
\quotation}
{\endquotation}
\makeatother
\begin{document}
\begin{test}
Test
\end{test}
\end{document}
如果\z@
您使用0pt
,则不需要\makeatletter
,\makeatother
:
\documentclass[]{report}
\newcommand\testname{Test}
\newenvironment{test}{%
\small
\begin{center}%
{\bfseries \testname\vspace{-.5em}\vspace{0pt}}%
\end{center}%
\quotation}
{\endquotation}
\begin{document}
\begin{test}
Test
\end{test}
\end{document}
然而,更简单的方法是:
\documentclass[]{report}
\newcommand\testname{Test}
\newenvironment{test}
{\renewcommand\abstractname{\testname}\begin{abstract}}
{\end{abstract}}
\begin{document}
\begin{test}
Test
\end{test}
\end{document}