重新定义 \hrule 不执行任何操作

重新定义 \hrule 不执行任何操作

披露:我使用 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列表就会更长。

相关内容