披露:我使用 LaTeX 已经很多年了,但是对于更高级的宏方面我还是个初学者。
\hrule
对于我的一个 latex 文档的特定 hack,我想覆盖我正在使用的包提供的命令中的使用。具体来说,我想重新定义\hrule
为不执行任何操作,执行包的命令,然后恢复\hrule
到其先前的定义。
因此我想做类似这样的事:
\let\hruleold\hrule
\def\hrule(#1)(#2)(#3){}
\packagespecficcommand
\let\hrule\hruleold
这给了我错误:
! Use of \hrule doesn't match its definition.
实现这一目标的正确方法是什么?
-- 编辑 1 (更具体的错误) --
我按照赫伯特的建议尝试了以下方法:
\let\hruleold\hrule
\def\hrule(#1)(#2)(#3){#1,#2,#3}
\maketitle
\let\hrule\hruleold
这给了我这个错误
! Use of \hrule doesn't match its definition.
\@packagespecficcommand...skip -\topskip \fi \hrule \@height
0.35mm\noindent \advance \...
答案1
正如评论中所建议的那样,这里必然会发生各种错误。hrule
即使当 let 为 时\relax
,仍会将其参数留在流中。例如,\textunderscore
宏只接受一个width
参数(高度默认为 TeX 默认值),而在其他地方它甚至可能有其他参数,例如\hfill
在 的定义中
\hrulefill
。请参见下面的示例。
\documentclass{article}
\makeatletter
\def\hrulefill{\leavevmode\leaders\hrule\hfill\kern\z@}
\DeclareTextCommandDefault{\textunderscore}{%
\leavevmode \kern.06em\vbox{\hrule\@width.3em}}
\begin{document}
\let\hrule\relax
a\textunderscore b
\end{document}
\@width
如果您知道它们,最好将其参数设置为 0pt 等, 并且可能在一个组内完成所有这些操作。
答案2
你确实不想这么做。
首先,正如评论中指出的那样,\hrule
不接受{}
或()
分隔参数,其次,如果你重新定义,\hrule
你不仅会改变文档中显式的行为\hrule
(顺便说一句,这不是正确的 LaTeX 语法),而且还会改变(并且很可能破坏)内部使用的每个 latex 命令的行为\hrule
。这些至少包括 \vspace
\hrulefill
\textunderscore
\textvisiblespace
\frame
\framebox
\fbox
\hline
\cline
\oval
\footnoterule
如果我将所有依赖的命令和环境都包括在内,\vspace
列表就会更长。