重新定义命令 {\

重新定义命令 {\

我对重新定义命令有疑问\<

\documentclass{article}  
  \renewcommand{\<}{\left\langle\!\left\langle}
 \renewcommand{\>}{\right\rangle\!\right\rangle}
  \begin{document}
 $\< qs \> $
\end{document}

编译提示我 dvi 文件没有问题。有人知道吗?

  Running `LaTeX' on `tot' with ``latex  -interaction=nonstopmode "\input" tot.tex''
 This is pdfTeX, Version 3.1415926-1.40.10 (TeX Live 2009/Debian)
 entering extended mode
 LaTeX2e <2009/09/24>
 Babel <v3.8l> and hyphenation patterns for english, usenglishmax,    dumylang, nohyphenation, french, basque, loaded.
  (./tot.tex (/usr/share/texmf-texlive/tex/latex/base/article.cls
  Document Class: article 2007/10/19 v1.4h Standard LaTeX document class
  (/usr/share/texmf-texlive/tex/latex/base/size10.clo))

  ! LaTeX Error: \<undefined.

  See the LaTeX manual or LaTeX Companion for explanation.
  Type  H <return>  for immediate help.
  ...                                              

 l.3  \renewcommand{\<}
                  {\left\langle\!\left\langle}
  (./tot.aux) [1] (./tot.aux) )
  (see the transcript file for additional information)
  Output written on tot.dvi (1 page, 336 bytes).
  Transcript written on tot.log.

  LaTeX exited abnormally with code 1 at Tue Sep 24 14:59:35

答案1

\<未预定义。

\documentclass{article}  
\newcommand{\<}{\left\langle\!\left\langle}
\renewcommand{\>}{\right\rangle\!\right\rangle}
\begin{document}
 $\< qs \> $
\end{document}

注意:\>在 LaTeX2e 中预定义为数学跳过。

答案2

我认为您已经找到了 LaTeX 的一个错误。

错误信息应该是

! LaTeX Error: \< undefined.

如果您使用带有字母的普通命令名称,则会得到一个空格。

\renewcommand\wibble{aaa}

生产

! LaTeX Error: \wibble undefined.

有趣的是,LaTeX 2.09 做对了这一点,但我们在保存一些标记时破坏了它。

目前的定义是

\def\renew@command#1{%
  \begingroup \escapechar\m@ne\xdef\@gtempa{{\string#1}}\endgroup
  \expandafter\@ifundefined\@gtempa
     {\@latex@error{\noexpand#1undefined}\@ehc}%
     \relax
  \let\@ifdefinable\@rc@ifdefinable
  \new@command#1}

它应该是

\def\renew@command#1{%
  \begingroup \escapechar\m@ne\xdef\@gtempa{{\string#1}}\endgroup
  \expandafter\@ifundefined\@gtempa
     {\@latex@error{\string#1 undefined}\@ehc}%
     \relax
  \let\@ifdefinable\@rc@ifdefinable
  \new@command#1}

如今,可能人们都负担得起额外一个字节的内存。

LaTeX2.09定义没有这个问题:

\def\renewcommand#1{\edef\@tempa{\expandafter\@cdr\string
  #1\@nil}\@ifundefined{\@tempa}{\@latexerr{\string#1\space undefined}\@ehc
    }{}\@ifnextchar [{\@reargdef#1}{\@reargdef#1[0]}}

但它确实存在另一个无法重新定义的问题\@tempa

%    Reorganised slightly so that |\renewcommand{\reserved@a}[1]{foo}|
%    works.  I am not sure this is worth it, as a following
%    |\newcommand| would over-write the definition of |\reserved@a|.
%    
%    Recall that \LaTeX2.09 goes into an infinite loop with
%    |\renewcommand[1]{\@tempa}{foo}| (DPC 6 October 93).
%

随后删除空格的更改似乎值得怀疑

% \changes{LaTeX2e}{1993/11/23}{Macro reimplemented and extended}
% \changes{v1.1f}{1994/05/2}{Removed surplus \cs{space} in error}
%    \begin{macrocode}

答案3

线索就在错误消息中:

! LaTeX Error: \<undefined.

您不能使用\renewcommand未定义的命令。

\<仅在环境中定义tabbing。因此您需要使用\newcommand而不是\renewcommand。但是,如果您使用tabbing(或使用tabbing在其定义中使用 的任何代码),则会遇到问题。

相关内容